From b9b4ed0a90eede9c408119f27ee9a8500704860f Mon Sep 17 00:00:00 2001 From: Matthias Schaub Date: Sat, 18 Jan 2025 08:44:08 +1300 Subject: [PATCH 1/5] build: update pytest and add pytest-asyncio pytest-asyncio is a well-maintained library by the pytest team to add asyncio support for pytest --- poetry.lock | 34 ++++++++++++++++++++++++++-------- pyproject.toml | 4 +++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index cae00d089..57375d330 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1474,13 +1474,13 @@ certifi = "*" [[package]] name = "pytest" -version = "7.4.4" +version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] @@ -1488,11 +1488,29 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.25.2" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, + {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, +] + +[package.dependencies] +pytest = ">=8.2,<9" [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-cov" @@ -2150,4 +2168,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "1e0dae8aedea1d37eed68299069e9f99e3951f5c9ed42cd8e0e010ce6ad3952b" +content-hash = "919183006eea15c1ad3e9eb045feb7cff8189c354604f21f98ce90a74d1d7111" diff --git a/pyproject.toml b/pyproject.toml index 3309ac9a3..26555f75e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,6 @@ approvaltests = "^12.1.0" [tool.poetry.dev-dependencies] pre-commit = "^3.2.1" -pytest = "^7.2.2" pytest-cov = "^4.0.0" pytest-mock = "^3.11.1" @@ -58,6 +57,8 @@ pytest-mock = "^3.11.1" [tool.poetry.group.dev.dependencies] ruff = "^0.7.3" +pytest = "^8.3.4" +pytest-asyncio = "^0.25.2" [build-system] requires = ["poetry-core"] @@ -83,3 +84,4 @@ select = [ [tool.pytest.ini_options] testpaths = ["tests"] filterwarnings = ["ignore::DeprecationWarning"] +asyncio_default_fixture_loop_scope = "function" From 623ac3d3c84d2d972b9ee02e46fc093df3c41af3 Mon Sep 17 00:00:00 2001 From: Matthias Schaub Date: Sat, 18 Jan 2025 08:59:33 +1300 Subject: [PATCH 2/5] feat(trino): add trino HTTP client --- ohsome_quality_api/trino/client.py | 143 ++++++ .../integrationtests/trino/highways-count.sql | 15 + tests/integrationtests/trino/highways.sql | 15 + .../trino/test_fetch_highways | 450 ++++++++++++++++++ .../integrationtests/trino/test_fetch_version | 220 +++++++++ .../trino/test_query_catalog_not_found | 115 +++++ .../trino/test_query_missing_catalog_name | 115 +++++ .../trino/test_query_missing_schema_name | 115 +++++ .../trino/test_query_syntax_error | 84 ++++ .../integrationtests/trino/test_query_version | 40 ++ .../trino/test_trino_client.py | 96 ++++ ...ino_client.test_fetch_version.approved.txt | 1 + ....test_query_catalog_not_found.approved.txt | 1 + ...st_query_missing_catalog_name.approved.txt | 1 + ...est_query_missing_schema_name.approved.txt | 1 + ...lient.test_query_syntax_error.approved.txt | 1 + 16 files changed, 1413 insertions(+) create mode 100644 ohsome_quality_api/trino/client.py create mode 100644 tests/integrationtests/trino/highways-count.sql create mode 100644 tests/integrationtests/trino/highways.sql create mode 100644 tests/integrationtests/trino/test_fetch_highways create mode 100644 tests/integrationtests/trino/test_fetch_version create mode 100644 tests/integrationtests/trino/test_query_catalog_not_found create mode 100644 tests/integrationtests/trino/test_query_missing_catalog_name create mode 100644 tests/integrationtests/trino/test_query_missing_schema_name create mode 100644 tests/integrationtests/trino/test_query_syntax_error create mode 100644 tests/integrationtests/trino/test_query_version create mode 100644 tests/integrationtests/trino/test_trino_client.py create mode 100644 tests/integrationtests/trino/test_trino_client.test_fetch_version.approved.txt create mode 100644 tests/integrationtests/trino/test_trino_client.test_query_catalog_not_found.approved.txt create mode 100644 tests/integrationtests/trino/test_trino_client.test_query_missing_catalog_name.approved.txt create mode 100644 tests/integrationtests/trino/test_trino_client.test_query_missing_schema_name.approved.txt create mode 100644 tests/integrationtests/trino/test_trino_client.test_query_syntax_error.approved.txt diff --git a/ohsome_quality_api/trino/client.py b/ohsome_quality_api/trino/client.py new file mode 100644 index 000000000..079ab07f3 --- /dev/null +++ b/ohsome_quality_api/trino/client.py @@ -0,0 +1,143 @@ +import asyncio +import random + +import httpx +from pydantic import BaseModel, ConfigDict, field_validator + +from ohsome_quality_api.utils.helper import snake_to_lower_camel + +# class TrinoQuery: +# self._query_id: Optional[str] = None +# self._stats: Dict[Any, Any] = {} +# self._info_uri: Optional[str] = None +# self._warnings: List[Dict[Any, Any]] = [] +# self._columns: Optional[List[str]] = None +# self._finished = False +# self._cancelled = False +# self._request = request +# self._update_type = None +# self._update_count = None +# self._next_uri = None +# self._query = query +# self._result: Optional[TrinoResult] = None +# self._legacy_primitive_types = legacy_primitive_types +# self._row_mapper: Optional[RowMapper] = None +# self._fetch_mode = fetch_mode + + +TRINO_HOST = "127.0.0.1" +TRINO_PORT = 8084 +TRINO_USER = "mschaub" + +URL = f"http://{TRINO_HOST}:{TRINO_PORT}/v1/statement" + +HEADERS = { + "X-Trino-User": TRINO_USER, +} + +AUTH = None + + +class TrinoError(Exception): + pass + + +class TrinoTimeoutError(Exception): + pass + + +class BaseConfig(BaseModel): + model_config = ConfigDict( + alias_generator=snake_to_lower_camel, + frozen=True, + ) + + +class QueryError(BaseConfig): + message: str + error_code: int + error_name: str + error_type: str + failure_info: dict + error_location: dict[str, int] | None = None + + +class QueryResults(BaseConfig): + id: str + next_uri: str | None = None + columns: list | None = None + data: list | None = None + error: QueryError | None = None + + @field_validator("error") + @classmethod + def check_error(cls, value: QueryError) -> str: + if value is not None: + raise TrinoError(f"{value.error_name}: {value.message}") + else: + return value + + +async def query(sql) -> QueryResults: + async with httpx.AsyncClient() as client: + response = await client.post( + url=URL, + content=sql.encode("utf-8"), + headers=HEADERS, + ) + response.raise_for_status() + results = QueryResults.model_validate(response.json()) + return results + + +async def raise_for_status(response): + # TODO: If the client request returns an HTTP 502, 503, or 504, that means + # there was an intermittent problem processing request and the client + # should try again in 50-100 ms. + + # TODO: Additionally, if the request returns a 429 status code, the client should retry the request using the Retry-After header value provided. + + # TODO: Any HTTP status other than 502, 503, 504 or 200 means that query processing has failed. + pass + + +# TODO: user of fetch() should be able to define a timeout instead wait+attempts. +# A possible solution is to start with very low wait times between attempts and +# scale exponentially for each failure +# TODO: Do we need backoffs and jitter? +# TODO: What is the optimal polling frequency? +async def fetch( + results: QueryResults, + wait: int = 1, + attempts: int = 10, + _attempt: int = 0, + _data: tuple = tuple(), +) -> tuple: + """Fetch all data of a query.""" + # TODO: use one client instance for the eitre fetching/polling + # intervall + async with httpx.AsyncClient() as client: + response = await client.get( + url=results.next_uri, + headers=HEADERS, + ) + response.raise_for_status() + results = QueryResults.model_validate(response.json()) + + if results.data is not None: + _data = _data + tuple(results.data) + + if results.next_uri is None: + return _data + + elif results.next_uri is not None and _attempt <= attempts: + # incremental backoff + jitter + await asyncio.sleep(wait + _attempt + random.random()) + return await fetch(results, _attempt=_attempt + 1, _data=_data) + else: + async with httpx.AsyncClient() as client: + response = await client.delete( + url=results.next_uri, + headers=HEADERS, + ) + raise TrinoTimeoutError() diff --git a/tests/integrationtests/trino/highways-count.sql b/tests/integrationtests/trino/highways-count.sql new file mode 100644 index 000000000..bc9915ee4 --- /dev/null +++ b/tests/integrationtests/trino/highways-count.sql @@ -0,0 +1,15 @@ +SELECT + count(osm_id) +FROM + sotm2024_iceberg.geo_sort.contributions +WHERE + status = 'latest' + AND element_at (tags, 'highway') IS NOT NULL + AND tags['highway'] IN ('motorway', 'trunk', 'motorway_link', + 'trunk_link', 'primary', 'primary_link', 'secondary', + 'secondary_link', 'tertiary', 'tertiary_link', 'unclassified', + 'residential') + AND (bbox.xmax >= 8.629761 + AND bbox.xmin <= 8.742371) + AND (bbox.ymax >= 49.379556 + AND bbox.ymin <= 49.437890) diff --git a/tests/integrationtests/trino/highways.sql b/tests/integrationtests/trino/highways.sql new file mode 100644 index 000000000..d3faa5fab --- /dev/null +++ b/tests/integrationtests/trino/highways.sql @@ -0,0 +1,15 @@ +SELECT + osm_id +FROM + sotm2024_iceberg.geo_sort.contributions +WHERE + status = 'latest' + AND element_at (tags, 'highway') IS NOT NULL + AND tags['highway'] IN ('motorway', 'trunk', 'motorway_link', + 'trunk_link', 'primary', 'primary_link', 'secondary', + 'secondary_link', 'tertiary', 'tertiary_link', 'unclassified', + 'residential') + AND (bbox.xmax >= 8.629761 + AND bbox.xmin <= 8.742371) + AND (bbox.ymax >= 49.379556 + AND bbox.ymin <= 49.437890) diff --git a/tests/integrationtests/trino/test_fetch_highways b/tests/integrationtests/trino/test_fetch_highways new file mode 100644 index 000000000..9edb05fe3 --- /dev/null +++ b/tests/integrationtests/trino/test_fetch_highways @@ -0,0 +1,450 @@ +interactions: +- request: + body: "SELECT\n osm_id\nFROM\n sotm2024_iceberg.geo_sort.contributions\nWHERE\n + \ status = 'latest'\n AND element_at (tags, 'highway') IS NOT NULL\n AND + tags['highway'] IN ('motorway', 'trunk', 'motorway_link',\n\t'trunk_link', 'primary', + 'primary_link', 'secondary',\n\t'secondary_link', 'tertiary', 'tertiary_link', + 'unclassified',\n\t'residential')\n AND (bbox.xmax >= 8.629761\n AND + bbox.xmin <= 8.742371)\n AND (bbox.ymax >= 49.379556\n AND bbox.ymin + <= 49.437890)\n" + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '479' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195819_00520_3gijq/ye93d694fecd4a76a8c8b149ace8d0e1182a043f6/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:19 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195819_00520_3gijq/ye93d694fecd4a76a8c8b149ace8d0e1182a043f6/1 + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195819_00520_3gijq/y5369550386f4b5c50d7be963a5fa7930ac21950c/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":1,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '325' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:20 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195819_00520_3gijq/y5369550386f4b5c50d7be963a5fa7930ac21950c/2 + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/y9abad048e9f72639b1756a60a1687716ad86f1f4/0","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":2268,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '335' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:22 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/y9abad048e9f72639b1756a60a1687716ad86f1f4/0 + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","partialCancelUri":"http://127.0.0.1:8084/v1/statement/executing/partialCancel/20250117_195819_00520_3gijq/0/y1db66c29c3c039689b731753b7ee14067a4d2517/1","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/y1db66c29c3c039689b731753b7ee14067a4d2517/1","columns":[{"name":"osm_id","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"stats":{"state":"RUNNING","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"queuedTimeMillis":1,"elapsedTimeMillis":4268,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":70249,"spilledBytes":0,"rootStage":{"stageId":"0","state":"RUNNING","done":false,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '547' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:24 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/y1db66c29c3c039689b731753b7ee14067a4d2517/1 + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/ybb1ed5e2bfee50fdff37d2b0f4925f1327d926bc/2","columns":[{"name":"osm_id","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"data":[["way/97953638"],["way/27638583"],["way/37669021"],["way/44499779"],["way/44499781"],["way/61479079"],["way/61479092"],["way/145468315"],["way/145468733"],["way/274708990"],["way/274708997"],["way/274709011"],["way/294852500"],["way/313026383"],["way/400711537"],["way/422955653"],["way/524073764"],["way/638657806"],["way/638657807"],["way/1025152074"],["way/1025152075"],["way/1025152076"],["way/1025152077"],["way/1025152078"],["way/4059057"],["way/61479075"],["way/79057055"],["way/294407229"],["way/294407230"],["way/436828209"],["way/24915825"],["way/27385474"],["way/27385475"],["way/27638581"],["way/30120826"],["way/34079307"],["way/48588658"],["way/48740711"],["way/99080251"],["way/99080519"],["way/99185956"],["way/99185963"],["way/99185964"],["way/121674706"],["way/121674711"],["way/121674713"],["way/134677670"],["way/145470311"],["way/145470352"],["way/225923027"],["way/225923028"],["way/294852502"],["way/303995836"],["way/303995837"],["way/303996418"],["way/400711535"],["way/400711536"],["way/1025152073"],["way/4084010"],["way/24808957"],["way/24808958"],["way/24808959"],["way/24915824"],["way/24915827"],["way/24916255"],["way/24968890"],["way/25297210"],["way/25297211"],["way/27638577"],["way/61479038"],["way/274708989"],["way/294407209"],["way/294407210"],["way/24968885"],["way/24968886"],["way/24968887"],["way/24968889"],["way/24968891"],["way/53747680"],["way/274708962"],["way/810070514"],["way/1291556420"],["way/24916256"],["way/24970845"],["way/24970849"],["way/24970851"],["way/24970875"],["way/24970891"],["way/99185962"],["way/104231666"],["way/104231678"],["way/1067095418"],["way/24970869"],["way/156194367"],["way/863816630"],["way/1075753299"],["way/1291556419"],["way/372602113"],["way/39784254"],["way/372602112"],["way/109096910"],["way/24212797"],["way/25058683"],["way/39703186"],["way/134240698"],["way/165806699"],["way/253242037"],["way/253242038"],["way/253242042"],["way/253242043"],["way/253242044"],["way/253242045"],["way/253242046"],["way/253242047"],["way/253242048"],["way/253242049"],["way/253242050"],["way/253242051"],["way/253242052"],["way/253246199"],["way/304093738"],["way/345839394"],["way/807121665"],["way/807121667"],["way/907649526"],["way/907649527"],["way/934976768"],["way/1094752266"],["way/1164648998"],["way/9349925"],["way/24928319"],["way/108947342"],["way/1070944380"],["way/24928320"],["way/25128651"],["way/67415411"],["way/67415413"],["way/109096915"],["way/155219831"],["way/155219832"],["way/246248012"],["way/246248014"],["way/246248016"],["way/246248018"],["way/246712150"],["way/253246189"],["way/257466470"],["way/393010363"],["way/849188312"],["way/874090506"],["way/874090507"],["way/901288735"],["way/1290056276"],["way/1290056277"],["way/76844713"],["way/135548609"],["way/155219835"],["way/253246187"],["way/253246193"],["way/253246197"],["way/253246198"],["way/392680888"],["way/404799371"],["way/796383905"],["way/1284190242"],["way/1303553014"],["way/8604405"],["way/24252900"],["way/41182872"],["way/111114200"],["way/121672140"],["way/121672190"],["way/155219836"],["way/190276392"],["way/236845316"],["way/236845318"],["way/253246176"],["way/253246190"],["way/253246191"],["way/253246192"],["way/253246194"],["way/253246195"],["way/253246196"],["way/353433160"],["way/417491558"],["way/417491572"],["way/417491589"],["way/1104434578"],["way/1104436914"],["way/1137828396"],["way/1168198495"],["way/1242185772"],["way/1303720584"],["way/404799372"],["way/236058530"],["way/566136410"],["way/76844690"],["way/135548606"],["way/135548614"],["way/231715382"],["way/384766597"],["way/199682371"],["way/465280324"],["way/787291607"],["way/949951883"],["way/1051799137"],["way/1051799139"],["way/208730892"],["way/231715389"],["way/787291600"],["way/787291601"],["way/787291608"],["way/866975487"],["way/949951880"],["way/949951881"],["way/949951882"],["way/1152295832"],["way/1219558883"],["way/1219558884"],["way/76844686"],["way/80277569"],["way/80277584"],["way/97417576"],["way/123222077"],["way/135548605"],["way/135548617"],["way/182881235"],["way/311477425"],["way/372943890"],["way/400539715"],["way/499671455"],["way/711863509"],["way/720899550"],["way/796383904"],["way/1072276972"],["way/1072276973"],["way/1270441501"],["way/24223732"],["way/24252899"],["way/25015932"],["way/25015933"],["way/25039128"],["way/25039353"],["way/33093821"],["way/33093831"],["way/33093833"],["way/43377804"],["way/164767022"],["way/168617861"],["way/182932159"],["way/190276393"],["way/204334500"],["way/204334502"],["way/229409968"],["way/236832541"],["way/400539713"],["way/400539714"],["way/637562049"],["way/664783368"],["way/664783378"],["way/713462675"],["way/813216802"],["way/1021431491"],["way/1021431494"],["way/1033861836"],["way/1069933533"],["way/24294748"],["way/24294749"],["way/24294750"],["way/26113743"],["way/27936476"],["way/33093824"],["way/155060908"],["way/155060909"],["way/155060910"],["way/155062795"],["way/231715388"],["way/400539712"],["way/506462728"],["way/664783356"],["way/664783357"],["way/800395106"],["way/800395107"],["way/866975478"],["way/866975479"],["way/866975480"],["way/866975481"],["way/866975483"],["way/866975484"],["way/866975486"],["way/998147488"],["way/998147489"],["way/998147490"],["way/1192049170"],["way/1192049174"],["way/1272903617"],["way/1272903618"],["way/1272903619"],["way/1272903620"],["way/1272903621"],["way/25015934"],["way/25039131"],["way/25039133"],["way/25039134"],["way/25039349"],["way/25039350"],["way/25039351"],["way/28910829"],["way/60741673"],["way/60741678"],["way/102515287"],["way/133845943"],["way/168617857"],["way/168617858"],["way/168617865"],["way/177562931"],["way/194487038"],["way/227036114"],["way/228088195"],["way/229361268"],["way/229361287"],["way/230738188"],["way/230738189"],["way/231972179"],["way/231972181"],["way/231972202"],["way/231972203"],["way/249453182"],["way/249453183"],["way/258826741"],["way/279553452"],["way/282152437"],["way/411275961"],["way/411275963"],["way/508160781"],["way/612152589"],["way/624646864"],["way/638201814"],["way/708024005"],["way/721164928"],["way/721164929"],["way/722916169"],["way/723890575"],["way/724107562"],["way/788197404"],["way/816478073"],["way/999665845"],["way/999665846"],["way/1030916969"],["way/1099800136"],["way/1284598281"],["way/24294753"],["way/24841431"],["way/24841432"],["way/25128657"],["way/25128658"],["way/25128659"],["way/25128663"],["way/33092627"],["way/150549942"],["way/150549943"],["way/150549945"],["way/155219833"],["way/229409972"],["way/249342758"],["way/257559745"],["way/417491633"],["way/655777976"],["way/655777977"],["way/904701059"],["way/938564961"],["way/1066082739"],["way/1205938136"],["way/1270350498"],["way/32570190"],["way/67367838"],["way/34333672"],["way/42723395"],["way/50345415"],["way/100305858"],["way/197028680"],["way/227759227"],["way/244565455"],["way/245325599"],["way/245327869"],["way/245331967"],["way/245332160"],["way/245332248"],["way/938446416"],["way/1289712372"],["way/1289712380"],["way/1289712385"],["way/1299260085"],["way/24231889"],["way/24252890"],["way/24252898"],["way/24745090"],["way/25015929"],["way/25015931"],["way/25039672"],["way/33092625"],["way/43126311"],["way/134375555"],["way/149813185"],["way/199696908"],["way/245328886"],["way/245329066"],["way/417491544"],["way/417491652"],["way/720664749"],["way/938446421"],["way/938564957"],["way/938564979"],["way/1099800140"],["way/1099800141"],["way/1099800142"],["way/1099800143"],["way/43126313"],["way/4379788"],["way/24048871"],["way/24224506"],["way/24231897"],["way/24231906"],["way/25039670"],["way/27614580"],["way/32570191"],["way/43126312"],["way/43126315"],["way/50345414"],["way/50365401"],["way/50365402"],["way/52009654"],["way/52009655"],["way/52011690"],["way/53247705"],["way/79368601"],["way/79368604"],["way/94504194"],["way/99556787"],["way/99556794"],["way/106078207"],["way/117430884"],["way/121672172"],["way/121672177"],["way/121672179"],["way/180280958"],["way/197028674"],["way/197028677"],["way/197028681"],["way/199695418"],["way/222965344"],["way/222965347"],["way/222965348"],["way/226062443"],["way/245327867"],["way/245328059"],["way/245328552"],["way/907338503"],["way/908451315"],["way/938446415"],["way/938446417"],["way/938446419"],["way/938446420"],["way/938446422"],["way/938564952"],["way/938564953"],["way/952708683"],["way/1069934229"],["way/1150690742"],["way/1150690743"],["way/1289712347"],["way/258562283"],["way/51528073"],["way/188768359"],["way/258562284"],["way/277263996"],["way/24745094"],["way/24841419"],["way/24224507"],["way/24745095"],["way/25917442"],["way/30272618"],["way/32913379"],["way/39529997"],["way/42723393"],["way/43091753"],["way/50028256"],["way/121908285"],["way/121908286"],["way/174703492"],["way/199230546"],["way/392689545"],["way/870286222"],["way/8604379"],["way/24901269"],["way/25129818"],["way/25168012"],["way/38861537"],["way/39800001"],["way/62286153"],["way/93785378"],["way/168617856"],["way/182767888"],["way/182932158"],["way/204334499"],["way/204334501"],["way/205146907"],["way/207778370"],["way/242679562"],["way/253470309"],["way/637714640"],["way/901990781"],["way/938564951"],["way/1099696081"],["way/1099696082"],["way/1099696084"],["way/1299373433"],["way/24224504"],["way/34386120"],["way/62286151"],["way/62286152"],["way/117430883"],["way/166547864"],["way/23747424"],["way/24223729"],["way/25039346"],["way/25039347"],["way/25039352"],["way/25040145"],["way/28910828"],["way/33170077"],["way/40148453"],["way/41212163"],["way/41212164"],["way/68165235"],["way/93785387"],["way/93785454"],["way/121208794"],["way/121208795"],["way/133520583"],["way/133520587"],["way/174071740"],["way/174071741"],["way/174071742"],["way/182767887"],["way/194487040"],["way/231972180"],["way/232635026"],["way/242679549"],["way/242679557"],["way/242679558"],["way/242679559"],["way/242679561"],["way/242679563"],["way/242679565"],["way/242679566"],["way/244286204"],["way/245330300"],["way/258826740"],["way/279554828"],["way/314062342"],["way/664783311"],["way/664783315"],["way/669356060"],["way/669356073"],["way/669376360"],["way/722722889"],["way/1002641846"],["way/1010641184"],["way/1082958234"],["way/1138272700"],["way/24841548"],["way/24841550"],["way/28171940"],["way/33057892"],["way/93785407"],["way/133520581"],["way/133520590"],["way/242679538"],["way/244287984"],["way/279432377"],["way/279432378"],["way/340569174"],["way/638201816"],["way/22978248"],["way/28473949"],["way/30488940"],["way/30488942"],["way/32570193"],["way/35010599"],["way/50028257"],["way/1071968662"],["way/27342469"],["way/34386125"],["way/286823147"],["way/485683296"],["way/918161795"],["way/49809253"],["way/49809254"],["way/1133271405"],["way/156193325"],["way/361109945"],["way/467414011"],["way/4084008"],["way/24820539"],["way/110308463"],["way/253470290"],["way/253470292"],["way/375677877"],["way/24970889"],["way/863816627"],["way/107236135"],["way/107236141"],["way/156194372"],["way/156194373"],["way/156194374"],["way/176355550"],["way/268515379"],["way/24968687"],["way/24968688"],["way/24968691"],["way/24968692"],["way/24970887"],["way/156193338"],["way/156194368"],["way/560690396"],["way/1279193561"],["way/1301633501"],["way/4084941"],["way/24794025"],["way/24816059"],["way/24820540"],["way/24834193"],["way/24834194"],["way/24902949"],["way/24902950"],["way/24988322"],["way/24988324"],["way/24988325"],["way/25304144"],["way/25304145"],["way/26112003"],["way/26112028"],["way/26112030"],["way/30120181"],["way/30120182"],["way/30120695"],["way/30121072"],["way/33093826"],["way/48966381"],["way/61651761"],["way/79190169"],["way/79190170"],["way/79190171"],["way/155055408"],["way/155055409"],["way/155055415"],["way/155055447"],["way/155060902"],["way/155060903"],["way/155060904"],["way/155060905"],["way/156193341"],["way/194539367"],["way/227036113"],["way/242515855"],["way/242515856"],["way/242515858"],["way/253470294"],["way/253470296"],["way/253470298"],["way/253470299"],["way/253470300"],["way/253470301"],["way/253470302"],["way/253470326"],["way/272503322"],["way/276209401"],["way/282619573"],["way/282619575"],["way/282619577"],["way/282804102"],["way/322683662"],["way/322683663"],["way/322683664"],["way/322683665"],["way/322683666"],["way/375676635"],["way/376865252"],["way/376865320"],["way/393061642"],["way/409707574"],["way/652234477"],["way/652234478"],["way/652234479"],["way/659305973"],["way/855584791"],["way/938763800"],["way/1026171526"],["way/1185791190"],["way/1282786950"],["way/1282786951"],["way/1284598235"],["way/1285666888"],["way/1301633493"],["way/24834161"],["way/24834162"],["way/24834165"],["way/24834171"],["way/33057411"],["way/33057413"],["way/33171091"],["way/33171093"],["way/33171097"],["way/33171373"],["way/96258582"],["way/150894375"],["way/152548384"],["way/152548387"],["way/152548395"],["way/155061702"],["way/155061709"],["way/155061714"],["way/155202180"],["way/158685128"],["way/160687234"],["way/188863356"],["way/188863357"],["way/188863358"],["way/188863359"],["way/203535626"],["way/228088193"],["way/229409965"],["way/263352608"],["way/294416956"],["way/294416958"],["way/367142230"],["way/376865251"],["way/376865253"],["way/661279635"],["way/682165329"],["way/682165330"],["way/708024004"],["way/903441463"],["way/1049678714"],["way/1049678715"],["way/1204762026"],["way/1207703238"],["way/1207703239"],["way/4084802"],["way/24887995"],["way/30121026"],["way/121208040"],["way/155055407"],["way/155058411"],["way/253470289"],["way/253470291"],["way/253470293"],["way/253470295"],["way/253470297"],["way/253470310"],["way/253470311"],["way/253470312"],["way/253470313"],["way/253470314"],["way/253470315"],["way/253470316"],["way/253470317"],["way/253470318"],["way/253470320"],["way/253470322"],["way/253470324"],["way/1031496145"],["way/1286925438"],["way/1286925439"],["way/24271761"],["way/24808949"],["way/24816049"],["way/24816052"],["way/24816054"],["way/24816056"],["way/24816058"],["way/24834169"],["way/24868389"],["way/24868390"],["way/24868393"],["way/24868394"],["way/50702355"],["way/50702358"],["way/50702359"],["way/50702360"],["way/50702361"],["way/50702362"],["way/50702363"],["way/52040563"],["way/121207435"],["way/121207838"],["way/121207839"],["way/155055435"],["way/155055446"],["way/229361270"],["way/253470303"],["way/253470305"],["way/253470306"],["way/253470307"],["way/253470308"],["way/253470319"],["way/253470321"],["way/253470323"],["way/253470325"],["way/294407227"],["way/972263337"],["way/988959799"],["way/1031661401"],["way/1031661403"],["way/1299862807"],["way/174659402"],["way/1303478321"],["way/28899566"],["way/25813138"],["way/26006145"],["way/28890543"],["way/28899565"],["way/28900977"],["way/150549950"],["way/440464151"],["way/772029885"],["way/772029886"],["way/772029887"],["way/1278757313"],["way/25240444"],["way/373911208"],["way/999612990"],["way/999612992"],["way/1285667925"],["way/24272223"],["way/24798194"],["way/25157568"],["way/25157570"],["way/25157571"],["way/25157572"],["way/25157574"],["way/25240443"],["way/25813942"],["way/28910052"],["way/28910054"],["way/28910055"],["way/28910830"],["way/28910831"],["way/155055410"],["way/155055432"],["way/294407211"],["way/294407213"],["way/294407214"],["way/294407224"],["way/294407225"],["way/294407226"],["way/294416957"],["way/394992017"],["way/394992018"],["way/394992019"],["way/394992020"],["way/394992021"],["way/394992022"],["way/394992024"],["way/394992025"],["way/394992026"],["way/394994859"],["way/515755750"],["way/622579723"],["way/932097066"],["way/1031915576"],["way/1068801535"],["way/1068801536"],["way/1124370120"],["way/1124785795"],["way/1267370448"],["way/1303709289"],["way/25814478"],["way/25815332"],["way/25815333"],["way/155055423"],["way/294407217"],["way/294407218"],["way/647642607"],["way/932097063"],["way/1124370975"],["way/26769214"],["way/26841068"],["way/28910059"],["way/33057893"],["way/33171102"],["way/53738852"],["way/53738855"],["way/62234091"],["way/96258573"],["way/155202179"],["way/155202181"],["way/155203311"],["way/155204824"],["way/155204830"],["way/225895736"],["way/225895738"],["way/242679567"],["way/456129125"],["way/550642703"],["way/559381609"],["way/682165331"],["way/682165332"],["way/1059036921"],["way/1065569212"],["way/8604376"],["way/24635986"],["way/25040137"],["way/25974116"],["way/26840684"],["way/27120517"],["way/27620753"],["way/60741682"],["way/60741687"],["way/62234094"],["way/93785359"],["way/93785402"],["way/93785412"],["way/93785479"],["way/155203304"],["way/165747011"],["way/175904319"],["way/199518462"],["way/242679550"],["way/243245695"],["way/243245696"],["way/243245697"],["way/243245698"],["way/243245700"],["way/244287986"],["way/244769710"],["way/258826316"],["way/279432380"],["way/279432381"],["way/372778876"],["way/411275962"],["way/411275964"],["way/456126992"],["way/622579691"],["way/724510546"],["way/816222983"],["way/816222989"],["way/27619496"],["way/27619497"],["way/39502290"],["way/52875636"],["way/155063250"],["way/253470304"],["way/579623140"],["way/579623141"],["way/1068801588"],["way/1152295884"],["way/1164158303"],["way/1187527547"],["way/1187527548"],["way/26332270"],["way/26332318"],["way/35842576"],["way/155063251"],["way/155203313"],["way/244769289"],["way/375675622"],["way/417500147"],["way/417500157"],["way/417782533"],["way/534193133"],["way/534193134"],["way/1068801665"],["way/24048872"],["way/24635973"],["way/24635974"],["way/24635975"],["way/24635976"],["way/24635977"],["way/25040130"],["way/25040131"],["way/25040133"],["way/25974113"],["way/25974115"],["way/26816187"],["way/27120516"],["way/27189695"],["way/28910825"],["way/33058422"],["way/37813567"],["way/38886301"],["way/41216624"],["way/69607432"],["way/124068012"],["way/124068013"],["way/124068016"],["way/124068020"],["way/124068021"],["way/124068022"],["way/124068024"],["way/155203511"],["way/155204827"],["way/194471183"],["way/199512403"],["way/225895735"],["way/243245699"],["way/244769711"],["way/381757190"],["way/411574098"],["way/597192343"],["way/724510548"],["way/737300556"],["way/737300557"],["way/1012259106"],["way/1071958003"],["way/1083321801"],["way/1214480803"],["way/1289712455"],["way/133616222"],["way/155055414"],["way/189054378"],["way/406169573"],["way/411268908"],["way/411268912"],["way/22978251"],["way/22978252"],["way/26332691"],["way/28910578"],["way/32825224"],["way/32825225"],["way/38886298"],["way/38886300"],["way/39500198"],["way/42440422"],["way/52040565"],["way/83188869"],["way/83188871"],["way/83188874"],["way/84908658"],["way/84908671"],["way/106467293"],["way/106467299"],["way/127991580"],["way/132613359"],["way/133433682"],["way/155204300"],["way/155204820"],["way/199512395"],["way/199512401"],["way/202162593"],["way/229773122"],["way/277455058"],["way/349289015"],["way/387641151"],["way/597192344"],["way/688861928"],["way/1030916968"],["way/1080554589"],["way/1080751266"],["way/1083321804"],["way/1119200039"],["way/1119200040"],["way/1303244790"],["way/14193663"],["way/14193664"],["way/83188867"],["way/83188868"],["way/83188872"],["way/95554187"],["way/133616223"],["way/191212309"],["way/411268913"],["way/1049342047"],["way/1059038255"],["way/1080555817"],["way/5209248"],["way/11942798"],["way/24794046"],["way/25815326"],["way/26072523"],["way/26072524"],["way/26841966"],["way/26841967"],["way/49077230"],["way/394992023"],["way/596760204"],["way/697719732"],["way/845689915"],["way/866712785"],["way/1124368750"],["way/1124796863"],["way/1267370441"],["way/1267370442"],["way/1267370444"],["way/1267370447"],["way/1281130623"],["way/24644347"],["way/24644348"],["way/42811785"],["way/513631692"],["way/845689914"],["way/847555751"],["way/24644353"],["way/25806377"],["way/25815325"],["way/26072517"],["way/26072519"],["way/26842229"],["way/321842506"],["way/1085167915"],["way/1123962750"],["way/24644354"],["way/25325396"],["way/26072515"],["way/26842232"],["way/29089892"],["way/40012679"],["way/223120647"],["way/932097064"],["way/1026216147"],["way/1026216148"],["way/1026216149"],["way/1026216150"],["way/1124367086"],["way/24644351"],["way/24828117"],["way/24839110"],["way/27205501"],["way/28890961"],["way/28891705"],["way/28891706"],["way/28891707"],["way/28899572"],["way/28899573"],["way/30810231"],["way/39035878"],["way/39500196"],["way/39500197"],["way/39500199"],["way/39595007"],["way/48163929"],["way/61513843"],["way/62003993"],["way/62293930"],["way/67367831"],["way/67367839"],["way/79509565"],["way/79509566"],["way/79509567"],["way/79569936"],["way/154942463"],["way/155204831"],["way/155204833"],["way/166514523"],["way/166514524"],["way/188439354"],["way/188439356"],["way/194539363"],["way/199510759"],["way/253983074"],["way/254010814"],["way/254010816"],["way/254017729"],["way/362593646"],["way/522802487"],["way/534193127"],["way/680785375"],["way/712541459"],["way/783931397"],["way/1030916967"],["way/1080751263"],["way/1083321806"],["way/1185407754"],["way/1185407755"],["way/1267370451"],["way/28890903"],["way/14194533"],["way/14194535"],["way/28890901"],["way/28890904"],["way/28899575"],["way/28901238"],["way/29453403"],["way/30119504"],["way/30755795"],["way/30809978"],["way/38098360"],["way/167014594"],["way/194539371"],["way/218816889"],["way/218816890"],["way/218816894"],["way/218816909"],["way/254010811"],["way/254010812"],["way/254010815"],["way/849360190"],["way/1041606837"],["way/1187528264"],["way/1278757290"],["way/11942887"],["way/24469672"],["way/24573005"],["way/24573007"],["way/26841510"],["way/28890081"],["way/28891216"],["way/28891217"],["way/28891218"],["way/28901220"],["way/49870847"],["way/49872945"],["way/57357728"],["way/60711320"],["way/80262119"],["way/150375572"],["way/154937897"],["way/155055411"],["way/166514518"],["way/265869072"],["way/265869073"],["way/319620061"],["way/407505924"],["way/524044727"],["way/995237340"],["way/1286235879"],["way/1286235881"],["way/1286235882"],["way/26936056"],["way/159981539"],["way/14488245"],["way/48735919"],["way/193141894"],["way/4059060"],["way/14488244"],["way/24559584"],["way/24559586"],["way/24559588"],["way/24559590"],["way/47362571"],["way/48735920"],["way/132932279"],["way/143862035"],["way/143862046"],["way/193141900"],["way/193141901"],["way/193141902"],["way/193141903"],["way/294416955"],["way/537388245"],["way/44108870"],["way/193141899"],["way/70036764"],["way/193141897"],["way/193141898"],["way/537386901"],["way/4084004"],["way/4084006"],["way/37669024"],["way/61479042"],["way/143862036"],["way/537386902"],["way/1074492491"],["way/1074492494"],["way/24816726"],["way/24816728"],["way/24816729"],["way/156202491"],["way/353533951"],["way/400711541"],["way/24915814"],["way/24915815"],["way/24915819"],["way/24971915"],["way/30120827"],["way/99185958"],["way/121674712"],["way/274708955"],["way/303997946"],["way/303997947"],["way/309858372"],["way/313026279"],["way/313026280"],["way/313026281"],["way/375699171"],["way/437937074"],["way/437937075"],["way/893598645"],["way/1092910523"],["way/1271966536"],["way/1271966537"],["way/1271966538"],["way/1271966539"],["way/1271966540"],["way/24516724"],["way/24971896"],["way/99078476"],["way/99078500"],["way/375699170"],["way/375699172"],["way/400711538"],["way/400711539"],["way/459536366"],["way/459536367"],["way/1074492492"],["way/24504008"],["way/24516725"],["way/24971902"],["way/24971903"],["way/24971917"],["way/24972239"],["way/24972514"],["way/24972515"],["way/225923029"],["way/1130701774"],["way/1140187463"],["way/24837411"],["way/24854404"],["way/24887186"],["way/24915818"],["way/108047446"],["way/274708951"],["way/437933714"],["way/347967968"],["way/863816629"],["way/24854402"],["way/24854403"],["way/24887187"],["way/24887188"],["way/24915564"],["way/24971904"],["way/33056649"],["way/265331966"],["way/274708950"],["way/274709009"],["way/309858359"],["way/309858360"],["way/309858371"],["way/688894993"],["way/24259810"],["way/24803756"],["way/24803757"],["way/98435098"],["way/98435101"],["way/156202489"],["way/459534864"],["way/459536365"],["way/1121651931"],["way/24824491"],["way/24837410"],["way/30121019"],["way/30121020"],["way/33056650"],["way/244087359"],["way/1074492493"],["way/1205203226"],["way/24824492"],["way/130767476"],["way/24854264"],["way/24854265"],["way/30121021"],["way/225923020"],["way/309858374"],["way/1121651932"],["way/1134449516"],["way/1204832813"],["way/1204832818"],["way/1204832819"],["way/24239597"],["way/24516801"],["way/24608059"],["way/32917588"],["way/225923030"],["way/363800010"],["way/363800011"],["way/543257452"],["way/1074177092"],["way/1074177093"],["way/1204908135"],["way/1205055771"],["way/24272224"],["way/24239595"],["way/24516799"],["way/24639518"],["way/25157609"],["way/25157610"],["way/127090765"],["way/156202482"],["way/156202486"],["way/1204905867"],["way/49771549"],["way/1248150183"],["way/24662869"],["way/85386957"],["way/85386979"],["way/85386982"],["way/374081769"],["way/400711540"],["way/438744008"],["way/1074492489"],["way/27370042"],["way/38613388"],["way/97539979"],["way/322328924"],["way/38534528"],["way/38534529"],["way/115650825"],["way/174659400"],["way/322328582"],["way/322328735"],["way/322328736"],["way/322328737"],["way/322328923"],["way/817998746"],["way/24854400"],["way/24854401"],["way/306704162"],["way/537361185"],["way/24642790"],["way/24837408"],["way/24854266"],["way/24854268"],["way/24854398"],["way/25297905"],["way/127568261"],["way/274708952"],["way/274708954"],["way/318189009"],["way/974699279"],["way/974699280"],["way/1205195675"],["way/1205195676"],["way/24417604"],["way/24417605"],["way/24417606"],["way/201817038"],["way/24662866"],["way/24803653"],["way/24854267"],["way/24854397"],["way/32824636"],["way/52038690"],["way/123555552"],["way/200535837"],["way/200535840"],["way/347967967"],["way/688894995"],["way/1284898963"],["way/1291556418"],["way/24516800"],["way/180530484"],["way/356468216"],["way/543257440"],["way/1075697063"],["way/1181263963"],["way/25297906"],["way/1284898956"],["way/1291556415"],["way/24909772"],["way/24417534"],["way/24417535"],["way/24417537"],["way/24417539"],["way/24663074"],["way/24663075"],["way/24663077"],["way/24663078"],["way/24816721"],["way/24816722"],["way/24817050"],["way/38534878"],["way/38534879"],["way/38534880"],["way/38534881"],["way/38534950"],["way/38613387"],["way/196638399"],["way/347068248"],["way/347068249"],["way/521988005"],["way/1106359697"],["way/1106359698"],["way/24662867"],["way/24803654"],["way/52038691"],["way/115650823"],["way/200535838"],["way/200535841"],["way/200535842"],["way/19165237"],["way/24824482"],["way/38534882"],["way/174659399"],["way/4084881"],["way/171661579"],["way/1248150190"],["way/1302525268"],["way/24828119"],["way/25340617"],["way/25340618"],["way/25340619"],["way/25340629"],["way/156194364"],["way/302765088"],["way/390390631"],["way/390390632"],["way/390390633"],["way/390390634"],["way/450683213"],["way/450683214"],["way/999612988"],["way/999612989"],["way/33171088"],["way/445498547"],["way/893444023"],["way/893444024"],["way/148612595"],["way/484098094"],["way/723084548"],["way/25039121"],["way/25149870"],["way/25149871"],["way/25149873"],["way/25149875"],["way/25149877"],["way/25806374"],["way/25806378"],["way/25814475"],["way/28899568"],["way/28899569"],["way/28900975"],["way/28911816"],["way/49771551"],["way/150549938"],["way/184725322"],["way/236832536"],["way/287891891"],["way/294407219"],["way/429024483"],["way/721931269"],["way/721933838"],["way/721933839"],["way/816821351"],["way/816821352"],["way/902638255"],["way/999668897"],["way/999668898"],["way/1124012348"],["way/1124235506"],["way/1124235507"],["way/1124235508"],["way/24868027"],["way/24970888"],["way/25156120"],["way/25156121"],["way/25156122"],["way/25156124"],["way/25157573"],["way/34126010"],["way/34239128"],["way/36862309"],["way/36862310"],["way/150549946"],["way/154935260"],["way/159626322"],["way/281858706"],["way/294407212"],["way/294407220"],["way/294407221"],["way/294407222"],["way/294407223"],["way/294407231"],["way/294407232"],["way/721931267"],["way/721931268"],["way/721931270"],["way/790851068"],["way/847555752"],["way/849049865"],["way/849049866"],["way/849049868"],["way/849049869"],["way/917885343"],["way/917885344"],["way/1026087571"],["way/1102353718"],["way/1102353719"],["way/25769650"],["way/444462788"],["way/1248083946"],["way/1283273643"],["way/25954928"],["way/28911815"],["way/226673578"],["way/226673579"],["way/999665847"],["way/1248084725"],["way/24970854"],["way/25963414"],["way/34239130"],["way/63549209"],["way/201377173"],["way/373911213"],["way/426961392"],["way/426961393"],["way/513799145"],["way/727623110"],["way/24000938"],["way/24787704"],["way/24923232"],["way/201735697"],["way/923799323"],["way/24828111"],["way/43119559"],["way/43119561"],["way/154938177"],["way/445495953"],["way/1123962749"],["way/1124012285"],["way/1124012286"],["way/1124364562"],["way/1124444517"],["way/1124445203"],["way/4084860"],["way/25325393"],["way/25325397"],["way/155055433"],["way/1026216151"],["way/1026216153"],["way/1124364563"],["way/1124364564"],["way/1124364565"],["way/1124364566"],["way/5147586"],["way/24587272"],["way/24587273"],["way/24644356"],["way/25806382"],["way/40138702"],["way/927865278"],["way/931819743"],["way/931819778"],["way/1124130351"],["way/1124130728"],["way/5047878"],["way/5132863"],["way/24573014"],["way/24587274"],["way/24839407"],["way/24839410"],["way/25325391"],["way/25325392"],["way/28767172"],["way/36186523"],["way/52977975"],["way/54036808"],["way/321842507"],["way/321842508"],["way/870789342"],["way/931819742"],["way/1026216152"],["way/1026216154"],["way/1124130720"],["way/1124130727"],["way/1124445202"],["way/1125223091"],["way/1125248596"],["way/24573008"],["way/24573010"],["way/24573011"],["way/24587267"],["way/24839406"],["way/24839408"],["way/25325395"],["way/50701878"],["way/116408286"],["way/154938448"],["way/154938450"],["way/217330280"],["way/417789760"],["way/693364568"],["way/864113769"],["way/870763753"],["way/1005351265"],["way/1124445168"],["way/1124445170"],["way/1302525269"],["way/24573013"],["way/24587262"],["way/549301231"],["way/5146267"],["way/24587275"],["way/24644357"],["way/27426514"],["way/105079372"],["way/154936588"],["way/221466287"],["way/373911206"],["way/417800965"],["way/429024485"],["way/1026087568"],["way/1026087569"],["way/1026087570"],["way/1092203907"],["way/1124130679"],["way/24340260"],["way/24561764"],["way/24587261"],["way/24587263"],["way/24828115"],["way/25704191"],["way/30673178"],["way/38040875"],["way/40138700"],["way/52977976"],["way/154936584"],["way/172374557"],["way/177228565"],["way/255320620"],["way/429024484"],["way/433122200"],["way/549301218"],["way/849054095"],["way/1077902162"],["way/1147059903"],["way/5123677"],["way/24000940"],["way/24435224"],["way/24587279"],["way/24644359"],["way/24644360"],["way/24825809"],["way/24931358"],["way/24931359"],["way/24931377"],["way/24931380"],["way/24931381"],["way/25805243"],["way/27596951"],["way/30215221"],["way/40509336"],["way/62623901"],["way/154934575"],["way/154934579"],["way/172374552"],["way/194561643"],["way/417800999"],["way/429253288"],["way/429253369"],["way/429253370"],["way/688861923"],["way/688861924"],["way/727623111"],["way/727623112"],["way/727623113"],["way/917885345"],["way/923799324"],["way/1214572003"],["way/24573018"],["way/24587276"],["way/31306149"],["way/31306150"],["way/146978078"],["way/332742925"],["way/1303281802"],["way/1303281803"],["way/1303282047"],["way/1303282418"],["way/24587264"],["way/24587265"],["way/24587260"],["way/24837414"],["way/291792275"],["way/145797324"],["way/26962386"],["way/5132809"],["way/24561967"],["way/5132734"],["way/24752685"],["way/24766590"],["way/24825806"],["way/54741038"],["way/528748645"],["way/1054390932"],["way/1054390933"],["way/1054390934"],["way/1054390935"],["way/1124130680"],["way/24837545"],["way/442398413"],["way/1124130682"],["way/5123672"],["way/5123673"],["way/24000929"],["way/24004765"],["way/24825808"],["way/24825810"],["way/26072510"],["way/27596913"],["way/30215250"],["way/40509334"],["way/154935683"],["way/154935684"],["way/194092278"],["way/194561642"],["way/305482793"],["way/305482794"],["way/305482795"],["way/429253365"],["way/549309442"],["way/769717953"],["way/818000559"],["way/818529479"],["way/999679533"],["way/1147057752"],["way/1204117609"],["way/1204117610"],["way/24000935"],["way/24000937"],["way/24937727"],["way/37783096"],["way/37831084"],["way/42806216"],["way/42806217"],["way/42806218"],["way/52956623"],["way/52956625"],["way/145797141"],["way/194553947"],["way/211656786"],["way/384766596"],["way/1115530967"],["way/1303311181"],["way/5132896"],["way/5132901"],["way/24000919"],["way/24766891"],["way/24770570"],["way/55832293"],["way/56224088"],["way/188213431"],["way/1279873532"],["way/1295696057"],["way/24000934"],["way/24485186"],["way/24686552"],["way/24686553"],["way/194092296"],["way/314062339"],["way/1124130684"],["way/24469671"],["way/24485180"],["way/24587257"],["way/30215356"],["way/30215358"],["way/34100621"],["way/34100622"],["way/194561645"],["way/212143006"],["way/212143007"],["way/30215359"],["way/32723956"],["way/189180881"],["way/212143050"],["way/212143051"],["way/603754023"],["way/24485184"],["way/24485185"],["way/24686533"],["way/367089409"],["way/463451030"],["way/1115522408"],["way/1160431689"],["way/24686534"],["way/24686536"],["way/212143045"],["way/24000922"],["way/24000923"],["way/24000925"],["way/24000931"],["way/24644377"],["way/24644378"],["way/24753231"],["way/24773582"],["way/24774017"],["way/24786919"],["way/24825805"],["way/27426523"],["way/29187134"],["way/42806220"],["way/42806222"],["way/52041179"],["way/154934576"],["way/194553949"],["way/199860310"],["way/199860311"],["way/199860312"],["way/199860313"],["way/199860314"],["way/199860315"],["way/199860316"],["way/234374817"],["way/234374818"],["way/234374819"],["way/234374820"],["way/417800978"],["way/464224946"],["way/464224947"],["way/849051651"],["way/849051652"],["way/849051653"],["way/1054390936"],["way/145796900"],["way/154934577"],["way/1124130683"],["way/157319413"],["way/298205902"],["way/335291904"],["way/41084829"],["way/174703496"],["way/174703493"],["way/179383596"],["way/411268914"],["way/789683302"],["way/27763996"],["way/189054366"],["way/189054367"],["way/258562268"],["way/258562272"],["way/616928299"],["way/22949393"],["way/179383597"],["way/180070491"],["way/189059753"],["way/795438340"],["way/813740898"],["way/857719257"],["way/175444363"],["way/276075249"],["way/25532901"],["way/22949388"],["way/77276206"],["way/147479819"],["way/147479820"],["way/150665830"],["way/617568657"],["way/667104742"],["way/886247605"],["way/30488266"],["way/40740010"],["way/40740011"],["way/999679532"],["way/26989176"],["way/40740619"],["way/336657887"],["way/133616226"],["way/22949378"],["way/22949395"],["way/26989635"],["way/35074191"],["way/179383593"],["way/179383594"],["way/179383595"],["way/179383598"],["way/179552477"],["way/5047850"],["way/24635978"],["way/24635979"],["way/28900617"],["way/30846763"],["way/35010602"],["way/35017902"],["way/49771553"],["way/59227112"],["way/62293940"],["way/65155450"],["way/69283762"],["way/80745640"],["way/88675611"],["way/133431639"],["way/133431640"],["way/133431644"],["way/133431645"],["way/133431654"],["way/133616227"],["way/150549947"],["way/155055412"],["way/180397559"],["way/180397578"],["way/180397579"],["way/180397580"],["way/180397581"],["way/191209778"],["way/222989107"],["way/225895737"],["way/387641152"],["way/411268910"],["way/992421321"],["way/1080556095"],["way/1080556167"],["way/179383591"],["way/226486700"],["way/14326971"],["way/24635980"],["way/24862816"],["way/25153331"],["way/25153334"],["way/29419860"],["way/35010600"],["way/35010601"],["way/39037718"],["way/41082535"],["way/41082537"],["way/87358592"],["way/87358594"],["way/117349165"],["way/133616224"],["way/133616225"],["way/133616229"],["way/133616230"],["way/133616231"],["way/150549939"],["way/150549948"],["way/155222652"],["way/179383611"],["way/179383615"],["way/179552479"],["way/179552481"],["way/253080538"],["way/253080539"],["way/1162571731"],["way/1278757134"],["way/1285668479"],["way/25912833"],["way/25159142"],["way/59355033"],["way/179552476"],["way/807153702"],["way/26989728"],["way/41082536"],["way/59355036"],["way/77277696"],["way/87358586"],["way/226486704"],["way/616366900"],["way/1084388593"],["way/1285668634"],["way/1285668972"],["way/41082534"],["way/184132396"],["way/14195513"],["way/28899693"],["way/160807659"],["way/254010813"],["way/1302700104"],["way/14328812"],["way/14328995"],["way/14328996"],["way/14329101"],["way/24862815"],["way/29339191"],["way/30109918"],["way/33095688"],["way/35593870"],["way/35593872"],["way/37879150"],["way/39502291"],["way/41082533"],["way/44829786"],["way/88660527"],["way/150375577"],["way/171691940"],["way/171691941"],["way/171691943"],["way/193148639"],["way/218816878"],["way/218816885"],["way/218816886"],["way/254010807"],["way/254010810"],["way/312590483"],["way/327392699"],["way/384595990"],["way/800378925"],["way/1165580529"],["way/1278757093"],["way/596760206"],["way/37103038"],["way/37103041"],["way/37565651"],["way/60711642"],["way/584357939"],["way/1281130839"],["way/14329192"],["way/14329194"],["way/31146051"],["way/116412896"],["way/188213434"],["way/284583331"],["way/312569012"],["way/680782777"],["way/24635984"],["way/32438532"],["way/69260624"],["way/253987750"],["way/25112043"],["way/26936066"],["way/30251602"],["way/37103042"],["way/37879151"],["way/55969348"],["way/55969359"],["way/55969361"],["way/56328324"],["way/193148638"],["way/218816881"],["way/218816882"],["way/249526989"],["way/249526990"],["way/253987743"],["way/253987744"],["way/253987746"],["way/253987747"],["way/253987751"],["way/253987752"],["way/253987756"],["way/254010808"],["way/254010809"],["way/385006943"],["way/24635985"],["way/26936068"],["way/30119509"],["way/30251601"],["way/33095928"],["way/33097750"],["way/33171372"],["way/133632021"],["way/133632662"],["way/155222631"],["way/155222635"],["way/253987745"],["way/253987748"],["way/253987749"],["way/253987753"],["way/253987754"],["way/253987755"],["way/253987757"],["way/253987758"],["way/253987759"],["way/253992099"],["way/313056314"],["way/770690985"],["way/817522825"],["way/226486701"],["way/61119318"],["way/253992098"],["way/540861870"],["way/894840179"],["way/27195186"],["way/27408320"],["way/1074814336"],["way/1074814337"],["way/1074814338"],["way/1074814339"],["way/27408313"],["way/27518830"],["way/44632864"],["way/44829673"],["way/155276998"],["way/894851675"],["way/999670682"],["way/27408326"],["way/34132368"],["way/1281130837"],["way/235035973"],["way/258562265"],["way/664642167"],["way/783750001"],["way/35223802"],["way/27102298"],["way/249526988"],["way/779439126"],["way/384958312"],["way/1083446436"],["way/24340262"],["way/27034857"],["way/27034858"],["way/27034859"],["way/27034860"],["way/27034861"],["way/30119503"],["way/39594684"],["way/101039990"],["way/155276368"],["way/253994543"],["way/253994544"],["way/253994545"],["way/313056312"],["way/385006944"],["way/596760207"],["way/770690986"],["way/770705454"],["way/61119315"],["way/155276991"],["way/253992100"],["way/29318873"],["way/1182195494"],["way/27063548"],["way/38110875"],["way/39865030"],["way/155281271"],["way/155281273"],["way/364678379"],["way/1182352421"],["way/24767818"],["way/38908034"],["way/38908035"],["way/116452220"],["way/308609211"],["way/308609212"],["way/24653259"],["way/39865036"],["way/39865039"],["way/308609215"],["way/1149117576"],["way/305688961"],["way/175717077"],["way/175717078"],["way/190276394"],["way/308609217"],["way/903643650"],["way/30215360"],["way/41604718"],["way/44829789"],["way/44829790"],["way/44860717"],["way/136987309"],["way/209354132"],["way/354345642"],["way/817999591"],["way/24717555"],["way/258562274"],["way/186264721"],["way/186264724"],["way/306704163"],["way/191303987"],["way/27602070"],["way/253238790"],["way/37588920"],["way/97483076"],["way/27392739"],["way/4432438"],["way/24891034"],["way/150765934"],["way/4420813"],["way/4426808"],["way/8604383"],["way/5074722"],["way/23747351"],["way/5074021"],["way/30488269"],["way/25157163"],["way/188774784"],["way/113573930"],["way/188774835"],["way/25917410"],["way/226486702"],["way/24931831"],["way/27445964"],["way/27445991"],["way/27485806"],["way/26692419"],["way/27220905"],["way/27535417"],["way/28117067"],["way/537391809"],["way/497600926"],["way/79612504"],["way/47362570"],["way/61479052"],["way/24607853"],["way/240187923"],["way/156193326"],["way/33830324"],["way/188768355"],["way/37685272"],["way/189054375"],["way/258562271"],["way/25815324"],["way/33171089"],["way/155203300"],["way/277455037"],["way/24798195"],["way/155055444"],["way/24559589"],["way/24559591"],["way/27405104"],["way/24417609"],["way/85386985"],["way/155880551"],["way/67386023"],["way/30138170"],["way/24587268"],["way/24837413"],["way/5132818"],["way/5132819"],["way/234374821"],["way/429253281"],["way/194561644"],["way/31146043"],["way/258562273"],["way/155222655"],["way/94482650"],["way/1074814341"],["way/226486703"],["way/277124296"],["way/27602066"],["way/27602084"],["way/27602085"],["way/27602086"],["way/27602850"],["way/27602068"],["way/27602069"],["way/27602848"],["way/27602067"],["way/27602088"],["way/27602847"],["way/27602851"],["way/97720625"],["way/144010811"],["way/253238770"],["way/5030158"],["way/253238794"],["way/400711524"],["way/943602245"],["way/943602246"],["way/943602247"],["way/943602248"],["way/943602249"],["way/531388417"],["way/1264559931"],["way/4280109"],["way/50894461"],["way/93785366"],["way/93785394"],["way/93785460"],["way/93785478"],["way/144010786"],["way/161067289"],["way/161067294"],["way/161067296"],["way/205254558"],["way/241801458"],["way/241801928"],["way/241801929"],["way/241802220"],["way/253238771"],["way/253238772"],["way/253238773"],["way/253238777"],["way/253238778"],["way/253238783"],["way/253238784"],["way/253238786"],["way/253238787"],["way/253238791"],["way/253238792"],["way/400711522"],["way/400711523"],["way/531388416"],["way/24994515"],["way/27602089"],["way/27602852"],["way/322378228"],["way/24931819"],["way/24931823"],["way/1301058359"],["way/27485798"],["way/30491897"],["way/23646355"],["way/24931817"],["way/27445974"],["way/27485801"],["way/27485804"],["way/27485805"],["way/27492913"],["way/27492922"],["way/27492924"],["way/27492925"],["way/30491895"],["way/191911627"],["way/616796764"],["way/37588928"],["way/24224486"],["way/25514944"],["way/93785355"],["way/93785428"],["way/93785445"],["way/93785459"],["way/253238781"],["way/253238793"],["way/24931558"],["way/27220909"],["way/27222702"],["way/27222703"],["way/27222704"],["way/27222706"],["way/27485803"],["way/165807648"],["way/521858673"],["way/24931555"],["way/27220906"],["way/27220907"],["way/27220910"],["way/27222705"],["way/27936365"],["way/566923731"],["way/1073899170"],["way/172510851"],["way/172510852"],["way/366511535"],["way/527264983"],["way/541982452"],["way/24931559"],["way/27392740"],["way/32917433"],["way/366511531"],["way/366511533"],["way/999673804"],["way/366511544"],["way/4280151"],["way/9349932"],["way/31789285"],["way/31791684"],["way/62199889"],["way/76903631"],["way/76911883"],["way/76911885"],["way/76911889"],["way/76911890"],["way/150728381"],["way/150728382"],["way/207971588"],["way/32601508"],["way/76780441"],["way/76780445"],["way/150637581"],["way/150637582"],["way/236832974"],["way/5030159"],["way/8049673"],["way/31773595"],["way/31789282"],["way/32601512"],["way/76780446"],["way/76911875"],["way/76911880"],["way/76911894"],["way/76914225"],["way/76914226"],["way/76914227"],["way/76914228"],["way/76914229"],["way/150637583"],["way/150728589"],["way/236832975"],["way/1014298835"],["way/1098295539"],["way/9349933"],["way/150728777"],["way/150765927"],["way/150765931"],["way/439102690"],["way/23723356"],["way/23744229"],["way/160175594"],["way/307363488"],["way/400539717"],["way/1183340770"],["way/9349926"],["way/15974483"],["way/25793275"],["way/26768457"],["way/31789281"],["way/68242357"],["way/68242358"],["way/245550088"],["way/245550090"],["way/249345328"],["way/438950304"],["way/438950305"],["way/1023621901"],["way/23771058"],["way/23771059"],["way/23771131"],["way/246229670"],["way/400539716"],["way/400539718"],["way/946557603"],["way/1020576910"],["way/1153743361"],["way/23738140"],["way/23723662"],["way/23738135"],["way/23771034"],["way/23771220"],["way/30810139"],["way/46110594"],["way/46110595"],["way/57941885"],["way/57967574"],["way/4426817"],["way/10413848"],["way/23747499"],["way/23771227"],["way/30810135"],["way/30810136"],["way/46110599"],["way/61513835"],["way/160174882"],["way/194557550"],["way/257385213"],["way/257385214"],["way/257702076"],["way/296752189"],["way/886253856"],["way/957398823"],["way/1024042457"],["way/1024042458"],["way/1024042459"],["way/1024042460"],["way/1058082820"],["way/1073894977"],["way/1151501328"],["way/4280155"],["way/4280156"],["way/34062837"],["way/34062838"],["way/34063148"],["way/58114114"],["way/74094651"],["way/384731060"],["way/1020576909"],["way/1270598092"],["way/10413254"],["way/10413258"],["way/30810134"],["way/30810137"],["way/30810138"],["way/34062833"],["way/46110881"],["way/59204774"],["way/145314494"],["way/499801234"],["way/499801235"],["way/10413251"],["way/436414422"],["way/10413252"],["way/10413257"],["way/27615294"],["way/27795573"],["way/244565454"],["way/436501265"],["way/722893702"],["way/783148140"],["way/38902679"],["way/93785441"],["way/38957772"],["way/38957799"],["way/50894475"],["way/50894476"],["way/172372089"],["way/205254559"],["way/389753135"],["way/8049669"],["way/8049670"],["way/8049671"],["way/8049675"],["way/8049676"],["way/25552898"],["way/32601510"],["way/39473143"],["way/39632442"],["way/50894483"],["way/51100146"],["way/257006722"],["way/438955276"],["way/438955277"],["way/438955279"],["way/1017557087"],["way/1017557091"],["way/1017557092"],["way/29993649"],["way/8049660"],["way/8049668"],["way/50894480"],["way/93785371"],["way/93785410"],["way/93785436"],["way/96693508"],["way/121672193"],["way/121672202"],["way/172372091"],["way/172372093"],["way/172372094"],["way/172510810"],["way/210344983"],["way/227962103"],["way/227962104"],["way/227962105"],["way/253242041"],["way/282152446"],["way/400539720"],["way/622579729"],["way/622579730"],["way/622579731"],["way/906597479"],["way/1018283426"],["way/25622830"],["way/148232336"],["way/845619769"],["way/845619770"],["way/24891036"],["way/26767858"],["way/26768456"],["way/48000273"],["way/48000274"],["way/48000276"],["way/48000278"],["way/50546794"],["way/50546795"],["way/50831641"],["way/50897620"],["way/245550089"],["way/249345323"],["way/249345326"],["way/455053744"],["way/1018245486"],["way/1023621900"],["way/1105004275"],["way/1105004276"],["way/23767685"],["way/26768459"],["way/26708827"],["way/455053745"],["way/455053748"],["way/845684576"],["way/901288730"],["way/455053749"],["way/51096629"],["way/51096630"],["way/38957507"],["way/210344982"],["way/225205813"],["way/227962834"],["way/253242040"],["way/304214261"],["way/353666314"],["way/366511536"],["way/25514938"],["way/227967940"],["way/227967941"],["way/253242039"],["way/457856890"],["way/1104602051"],["way/27448152"],["way/93785468"],["way/807130086"],["way/907649529"],["way/907649530"],["way/942877817"],["way/1017557104"],["way/1017557105"],["way/1017557107"],["way/26708821"],["way/50833747"],["way/150549941"],["way/911003291"],["way/24294847"],["way/26708823"],["way/26709382"],["way/26709383"],["way/26725095"],["way/245551875"],["way/455053750"],["way/455053751"],["way/455053752"],["way/455053753"],["way/26768742"],["way/26768743"],["way/773777528"],["way/773777532"],["way/831594728"],["way/848771757"],["way/896111189"],["way/906466806"],["way/906466807"],["way/907649528"],["way/1017557102"],["way/1017557103"],["way/1017557106"],["way/1290056278"],["way/25514946"],["way/137589238"],["way/245551876"],["way/246712151"],["way/257466469"],["way/499584108"],["way/499584109"],["way/831594727"],["way/831594729"],["way/874090504"],["way/901288733"],["way/901288734"],["way/1019214985"],["way/4280154"],["way/44829655"],["way/64490544"],["way/235044454"],["way/235044458"],["way/235044467"],["way/391678891"],["way/481228685"],["way/906597478"],["way/917710521"],["way/925232334"],["way/925930909"],["way/1005094136"],["way/1024469331"],["way/1026864449"],["way/1026864450"],["way/1048279173"],["way/1062316089"],["way/1068801782"],["way/10413373"],["way/10413374"],["way/10413375"],["way/10413892"],["way/50345412"],["way/391678867"],["way/391678919"],["way/499801237"],["way/499801238"],["way/559659739"],["way/901220226"],["way/1024469330"],["way/1024469337"],["way/1024469338"],["way/1024469339"],["way/1024469342"],["way/1024469343"],["way/1024469344"],["way/1044521599"],["way/1048279174"],["way/1048279213"],["way/1206165107"],["way/108955312"],["way/235044451"],["way/235044469"],["way/235044488"],["way/235044502"],["way/678348093"],["way/977509077"],["way/977509078"],["way/1048279172"],["way/10413844"],["way/24271759"],["way/39486736"],["way/235044459"],["way/235044462"],["way/258716578"],["way/277573769"],["way/277573772"],["way/391678907"],["way/438232372"],["way/438232375"],["way/459063889"],["way/901220225"],["way/1026864395"],["way/1060995132"],["way/10413846"],["way/24224503"],["way/27615293"],["way/29032138"],["way/391615295"],["way/10413461"],["way/10413843"],["way/32559798"],["way/32569666"],["way/32569667"],["way/147609387"],["way/108955308"],["way/108955317"],["way/108955321"],["way/108955323"],["way/108955328"],["way/108955335"],["way/235044453"],["way/1095730889"],["way/8604381"],["way/8604384"],["way/24340243"],["way/438232373"],["way/559659738"],["way/820358169"],["way/917710519"],["way/967057600"],["way/967057601"],["way/1026864393"],["way/1027670214"],["way/1027670217"],["way/1027696384"],["way/1097987944"],["way/1097987966"],["way/1097988698"],["way/1181851442"],["way/1181851443"],["way/30606189"],["way/249350411"],["way/257385208"],["way/257559744"],["way/525627822"],["way/525627823"],["way/525627824"],["way/4426812"],["way/5074022"],["way/8604382"],["way/24224502"],["way/24340239"],["way/24340240"],["way/24340244"],["way/26643775"],["way/29133762"],["way/30606187"],["way/30606191"],["way/34333673"],["way/35960170"],["way/39270702"],["way/67367836"],["way/67367841"],["way/438232374"],["way/901220227"],["way/901990783"],["way/908451316"],["way/908451317"],["way/908451318"],["way/939289454"],["way/967024764"],["way/1027670211"],["way/1027670212"],["way/1027696385"],["way/1056091056"],["way/1095738776"],["way/1131940479"],["way/1273609013"],["way/1285332035"],["way/28850145"],["way/30405775"],["way/32559795"],["way/32559796"],["way/1095196095"],["way/420609755"],["way/1285332036"],["way/34704930"],["way/276155445"],["way/5097854"],["way/32566613"],["way/32566710"],["way/219573882"],["way/225799278"],["way/276155444"],["way/886253862"],["way/886253863"],["way/886253864"],["way/189180869"],["way/1068585173"],["way/24010735"],["way/157544790"],["way/275960106"],["way/309053256"],["way/28130473"],["way/32022781"],["way/71736121"],["way/28294121"],["way/40686781"],["way/225799279"],["way/225799280"],["way/225799281"],["way/258562275"],["way/917589216"],["way/1301588404"],["way/32022782"],["way/71736120"],["way/27615283"],["way/51527876"],["way/174376622"],["way/277263982"],["way/277263985"],["way/277263986"],["way/24745142"],["way/32022784"],["way/35193993"],["way/51527873"],["way/175848414"],["way/188770076"],["way/225799277"],["way/225799282"],["way/276155431"],["way/277263838"],["way/277263841"],["way/485656491"],["way/1300299732"],["way/1300599997"],["way/24841417"],["way/24516723"],["way/34748469"],["way/41084830"],["way/126886662"],["way/188774775"],["way/33758457"],["way/61241380"],["way/126886681"],["way/277263861"],["way/115570921"],["way/530269662"],["way/530269663"],["way/28373880"],["way/126886669"],["way/126886689"],["way/136753545"],["way/249530028"],["way/249530031"],["way/249530033"],["way/277263856"],["way/519639450"],["way/766488275"],["way/1133443095"],["way/136753546"],["way/136753549"],["way/24931821"],["way/338522527"],["way/24994513"],["way/27445965"],["way/27492926"],["way/30491898"],["way/521858667"],["way/521858668"],["way/521860006"],["way/27485787"],["way/400041856"],["way/23646357"],["way/27445961"],["way/27445966"],["way/27445977"],["way/27445978"],["way/27485788"],["way/195604778"],["way/245160633"],["way/298872869"],["way/298872872"],["way/27445982"],["way/236501540"],["way/4084953"],["way/24932222"],["way/25304528"],["way/26692006"],["way/26979785"],["way/27071222"],["way/27071223"],["way/27071224"],["way/27071226"],["way/27071230"],["way/27071231"],["way/27445994"],["way/30120725"],["way/236501542"],["way/264912177"],["way/284838267"],["way/284838268"],["way/284838270"],["way/712697371"],["way/900552870"],["way/943922411"],["way/950303609"],["way/1030991900"],["way/26692359"],["way/30491882"],["way/520218311"],["way/26509286"],["way/26845783"],["way/26845787"],["way/26845791"],["way/26845823"],["way/26943763"],["way/26943764"],["way/26979794"],["way/200288395"],["way/333696122"],["way/458455039"],["way/808241780"],["way/943922412"],["way/943922413"],["way/943922414"],["way/1281954907"],["way/27222708"],["way/27445962"],["way/27445969"],["way/27445973"],["way/521858670"],["way/631630399"],["way/27222707"],["way/27222709"],["way/27392736"],["way/27936364"],["way/28073263"],["way/28073272"],["way/172994045"],["way/638657802"],["way/1023630118"],["way/1029991762"],["way/27222712"],["way/27222716"],["way/27222721"],["way/27445960"],["way/27445963"],["way/92113884"],["way/27222713"],["way/27392152"],["way/27392734"],["way/27535419"],["way/27884830"],["way/27951976"],["way/27951977"],["way/678852864"],["way/829590185"],["way/1039571494"],["way/27392738"],["way/27936371"],["way/27936375"],["way/28073273"],["way/28073274"],["way/28073275"],["way/28073276"],["way/366511532"],["way/400711526"],["way/438950306"],["way/566609565"],["way/1075753300"],["way/27535418"],["way/27535420"],["way/27936372"],["way/27951978"],["way/112855103"],["way/625992144"],["way/625992149"],["way/829590184"],["way/400711528"],["way/888906024"],["way/888906025"],["way/888906026"],["way/5074424"],["way/24825310"],["way/25206416"],["way/25206417"],["way/27071227"],["way/27071228"],["way/27222723"],["way/27222724"],["way/27222725"],["way/27222726"],["way/27445958"],["way/27448155"],["way/164863456"],["way/191923760"],["way/191923761"],["way/284838269"],["way/428275724"],["way/516542761"],["way/547535765"],["way/638657803"],["way/669439097"],["way/669439098"],["way/669439099"],["way/708249530"],["way/708249531"],["way/1051531480"],["way/1051531481"],["way/1126377371"],["way/1126377372"],["way/25206418"],["way/27884826"],["way/27884827"],["way/27884829"],["way/27884833"],["way/27951980"],["way/32917430"],["way/191923759"],["way/191923762"],["way/191923763"],["way/191923764"],["way/191923765"],["way/540296353"],["way/943924593"],["way/26845799"],["way/27561747"],["way/236501543"],["way/564751141"],["way/1166311330"],["way/4084940"],["way/24607854"],["way/24853960"],["way/39089328"],["way/1199898348"],["way/27870241"],["way/27870243"],["way/27870264"],["way/28117066"],["way/28117068"],["way/28117077"],["way/208732992"],["way/540296344"],["way/540296350"],["way/540296351"],["way/625992142"],["way/625992146"],["way/625992147"],["way/829590186"],["way/829590187"],["way/878936936"],["way/901598385"],["way/1212723165"],["way/27392151"],["way/366511537"],["way/400711527"],["way/975366233"],["way/24853965"],["way/27448157"],["way/27870239"],["way/32917431"],["way/199205140"],["way/208732988"],["way/208733173"],["way/208735019"],["way/225978157"],["way/583748986"],["way/1019108334"],["way/400711529"],["way/898025965"],["way/1019108333"],["way/26205176"],["way/26845819"],["way/520476696"],["way/26845779"],["way/26845781"],["way/26845785"],["way/26845812"],["way/26845820"],["way/27435177"],["way/520218313"],["way/520218316"],["way/1281954908"],["way/30491900"],["way/30842549"],["way/61479062"],["way/27435169"],["way/27435171"],["way/27435174"],["way/30842548"],["way/306704160"],["way/519866757"],["way/537388244"],["way/3666783"],["way/24932228"],["way/24932231"],["way/24932233"],["way/24932234"],["way/61479034"],["way/133267621"],["way/143862047"],["way/143862051"],["way/294416954"],["way/319388777"],["way/404436024"],["way/4059056"],["way/4059058"],["way/132932281"],["way/143862034"],["way/143862037"],["way/143862038"],["way/143862040"],["way/143862041"],["way/143862042"],["way/143862043"],["way/143862044"],["way/143862048"],["way/143862050"],["way/143862052"],["way/193141896"],["way/380538973"],["way/1004352557"],["way/1166311327"],["way/294416953"],["way/4084954"],["way/5074426"],["way/5074427"],["way/5074428"],["way/48426809"],["way/226070775"],["way/638657804"],["way/638657805"],["way/1031117547"],["way/1289270890"],["way/27378797"],["way/226070776"],["way/306704161"],["way/27378798"],["way/27405128"],["way/53383246"],["way/129869263"],["way/458455038"],["way/1092910522"],["way/4379782"],["way/27638555"],["way/82898425"],["way/130533343"],["way/400711531"],["way/400711532"],["way/400711533"],["way/400711534"],["way/487487645"],["way/810070512"],["way/893598646"],["way/76844648"],["way/82879953"],["way/82898339"],["way/198379205"],["way/199205133"],["way/199205136"],["way/436346678"],["way/436346679"],["way/436346680"],["way/436346681"],["way/436346682"],["way/487487646"],["way/487487647"],["way/583748989"],["way/583748990"],["way/903418345"],["way/943924597"],["way/24968888"],["way/27640217"],["way/260855895"],["way/274708956"],["way/274709012"],["way/542391246"],["way/1152295863"],["way/24968892"],["way/25293925"],["way/25293927"],["way/25293929"],["way/25294366"],["way/25294367"],["way/274708963"],["way/274709010"],["way/27378795"],["way/27378805"],["way/32096109"],["way/44499780"],["way/1025927191"],["way/1025927192"],["way/4416253"],["way/5074429"],["way/24239592"],["way/24240267"],["way/24915828"],["way/24916253"],["way/24916254"],["way/26757063"],["way/27378801"]],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"queuedTimeMillis":1,"elapsedTimeMillis":6558,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":70249,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:27 GMT + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195819_00520_3gijq/ybb1ed5e2bfee50fdff37d2b0f4925f1327d926bc/2 + response: + content: '{"id":"20250117_195819_00520_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195819_00520_3gijq","columns":[{"name":"osm_id","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"queuedTimeMillis":1,"elapsedTimeMillis":6558,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":70249,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8900,"wallTimeMillis":114920,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '471' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:29 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: "SELECT\n count(osm_id)\nFROM\n sotm2024_iceberg.geo_sort.contributions\nWHERE\n + \ status = 'latest'\n AND element_at (tags, 'highway') IS NOT NULL\n AND + tags['highway'] IN ('motorway', 'trunk', 'motorway_link',\n\t'trunk_link', 'primary', + 'primary_link', 'secondary',\n\t'secondary_link', 'tertiary', 'tertiary_link', + 'unclassified',\n\t'residential')\n AND (bbox.xmax >= 8.629761\n AND + bbox.xmin <= 8.742371)\n AND (bbox.ymax >= 49.379556\n AND bbox.ymin + <= 49.437890)\n" + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '486' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195830_00521_3gijq/y48652b2ebec797426562e33ba91fb500a05c65ea/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:30 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195830_00521_3gijq/y48652b2ebec797426562e33ba91fb500a05c65ea/1 + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195830_00521_3gijq/yd0f23bd260670b956de577cee95d7438ff95ee77/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '322' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:31 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195830_00521_3gijq/yd0f23bd260670b956de577cee95d7438ff95ee77/2 + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/yf8499fc06044bc6754c7ba8854163cc481cc5de0/0","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":2165,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '334' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:33 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/yf8499fc06044bc6754c7ba8854163cc481cc5de0/0 + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","partialCancelUri":"http://127.0.0.1:8084/v1/statement/executing/partialCancel/20250117_195830_00521_3gijq/1/ya040f09f102a31da681a0558a17455b9fd1024fb/1","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/ya040f09f102a31da681a0558a17455b9fd1024fb/1","columns":[{"name":"_col0","type":"bigint","typeSignature":{"rawType":"bigint","arguments":[]}}],"stats":{"state":"RUNNING","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":749,"queuedSplits":0,"runningSplits":0,"completedSplits":749,"cpuTimeMillis":8954,"wallTimeMillis":116630,"queuedTimeMillis":0,"elapsedTimeMillis":4164,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":3392,"spilledBytes":0,"rootStage":{"stageId":"0","state":"RUNNING","done":false,"nodes":1,"totalSplits":33,"queuedSplits":0,"runningSplits":0,"completedSplits":33,"cpuTimeMillis":64,"wallTimeMillis":70,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[{"stageId":"1","state":"PENDING","done":false,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8890,"wallTimeMillis":116560,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '581' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:35 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/ya040f09f102a31da681a0558a17455b9fd1024fb/1 + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/yad4e58110f665a9b8b5d90ec9a79f5a8e2c8992d/2","columns":[{"name":"_col0","type":"bigint","typeSignature":{"rawType":"bigint","arguments":[]}}],"data":[[3280]],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":749,"queuedSplits":0,"runningSplits":0,"completedSplits":749,"cpuTimeMillis":8954,"wallTimeMillis":116630,"queuedTimeMillis":0,"elapsedTimeMillis":6158,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":3392,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":1,"totalSplits":33,"queuedSplits":0,"runningSplits":0,"completedSplits":33,"cpuTimeMillis":64,"wallTimeMillis":70,"processedRows":716,"processedBytes":31504,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[{"stageId":"1","state":"FINISHED","done":true,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8890,"wallTimeMillis":116560,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '570' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:37 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195830_00521_3gijq/yad4e58110f665a9b8b5d90ec9a79f5a8e2c8992d/2 + response: + content: '{"id":"20250117_195830_00521_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195830_00521_3gijq","columns":[{"name":"_col0","type":"bigint","typeSignature":{"rawType":"bigint","arguments":[]}}],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":3,"totalSplits":749,"queuedSplits":0,"runningSplits":0,"completedSplits":749,"cpuTimeMillis":8954,"wallTimeMillis":116630,"queuedTimeMillis":0,"elapsedTimeMillis":6158,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"physicalWrittenBytes":0,"peakMemoryBytes":3392,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":1,"totalSplits":33,"queuedSplits":0,"runningSplits":0,"completedSplits":33,"cpuTimeMillis":64,"wallTimeMillis":70,"processedRows":716,"processedBytes":31504,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[{"stageId":"1","state":"FINISHED","done":true,"nodes":3,"totalSplits":716,"queuedSplits":0,"runningSplits":0,"completedSplits":716,"cpuTimeMillis":8890,"wallTimeMillis":116560,"processedRows":3798450,"processedBytes":231534372,"physicalInputBytes":231534372,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '504' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:39 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_fetch_version b/tests/integrationtests/trino/test_fetch_version new file mode 100644 index 000000000..797b92e58 --- /dev/null +++ b/tests/integrationtests/trino/test_fetch_version @@ -0,0 +1,220 @@ +interactions: +- request: + body: SELECT version() + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '16' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195808_00519_3gijq/y06361689388e2a7236eb747c62e90c44ba8ce587/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '320' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:08 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195808_00519_3gijq/y06361689388e2a7236eb747c62e90c44ba8ce587/1 + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195808_00519_3gijq/y59f89628f5bff9c4363cb5c93dc4c5f1a6032561/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":2,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '328' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:10 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195808_00519_3gijq/y59f89628f5bff9c4363cb5c93dc4c5f1a6032561/2 + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y0322ae69458590776af494e8e316d43fcd830012/0","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":2276,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '334' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:12 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y0322ae69458590776af494e8e316d43fcd830012/0 + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","partialCancelUri":"http://127.0.0.1:8084/v1/statement/executing/partialCancel/20250117_195808_00519_3gijq/0/y587641876633b650fe6153b202536cacc1ce034b/1","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y587641876633b650fe6153b202536cacc1ce034b/1","columns":[{"name":"_col0","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"stats":{"state":"RUNNING","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":4381,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":148,"spilledBytes":0,"rootStage":{"stageId":"0","state":"RUNNING","done":false,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '513' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:14 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y587641876633b650fe6153b202536cacc1ce034b/1 + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y6d268f9ec1ab47bf99cf73cf881e086ba1456652/2","columns":[{"name":"_col0","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"data":[["467"]],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":6298,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":148,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"processedRows":1,"processedBytes":0,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '511' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:16 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/executing/20250117_195808_00519_3gijq/y6d268f9ec1ab47bf99cf73cf881e086ba1456652/2 + response: + content: '{"id":"20250117_195808_00519_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195808_00519_3gijq","columns":[{"name":"_col0","type":"varchar","typeSignature":{"rawType":"varchar","arguments":[{"kind":"LONG","value":2147483647}]}}],"stats":{"state":"FINISHED","queued":false,"scheduled":true,"progressPercentage":100.0,"runningPercentage":0.0,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":1,"elapsedTimeMillis":6298,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":148,"spilledBytes":0,"rootStage":{"stageId":"0","state":"FINISHED","done":true,"nodes":1,"totalSplits":1,"queuedSplits":0,"runningSplits":0,"completedSplits":1,"cpuTimeMillis":0,"wallTimeMillis":0,"processedRows":1,"processedBytes":0,"physicalInputBytes":0,"failedTasks":0,"coordinatorOnly":false,"subStages":[]}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '444' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:18 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_query_catalog_not_found b/tests/integrationtests/trino/test_query_catalog_not_found new file mode 100644 index 000000000..4c313b739 --- /dev/null +++ b/tests/integrationtests/trino/test_query_catalog_not_found @@ -0,0 +1,115 @@ +interactions: +- request: + body: SELECT * FROM foobar.bar.foo + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '28' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195850_00524_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195850_00524_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195850_00524_3gijq/y991ed33f4fe1f39054a69044d6c27e3fb3e0556d/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:50 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195850_00524_3gijq/y991ed33f4fe1f39054a69044d6c27e3fb3e0556d/1 + response: + content: '{"id":"20250117_195850_00524_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195850_00524_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195850_00524_3gijq/y6f6f4dc06a7d54117d4a712b22f0772cc9ed8aab/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:51 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195850_00524_3gijq/y6f6f4dc06a7d54117d4a712b22f0772cc9ed8aab/2 + response: + content: '{"id":"20250117_195850_00524_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195850_00524_3gijq","stats":{"state":"FAILED","queued":false,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":1,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"error":{"message":"line + 1:15: Catalog ''foobar'' not found","errorCode":44,"errorName":"CATALOG_NOT_FOUND","errorType":"USER_ERROR","errorLocation":{"lineNumber":1,"columnNumber":15},"failureInfo":{"type":"io.trino.spi.TrinoException","message":"line + 1:15: Catalog ''foobar'' not found","suppressed":[],"stack":["io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:58)","io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:52)","io.trino.metadata.MetadataUtil.lambda$getRequiredCatalogHandle$2(MetadataUtil.java:110)","java.base/java.util.Optional.orElseThrow(Optional.java:403)","io.trino.metadata.MetadataUtil.getRequiredCatalogHandle(MetadataUtil.java:110)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:2299)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:522)","io.trino.sql.tree.Table.accept(Table.java:60)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.analyzeFrom(StatementAnalyzer.java:4917)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:3093)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:522)","io.trino.sql.tree.QuerySpecification.accept(QuerySpecification.java:155)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:549)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:1564)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:522)","io.trino.sql.tree.Query.accept(Query.java:119)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:501)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:490)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:98)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:87)","io.trino.execution.SqlQueryExecution.analyze(SqlQueryExecution.java:289)","io.trino.execution.SqlQueryExecution.(SqlQueryExecution.java:222)","io.trino.execution.SqlQueryExecution$SqlQueryExecutionFactory.createQueryExecution(SqlQueryExecution.java:892)","io.trino.dispatcher.LocalDispatchQueryFactory.lambda$createDispatchQuery$0(LocalDispatchQueryFactory.java:153)","io.trino.$gen.Trino_467____20250108_120654_2.call(Unknown + Source)","com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)","com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:76)","com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)","java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)","java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)","java.base/java.lang.Thread.run(Thread.java:1575)"],"errorInfo":{"code":44,"name":"CATALOG_NOT_FOUND","type":"USER_ERROR"},"errorLocation":{"lineNumber":1,"columnNumber":15}}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '1046' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:53 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_query_missing_catalog_name b/tests/integrationtests/trino/test_query_missing_catalog_name new file mode 100644 index 000000000..a4d3c0d04 --- /dev/null +++ b/tests/integrationtests/trino/test_query_missing_catalog_name @@ -0,0 +1,115 @@ +interactions: +- request: + body: SELECT * FROM bar.foo + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '21' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195845_00523_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195845_00523_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195845_00523_3gijq/y2dc2ce8a1b157a6a83dcfb6b192b6898a8efa3f8/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '322' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:45 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195845_00523_3gijq/y2dc2ce8a1b157a6a83dcfb6b192b6898a8efa3f8/1 + response: + content: '{"id":"20250117_195845_00523_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195845_00523_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195845_00523_3gijq/yd910cf6ad6954a0236994933316894b250af8578/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '322' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:46 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195845_00523_3gijq/yd910cf6ad6954a0236994933316894b250af8578/2 + response: + content: '{"id":"20250117_195845_00523_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195845_00523_3gijq","stats":{"state":"FAILED","queued":false,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":1,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"error":{"message":"line + 1:15: Catalog must be specified when session catalog is not set","errorCode":56,"errorName":"MISSING_CATALOG_NAME","errorType":"USER_ERROR","errorLocation":{"lineNumber":1,"columnNumber":15},"failureInfo":{"type":"io.trino.spi.TrinoException","message":"line + 1:15: Catalog must be specified when session catalog is not set","suppressed":[],"stack":["io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:58)","io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:52)","io.trino.metadata.MetadataUtil.lambda$createQualifiedObjectName$4(MetadataUtil.java:152)","java.base/java.util.Optional.orElseThrow(Optional.java:403)","io.trino.metadata.MetadataUtil.createQualifiedObjectName(MetadataUtil.java:151)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:2264)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:522)","io.trino.sql.tree.Table.accept(Table.java:60)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.analyzeFrom(StatementAnalyzer.java:4917)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:3093)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:522)","io.trino.sql.tree.QuerySpecification.accept(QuerySpecification.java:155)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:549)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:1564)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:522)","io.trino.sql.tree.Query.accept(Query.java:119)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:501)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:490)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:98)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:87)","io.trino.execution.SqlQueryExecution.analyze(SqlQueryExecution.java:289)","io.trino.execution.SqlQueryExecution.(SqlQueryExecution.java:222)","io.trino.execution.SqlQueryExecution$SqlQueryExecutionFactory.createQueryExecution(SqlQueryExecution.java:892)","io.trino.dispatcher.LocalDispatchQueryFactory.lambda$createDispatchQuery$0(LocalDispatchQueryFactory.java:153)","io.trino.$gen.Trino_467____20250108_120654_2.call(Unknown + Source)","com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)","com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:76)","com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)","java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)","java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)","java.base/java.lang.Thread.run(Thread.java:1575)"],"errorInfo":{"code":56,"name":"MISSING_CATALOG_NAME","type":"USER_ERROR"},"errorLocation":{"lineNumber":1,"columnNumber":15}}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '1061' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:48 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_query_missing_schema_name b/tests/integrationtests/trino/test_query_missing_schema_name new file mode 100644 index 000000000..7ca188a49 --- /dev/null +++ b/tests/integrationtests/trino/test_query_missing_schema_name @@ -0,0 +1,115 @@ +interactions: +- request: + body: SELECT * FROM foo + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '17' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195840_00522_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195840_00522_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195840_00522_3gijq/y5d7bd912594b2d1308569d8248df925944523c87/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '320' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:40 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195840_00522_3gijq/y5d7bd912594b2d1308569d8248df925944523c87/1 + response: + content: '{"id":"20250117_195840_00522_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195840_00522_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195840_00522_3gijq/y5db657a205bfdde3e249d6c7436bfed185c7a48f/2","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":1,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '326' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:42 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195840_00522_3gijq/y5db657a205bfdde3e249d6c7436bfed185c7a48f/2 + response: + content: '{"id":"20250117_195840_00522_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195840_00522_3gijq","stats":{"state":"FAILED","queued":false,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":1,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"error":{"message":"line + 1:15: Schema must be specified when session schema is not set","errorCode":57,"errorName":"MISSING_SCHEMA_NAME","errorType":"USER_ERROR","errorLocation":{"lineNumber":1,"columnNumber":15},"failureInfo":{"type":"io.trino.spi.TrinoException","message":"line + 1:15: Schema must be specified when session schema is not set","suppressed":[],"stack":["io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:58)","io.trino.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:52)","io.trino.metadata.MetadataUtil.lambda$createQualifiedObjectName$3(MetadataUtil.java:150)","java.base/java.util.Optional.orElseThrow(Optional.java:403)","io.trino.metadata.MetadataUtil.createQualifiedObjectName(MetadataUtil.java:149)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:2264)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitTable(StatementAnalyzer.java:522)","io.trino.sql.tree.Table.accept(Table.java:60)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.analyzeFrom(StatementAnalyzer.java:4917)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:3093)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:522)","io.trino.sql.tree.QuerySpecification.accept(QuerySpecification.java:155)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:549)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:1564)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:522)","io.trino.sql.tree.Query.accept(Query.java:119)","io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)","io.trino.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:541)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:501)","io.trino.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:490)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:98)","io.trino.sql.analyzer.Analyzer.analyze(Analyzer.java:87)","io.trino.execution.SqlQueryExecution.analyze(SqlQueryExecution.java:289)","io.trino.execution.SqlQueryExecution.(SqlQueryExecution.java:222)","io.trino.execution.SqlQueryExecution$SqlQueryExecutionFactory.createQueryExecution(SqlQueryExecution.java:892)","io.trino.dispatcher.LocalDispatchQueryFactory.lambda$createDispatchQuery$0(LocalDispatchQueryFactory.java:153)","io.trino.$gen.Trino_467____20250108_120654_2.call(Unknown + Source)","com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)","com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:76)","com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)","java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)","java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)","java.base/java.lang.Thread.run(Thread.java:1575)"],"errorInfo":{"code":57,"name":"MISSING_SCHEMA_NAME","type":"USER_ERROR"},"errorLocation":{"lineNumber":1,"columnNumber":15}}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '1064' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:44 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_query_syntax_error b/tests/integrationtests/trino/test_query_syntax_error new file mode 100644 index 000000000..92fc07a8e --- /dev/null +++ b/tests/integrationtests/trino/test_query_syntax_error @@ -0,0 +1,84 @@ +interactions: +- request: + body: SELECT * MORF foo + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '17' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195854_00525_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195854_00525_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195854_00525_3gijq/y178ecc42a7c09247a295377df1b776ac138cc63d/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:54 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: GET + uri: http://127.0.0.1:8084/v1/statement/queued/20250117_195854_00525_3gijq/y178ecc42a7c09247a295377df1b776ac138cc63d/1 + response: + content: '{"id":"20250117_195854_00525_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195854_00525_3gijq","stats":{"state":"FAILED","queued":false,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"error":{"message":"line + 1:10: mismatched input ''MORF''. Expecting: '','', ''EXCEPT'', ''FETCH'', ''FROM'', + ''GROUP'', ''HAVING'', ''INTERSECT'', ''LIMIT'', ''OFFSET'', ''ORDER'', ''UNION'', + ''WHERE'', ''WINDOW'', ","errorCode":1,"errorName":"SYNTAX_ERROR","errorType":"USER_ERROR","errorLocation":{"lineNumber":1,"columnNumber":10},"failureInfo":{"type":"io.trino.sql.parser.ParsingException","message":"line + 1:10: mismatched input ''MORF''. Expecting: '','', ''EXCEPT'', ''FETCH'', ''FROM'', + ''GROUP'', ''HAVING'', ''INTERSECT'', ''LIMIT'', ''OFFSET'', ''ORDER'', ''UNION'', + ''WHERE'', ''WINDOW'', ","cause":{"type":"org.antlr.v4.runtime.InputMismatchException","suppressed":[],"stack":["io.trino.sql.parser.SqlParser$2.recoverInline(SqlParser.java:147)","org.antlr.v4.runtime.Parser.match(Parser.java:208)","io.trino.grammar.sql.SqlBaseParser.singleStatement(SqlBaseParser.java:347)","io.trino.sql.parser.SqlParser.invokeParser(SqlParser.java:172)","io.trino.sql.parser.SqlParser.invokeParser(SqlParser.java:125)","io.trino.sql.parser.SqlParser.createStatement(SqlParser.java:90)","io.trino.execution.QueryPreparer.prepareQuery(QueryPreparer.java:54)","io.trino.dispatcher.DispatchManager.createQueryInternal(DispatchManager.java:224)","io.trino.dispatcher.DispatchManager.lambda$createQuery$1(DispatchManager.java:193)","io.opentelemetry.context.Context.lambda$wrap$1(Context.java:241)","io.airlift.concurrent.BoundedExecutor.drainQueue(BoundedExecutor.java:79)","io.trino.$gen.Trino_467____20250108_120654_2.run(Unknown + Source)","java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)","java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)","java.base/java.lang.Thread.run(Thread.java:1575)"],"errorInfo":{"code":65536,"name":"GENERIC_INTERNAL_ERROR","type":"INTERNAL_ERROR"}},"suppressed":[],"stack":["io.trino.sql.parser.ErrorHandler.syntaxError(ErrorHandler.java:108)","org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)","org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)","org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327)","org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)","io.trino.grammar.sql.SqlBaseParser.singleStatement(SqlBaseParser.java:352)","io.trino.sql.parser.SqlParser.invokeParser(SqlParser.java:172)","io.trino.sql.parser.SqlParser.invokeParser(SqlParser.java:125)","io.trino.sql.parser.SqlParser.createStatement(SqlParser.java:90)","io.trino.execution.QueryPreparer.prepareQuery(QueryPreparer.java:54)","io.trino.dispatcher.DispatchManager.createQueryInternal(DispatchManager.java:224)","io.trino.dispatcher.DispatchManager.lambda$createQuery$1(DispatchManager.java:193)","io.opentelemetry.context.Context.lambda$wrap$1(Context.java:241)","io.airlift.concurrent.BoundedExecutor.drainQueue(BoundedExecutor.java:79)","io.trino.$gen.Trino_467____20250108_120654_2.run(Unknown + Source)","java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)","java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)","java.base/java.lang.Thread.run(Thread.java:1575)"],"errorInfo":{"code":1,"name":"SYNTAX_ERROR","type":"USER_ERROR"},"errorLocation":{"lineNumber":1,"columnNumber":10}}},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '1080' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:56 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_query_version b/tests/integrationtests/trino/test_query_version new file mode 100644 index 000000000..cbee39d2c --- /dev/null +++ b/tests/integrationtests/trino/test_query_version @@ -0,0 +1,40 @@ +interactions: +- request: + body: SELECT version() + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '16' + host: + - 127.0.0.1:8084 + user-agent: + - python-httpx/0.23.3 + x-trino-user: + - mschaub + method: POST + uri: http://127.0.0.1:8084/v1/statement + response: + content: '{"id":"20250117_195807_00518_3gijq","infoUri":"http://127.0.0.1:8084/ui/query.html?20250117_195807_00518_3gijq","nextUri":"http://127.0.0.1:8084/v1/statement/queued/20250117_195807_00518_3gijq/yeb903a43ccbb8df810132539419566fe6ccdc7e2/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]} + + ' + headers: + Content-Encoding: + - gzip + Content-Length: + - '321' + Content-Type: + - application/json + Date: + - Fri, 17 Jan 2025 19:58:07 GMT + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integrationtests/trino/test_trino_client.py b/tests/integrationtests/trino/test_trino_client.py new file mode 100644 index 000000000..d7e5c6023 --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.py @@ -0,0 +1,96 @@ +import os + +import pytest + +# TODO: use VCR class from test utils +import vcr +from approvaltests import verify + +from ohsome_quality_api.trino import client + +WORKING_DIR = os.path.dirname(os.path.abspath(__file__)) + + +@pytest.fixture +def sql_highways_count(): + file_path = os.path.join(WORKING_DIR, "highways-count.sql") + with open(file_path, "r") as file: + return file.read() + + +@pytest.fixture +def sql_highways(): + file_path = os.path.join(WORKING_DIR, "highways.sql") + with open(file_path, "r") as file: + return file.read() + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_query_version(): + sql = "SELECT version()" + results = await client.query(sql) + assert isinstance(results, client.QueryResults) + assert results.next_uri is not None + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_fetch_version(): + sql = "SELECT version()" + query = await client.query(sql) + results = await client.fetch(query) + assert isinstance(results, tuple) + verify(str(results)) + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_fetch_highways(sql_highways, sql_highways_count): + query = await client.query(sql_highways) + results_highways = await client.fetch(query) + + query = await client.query(sql_highways_count) + results_highways_count = await client.fetch(query) + + assert len(results_highways) == results_highways_count[0][0] + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_query_missing_schema_name(): + sql = "SELECT * FROM foo" + query = await client.query(sql) + with pytest.raises(client.TrinoError) as error: + await client.fetch(query) + verify(str(error.value)) + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_query_missing_catalog_name(): + sql = "SELECT * FROM bar.foo" + query = await client.query(sql) + with pytest.raises(client.TrinoError) as error: + await client.fetch(query) + verify(str(error.value)) + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_query_catalog_not_found(): + sql = "SELECT * FROM foobar.bar.foo" + query = await client.query(sql) + with pytest.raises(client.TrinoError) as error: + await client.fetch(query) + verify(str(error.value)) + + +@pytest.mark.asyncio() +@vcr.use_cassette +async def test_query_syntax_error(): + sql = "SELECT * MORF foo" + query = await client.query(sql) + with pytest.raises(client.TrinoError) as error: + await client.fetch(query) + verify(str(error.value)) diff --git a/tests/integrationtests/trino/test_trino_client.test_fetch_version.approved.txt b/tests/integrationtests/trino/test_trino_client.test_fetch_version.approved.txt new file mode 100644 index 000000000..27a4bbcc0 --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.test_fetch_version.approved.txt @@ -0,0 +1 @@ +(['467'],) diff --git a/tests/integrationtests/trino/test_trino_client.test_query_catalog_not_found.approved.txt b/tests/integrationtests/trino/test_trino_client.test_query_catalog_not_found.approved.txt new file mode 100644 index 000000000..4c81805d6 --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.test_query_catalog_not_found.approved.txt @@ -0,0 +1 @@ +CATALOG_NOT_FOUND: line 1:15: Catalog 'foobar' not found diff --git a/tests/integrationtests/trino/test_trino_client.test_query_missing_catalog_name.approved.txt b/tests/integrationtests/trino/test_trino_client.test_query_missing_catalog_name.approved.txt new file mode 100644 index 000000000..9cef28ef3 --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.test_query_missing_catalog_name.approved.txt @@ -0,0 +1 @@ +MISSING_CATALOG_NAME: line 1:15: Catalog must be specified when session catalog is not set diff --git a/tests/integrationtests/trino/test_trino_client.test_query_missing_schema_name.approved.txt b/tests/integrationtests/trino/test_trino_client.test_query_missing_schema_name.approved.txt new file mode 100644 index 000000000..b1218a1ed --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.test_query_missing_schema_name.approved.txt @@ -0,0 +1 @@ +MISSING_SCHEMA_NAME: line 1:15: Schema must be specified when session schema is not set diff --git a/tests/integrationtests/trino/test_trino_client.test_query_syntax_error.approved.txt b/tests/integrationtests/trino/test_trino_client.test_query_syntax_error.approved.txt new file mode 100644 index 000000000..ae1d2e7b3 --- /dev/null +++ b/tests/integrationtests/trino/test_trino_client.test_query_syntax_error.approved.txt @@ -0,0 +1 @@ +SYNTAX_ERROR: line 1:10: mismatched input 'MORF'. Expecting: ',', 'EXCEPT', 'FETCH', 'FROM', 'GROUP', 'HAVING', 'INTERSECT', 'LIMIT', 'OFFSET', 'ORDER', 'UNION', 'WHERE', 'WINDOW', From 387c167e953124fbf66a5227d29e862e49a5a597 Mon Sep 17 00:00:00 2001 From: Matthias Schaub Date: Tue, 21 Jan 2025 07:36:41 +1300 Subject: [PATCH 3/5] feat: add GeoJSON to bounding box helper --- ohsome_quality_api/utils/helper_geo.py | 31 +++++++++++++++++++++++--- tests/unittests/test_helper_geo.py | 10 ++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/ohsome_quality_api/utils/helper_geo.py b/ohsome_quality_api/utils/helper_geo.py index 5755f40c9..2db602b9d 100644 --- a/ohsome_quality_api/utils/helper_geo.py +++ b/ohsome_quality_api/utils/helper_geo.py @@ -1,13 +1,38 @@ +from dataclasses import dataclass + from geojson import Feature from geojson.utils import coords from pyproj import Geod -def calculate_area(feature: Feature) -> float: - """Calculate area in meter.""" - geod = Geod(ellps="WGS84") +@dataclass +class BoundingBox: + lon_min: float # left + lat_min: float # bottom + lon_max: float # right + lat_max: float # top + + +def get_coordinates(feature: Feature) -> tuple: coordinates = tuple(coords(feature)) lons = tuple(c[0] for c in coordinates) lats = tuple(c[1] for c in coordinates) + return lons, lats + + +def calculate_area(feature: Feature) -> float: + """Calculate area in meter.""" + lons, lats = get_coordinates(feature) + geod = Geod(ellps="WGS84") area, _ = geod.polygon_area_perimeter(lons=lons, lats=lats) return area + + +def get_bounding_box(feature: Feature) -> BoundingBox: + lons, lats = get_coordinates(feature) + return BoundingBox( + lon_min=min(lons), + lat_min=min(lats), + lon_max=max(lons), + lat_max=max(lats), + ) diff --git a/tests/unittests/test_helper_geo.py b/tests/unittests/test_helper_geo.py index 788cc0220..9072cc939 100644 --- a/tests/unittests/test_helper_geo.py +++ b/tests/unittests/test_helper_geo.py @@ -1,9 +1,17 @@ +from dataclasses import astuple + import pytest -from ohsome_quality_api.utils.helper_geo import calculate_area +from ohsome_quality_api.utils.helper_geo import calculate_area, get_bounding_box def test_calculate_area(feature_germany_heidelberg): expected = 108852960.62891776 # derived from PostGIS ST_AREA result = calculate_area(feature_germany_heidelberg) assert result == pytest.approx(expected, abs=1e-3) + + +def test_get_bounding_box(feature_germany_heidelberg): + result = get_bounding_box(feature_germany_heidelberg) + expected = (8.5731788, 49.3520029, 8.7940496, 49.4596927) + assert astuple(result) == pytest.approx(expected, abs=1e-6) From c0eb1f65cd8f25ef747ee43ec6aa29d1e88d24d2 Mon Sep 17 00:00:00 2001 From: Gigaszi Date: Thu, 19 Dec 2024 15:47:38 +0100 Subject: [PATCH 4/5] feat(attribute-completeness): use sql query Optionally use SQL based query instead of ohsome API query given a feature flag. --- ohsome_quality_api/api/response_models.py | 1 + .../attribute_completeness/indicator.py | 69 +++++++++++++++---- .../attribute_completeness/query.sql | 20 ++++++ ohsome_quality_api/indicators/base.py | 5 +- ohsome_quality_api/topics/definitions.py | 2 +- ohsome_quality_api/topics/models.py | 1 + ohsome_quality_api/topics/presets.yaml | 7 ++ tests/conftest.py | 5 ++ .../indicators/test_attribute_completeness.py | 18 +++++ 9 files changed, 113 insertions(+), 15 deletions(-) create mode 100644 ohsome_quality_api/indicators/attribute_completeness/query.sql diff --git a/ohsome_quality_api/api/response_models.py b/ohsome_quality_api/api/response_models.py index 7b626c684..7d71513f2 100644 --- a/ohsome_quality_api/api/response_models.py +++ b/ohsome_quality_api/api/response_models.py @@ -29,6 +29,7 @@ class BaseResponse(BaseConfig): attribution: dict[str, str] = {"url": ATTRIBUTION_URL} +# TODO: add sql_filter class TopicMetadata(BaseConfig): name: str description: str diff --git a/ohsome_quality_api/indicators/attribute_completeness/indicator.py b/ohsome_quality_api/indicators/attribute_completeness/indicator.py index 2decf9d55..ff4b6a04b 100644 --- a/ohsome_quality_api/indicators/attribute_completeness/indicator.py +++ b/ohsome_quality_api/indicators/attribute_completeness/indicator.py @@ -1,7 +1,9 @@ +import json import logging +import os from string import Template -import dateutil.parser +import dateutil import plotly.graph_objects as go from geojson import Feature @@ -12,6 +14,10 @@ from ohsome_quality_api.indicators.base import BaseIndicator from ohsome_quality_api.ohsome import client as ohsome_client from ohsome_quality_api.topics.models import BaseTopic as Topic +from ohsome_quality_api.trino import client as trino_client +from ohsome_quality_api.utils.helper_geo import get_bounding_box + +WORKING_DIR = os.path.dirname(os.path.abspath(__file__)) class AttributeCompleteness(BaseIndicator): @@ -46,8 +52,10 @@ def __init__( attribute_keys: list[str] | None = None, attribute_filter: str | None = None, attribute_title: str | None = None, + feature_flag_sql: bool = False, # Feature flag to use SQL instead of ohsome API queries ) -> None: super().__init__(topic=topic, feature=feature) + self.feature_flag_sql = feature_flag_sql self.threshold_yellow = 0.75 self.threshold_red = 0.25 self.attribute_keys = attribute_keys @@ -56,7 +64,9 @@ def __init__( self.absolute_value_1 = None self.absolute_value_2 = None self.description = None - if self.attribute_keys: + if self.feature_flag_sql: + self.attribute_filter = attribute_filter + elif self.attribute_keys: self.attribute_filter = build_attribute_filter( self.attribute_keys, self.topic.key, @@ -74,17 +84,50 @@ def __init__( ) async def preprocess(self) -> None: - # Get attribute filter - response = await ohsome_client.query( - self.topic, - self.feature, - attribute_filter=self.attribute_filter, - ) - timestamp = response["ratioResult"][0]["timestamp"] - self.result.timestamp_osm = dateutil.parser.isoparse(timestamp) - self.result.value = response["ratioResult"][0]["ratio"] - self.absolute_value_1 = response["ratioResult"][0]["value"] - self.absolute_value_2 = response["ratioResult"][0]["value2"] + if self.feature_flag_sql: + filter = self.topic.sql_filter + file_path = os.path.join(WORKING_DIR, "query.sql") + with open(file_path, "r") as file: + template = file.read() + + bounding_box = get_bounding_box(self.feature) + geometry = json.dumps(self.feature["geometry"]) + + sql = template.format( + bounding_box=bounding_box, + geometry=geometry, + filter=filter, + ) + query = await trino_client.query(sql) + results = await trino_client.fetch(query) + # TODO: Check for None + self.absolute_value_1 = results[0][0] + + filter = self.topic.sql_filter + " AND " + self.attribute_filter + sql = template.format( + bounding_box=bounding_box, + geometry=geometry, + filter=filter, + ) + query = await trino_client.query(sql) + results = await trino_client.fetch(query) + self.absolute_value_2 = results[0][0] + + # timestamp = response["ratioResult"][0]["timestamp"] + # self.result.timestamp_osm = dateutil.parser.isoparse(timestamp) + self.result.value = self.absolute_value_2 / self.absolute_value_1 + else: + # Get attribute filter + response = await ohsome_client.query( + self.topic, + self.feature, + attribute_filter=self.attribute_filter, + ) + timestamp = response["ratioResult"][0]["timestamp"] + self.result.timestamp_osm = dateutil.parser.isoparse(timestamp) + self.result.value = response["ratioResult"][0]["ratio"] + self.absolute_value_1 = response["ratioResult"][0]["value"] + self.absolute_value_2 = response["ratioResult"][0]["value2"] def calculate(self) -> None: # result (ratio) can be NaN if no features matching filter1 diff --git a/ohsome_quality_api/indicators/attribute_completeness/query.sql b/ohsome_quality_api/indicators/attribute_completeness/query.sql new file mode 100644 index 000000000..4369711f7 --- /dev/null +++ b/ohsome_quality_api/indicators/attribute_completeness/query.sql @@ -0,0 +1,20 @@ +WITH bpoly AS ( + SELECT + to_geometry (from_geojson_geometry ('{geometry}')) AS geometry +) +SELECT + Sum( + CASE WHEN ST_Within (ST_GeometryFromText (contributions.geometry), bpoly.geometry) THEN + length + ELSE + Cast(ST_Length (ST_Intersection (ST_GeometryFromText (contributions.geometry), bpoly.geometry)) AS integer) + END) AS length +FROM + bpoly, + sotm2024_iceberg.geo_sort.contributions AS contributions +WHERE + status = 'latest' + AND ST_Intersects (bpoly.geometry, ST_GeometryFromText (contributions.geometry)) + AND {filter} + AND (bbox.xmax <= {bounding_box.lon_max} AND bbox.xmin >= {bounding_box.lon_min}) + AND (bbox.ymax <= {bounding_box.lat_max} AND bbox.ymin >= {bounding_box.lat_min}) diff --git a/ohsome_quality_api/indicators/base.py b/ohsome_quality_api/indicators/base.py index 03505bcfb..dc71d2536 100644 --- a/ohsome_quality_api/indicators/base.py +++ b/ohsome_quality_api/indicators/base.py @@ -50,7 +50,10 @@ def as_dict(self, include_data: bool = False, exclude_label: bool = False) -> di "metadata": self.metadata.model_dump(by_alias=True), "topic": self.topic.model_dump( by_alias=True, - exclude={"ratio_filter"}, + exclude={ + "ratio_filter", + "sql_filter", + }, # TODO: do not exclude SQL filter ), "result": result, **self.feature.properties, diff --git a/ohsome_quality_api/topics/definitions.py b/ohsome_quality_api/topics/definitions.py index f1b3f86ac..73360a60d 100644 --- a/ohsome_quality_api/topics/definitions.py +++ b/ohsome_quality_api/topics/definitions.py @@ -16,7 +16,7 @@ def load_topic_presets() -> dict[str, TopicDefinition]: raw = yaml.safe_load(f) topics = {} for k, v in raw.items(): - v["filter"] = v.pop("filter") + v["filter"] = v.pop("filter") # TODO v["key"] = k topics[k] = TopicDefinition(**v) return topics diff --git a/ohsome_quality_api/topics/models.py b/ohsome_quality_api/topics/models.py index 8589ceecb..27753f1bf 100644 --- a/ohsome_quality_api/topics/models.py +++ b/ohsome_quality_api/topics/models.py @@ -36,6 +36,7 @@ class TopicDefinition(BaseTopic): projects: list[ProjectEnum] source: str | None = None ratio_filter: str | None = None + sql_filter: str | None = None class TopicData(BaseTopic): diff --git a/ohsome_quality_api/topics/presets.yaml b/ohsome_quality_api/topics/presets.yaml index d5407e3ac..e611d2ca2 100644 --- a/ohsome_quality_api/topics/presets.yaml +++ b/ohsome_quality_api/topics/presets.yaml @@ -63,6 +63,13 @@ car-roads: aggregation_type: length filter: >- highway in (motorway, trunk, primary, secondary, tertiary, residential, service, living_street, trunk_link, motorway_link, primary_link, secondary_link, tertiary_link) and type:way + sql_filter: >- + osm_type = 'way' + AND element_at (contributions.tags, 'highway') IS NOT NULL + AND contributions.tags['highway'] IN ('motorway', 'trunk', + 'motorway_link', 'trunk_link', 'primary', 'primary_link', 'secondary', + 'secondary_link', 'tertiary', 'tertiary_link', 'unclassified', + 'residential') indicators: - mapping-saturation - attribute-completeness diff --git a/tests/conftest.py b/tests/conftest.py index cbd3c66c9..fb5b7386b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -58,6 +58,11 @@ def topic_building_count(topic_key_building_count) -> TopicDefinition: return get_topic_preset(topic_key_building_count) +@pytest.fixture(scope="class") +def topic_car_roads() -> TopicDefinition: + return get_topic_preset("car-roads") + + @pytest.fixture(scope="class") def topic_building_area() -> TopicDefinition: return get_topic_preset("building-area") diff --git a/tests/integrationtests/indicators/test_attribute_completeness.py b/tests/integrationtests/indicators/test_attribute_completeness.py index 5bdd6bce4..6b704d9fa 100644 --- a/tests/integrationtests/indicators/test_attribute_completeness.py +++ b/tests/integrationtests/indicators/test_attribute_completeness.py @@ -177,6 +177,24 @@ def test_create_figure(self, indicator): pgo.Figure(indicator.result.figure) # test for valid Plotly figure +class TestFeatureFlagSql: + # TODO: use VCR cassette + def test_preprocess_attribute_sql_filter( + self, + topic_car_roads, + feature_germany_heidelberg, + ): + attribute_filter = "element_at (contributions.tags, 'name') IS NOT NULL" + indicator = AttributeCompleteness( + topic_car_roads, + feature_germany_heidelberg, + attribute_filter=attribute_filter, + feature_flag_sql=True, + ) + asyncio.run(indicator.preprocess()) + assert indicator.result.value is not None + + def test_create_description_attribute_keys_single(): indicator = AttributeCompleteness( get_topic_fixture("building-count"), From 2f229c71bf89dec24d90709f6a07e2320770174f Mon Sep 17 00:00:00 2001 From: Matthias Schaub Date: Tue, 21 Jan 2025 13:04:25 +1300 Subject: [PATCH 5/5] feat: add feature flag to query Trino instead of ohsome api --- ohsome_quality_api/api/request_models.py | 3 +++ .../indicators/attribute_completeness/indicator.py | 9 ++++----- ohsome_quality_api/indicators/base.py | 2 ++ .../indicators/building_comparison/indicator.py | 6 ++---- ohsome_quality_api/indicators/currentness/indicator.py | 3 ++- ohsome_quality_api/indicators/density/indicator.py | 4 ++-- .../indicators/mapping_saturation/indicator.py | 3 ++- ohsome_quality_api/indicators/minimal/indicator.py | 4 ++-- .../indicators/road_comparison/indicator.py | 7 ++----- ohsome_quality_api/oqt.py | 4 ++++ .../indicators/test_attribute_completeness.py | 2 +- 11 files changed, 26 insertions(+), 21 deletions(-) diff --git a/ohsome_quality_api/api/request_models.py b/ohsome_quality_api/api/request_models.py index 7c7e78bc5..9273058c5 100644 --- a/ohsome_quality_api/api/request_models.py +++ b/ohsome_quality_api/api/request_models.py @@ -8,6 +8,7 @@ Field, field_validator, ) +from pydantic.json_schema import SkipJsonSchema from ohsome_quality_api.attributes.definitions import AttributeEnum from ohsome_quality_api.topics.definitions import TopicEnum, get_topic_preset @@ -68,6 +69,8 @@ class IndicatorRequest(BaseBpolys): alias="topic", ) include_figure: bool = True + # feature flag to use SQL queries against Trino instead of ohsome API + trino: SkipJsonSchema[bool] = False @field_validator("topic") @classmethod diff --git a/ohsome_quality_api/indicators/attribute_completeness/indicator.py b/ohsome_quality_api/indicators/attribute_completeness/indicator.py index ff4b6a04b..503b822d6 100644 --- a/ohsome_quality_api/indicators/attribute_completeness/indicator.py +++ b/ohsome_quality_api/indicators/attribute_completeness/indicator.py @@ -52,10 +52,9 @@ def __init__( attribute_keys: list[str] | None = None, attribute_filter: str | None = None, attribute_title: str | None = None, - feature_flag_sql: bool = False, # Feature flag to use SQL instead of ohsome API queries + trino: bool = False, # Feature flag to use SQL instead of ohsome API queries ) -> None: - super().__init__(topic=topic, feature=feature) - self.feature_flag_sql = feature_flag_sql + super().__init__(topic=topic, feature=feature, trino=trino) self.threshold_yellow = 0.75 self.threshold_red = 0.25 self.attribute_keys = attribute_keys @@ -64,7 +63,7 @@ def __init__( self.absolute_value_1 = None self.absolute_value_2 = None self.description = None - if self.feature_flag_sql: + if self.trino: self.attribute_filter = attribute_filter elif self.attribute_keys: self.attribute_filter = build_attribute_filter( @@ -84,7 +83,7 @@ def __init__( ) async def preprocess(self) -> None: - if self.feature_flag_sql: + if self.trino: filter = self.topic.sql_filter file_path = os.path.join(WORKING_DIR, "query.sql") with open(file_path, "r") as file: diff --git a/ohsome_quality_api/indicators/base.py b/ohsome_quality_api/indicators/base.py index dc71d2536..b2a32dfea 100644 --- a/ohsome_quality_api/indicators/base.py +++ b/ohsome_quality_api/indicators/base.py @@ -29,6 +29,7 @@ def __init__( self, topic: Topic, feature: Feature, + trino: bool, ) -> None: self.metadata: IndicatorMetadata = get_indicator( camel_to_hyphen(type(self).__name__) @@ -39,6 +40,7 @@ def __init__( self.result: Result = Result( description=self.templates.label_description["undefined"], ) + self.trino: bool = False self._get_default_figure() def as_dict(self, include_data: bool = False, exclude_label: bool = False) -> dict: diff --git a/ohsome_quality_api/indicators/building_comparison/indicator.py b/ohsome_quality_api/indicators/building_comparison/indicator.py index 6cf5be9b1..fc07ff15b 100644 --- a/ohsome_quality_api/indicators/building_comparison/indicator.py +++ b/ohsome_quality_api/indicators/building_comparison/indicator.py @@ -24,11 +24,9 @@ def __init__( self, topic: BaseTopic, feature: Feature, + trino: bool = False, ) -> None: - super().__init__( - topic=topic, - feature=feature, - ) + super().__init__(topic=topic, feature=feature, trino=trino) # The result is the ratio of area within coverage (between 0-1) or an empty list # # TODO: Evaluate thresholds diff --git a/ohsome_quality_api/indicators/currentness/indicator.py b/ohsome_quality_api/indicators/currentness/indicator.py index 454d5360c..3ca7dd7b2 100644 --- a/ohsome_quality_api/indicators/currentness/indicator.py +++ b/ohsome_quality_api/indicators/currentness/indicator.py @@ -44,8 +44,9 @@ def __init__( self, topic: Topic, feature: Feature, + trino: bool = False, ) -> None: - super().__init__(topic=topic, feature=feature) + super().__init__(topic=topic, feature=feature, trino=trino) # thresholds for binning in months self.up_to_date, self.out_of_date, self.th_source = load_thresholds( self.topic.key diff --git a/ohsome_quality_api/indicators/density/indicator.py b/ohsome_quality_api/indicators/density/indicator.py index 82ade018c..dd54bb5ac 100644 --- a/ohsome_quality_api/indicators/density/indicator.py +++ b/ohsome_quality_api/indicators/density/indicator.py @@ -16,8 +16,8 @@ class Density(BaseIndicator): - def __init__(self, topic: Topic, feature: Feature) -> None: - super().__init__(topic=topic, feature=feature) + def __init__(self, topic: Topic, feature: Feature, trino: bool = False) -> None: + super().__init__(topic=topic, feature=feature, trino=trino) self.threshold_yellow = 30 self.threshold_red = 10 self.area_sqkm = None diff --git a/ohsome_quality_api/indicators/mapping_saturation/indicator.py b/ohsome_quality_api/indicators/mapping_saturation/indicator.py index d8a6478c1..7ec1af536 100644 --- a/ohsome_quality_api/indicators/mapping_saturation/indicator.py +++ b/ohsome_quality_api/indicators/mapping_saturation/indicator.py @@ -48,9 +48,10 @@ def __init__( self, topic: BaseTopic, feature: Feature, + trino: bool = False, time_range: str = "2008-01-01//P1M", ) -> None: - super().__init__(topic=topic, feature=feature) + super().__init__(topic=topic, feature=feature, trino=trino) self.time_range: str = time_range diff --git a/ohsome_quality_api/indicators/minimal/indicator.py b/ohsome_quality_api/indicators/minimal/indicator.py index 001487e65..b2bebf4a4 100644 --- a/ohsome_quality_api/indicators/minimal/indicator.py +++ b/ohsome_quality_api/indicators/minimal/indicator.py @@ -11,8 +11,8 @@ class Minimal(BaseIndicator): - def __init__(self, topic: Topic, feature: Feature) -> None: - super().__init__(topic=topic, feature=feature) + def __init__(self, topic: Topic, feature: Feature, trino: bool = False) -> None: + super().__init__(topic=topic, feature=feature, trino=trino) self.count = 0 async def preprocess(self) -> None: diff --git a/ohsome_quality_api/indicators/road_comparison/indicator.py b/ohsome_quality_api/indicators/road_comparison/indicator.py index 08270700b..f61cb9400 100644 --- a/ohsome_quality_api/indicators/road_comparison/indicator.py +++ b/ohsome_quality_api/indicators/road_comparison/indicator.py @@ -23,14 +23,11 @@ class RoadComparison(BaseIndicator): to the total length of reference roads. """ - def __init__( - self, - topic: BaseTopic, - feature: Feature, - ) -> None: + def __init__(self, topic: BaseTopic, feature: Feature, trino: bool = False) -> None: super().__init__( topic=topic, feature=feature, + trino=trino, ) # TODO: Evaluate thresholds self.th_high = 0.85 # Above or equal to this value label should be green diff --git a/ohsome_quality_api/oqt.py b/ohsome_quality_api/oqt.py index 88b62854b..f67c045c8 100644 --- a/ohsome_quality_api/oqt.py +++ b/ohsome_quality_api/oqt.py @@ -18,6 +18,7 @@ async def create_indicator( bpolys: FeatureCollection, topic: TopicData | TopicDefinition, include_figure: bool = True, + trino: bool = False, *args, **kwargs, ) -> list[Indicator]: @@ -46,6 +47,7 @@ async def create_indicator( feature, topic, include_figure, + trino, *args, **kwargs, ) @@ -58,6 +60,7 @@ async def _create_indicator( feature: Feature, topic: Topic, include_figure: bool = True, + trino: bool = False, *args, **kwargs, ) -> Indicator: @@ -71,6 +74,7 @@ async def _create_indicator( indicator = indicator_class( topic, feature, + trino=trino, *args, **kwargs, ) diff --git a/tests/integrationtests/indicators/test_attribute_completeness.py b/tests/integrationtests/indicators/test_attribute_completeness.py index 6b704d9fa..b6734d3fe 100644 --- a/tests/integrationtests/indicators/test_attribute_completeness.py +++ b/tests/integrationtests/indicators/test_attribute_completeness.py @@ -189,7 +189,7 @@ def test_preprocess_attribute_sql_filter( topic_car_roads, feature_germany_heidelberg, attribute_filter=attribute_filter, - feature_flag_sql=True, + trino=True, ) asyncio.run(indicator.preprocess()) assert indicator.result.value is not None