datamarket 0.9.15__tar.gz → 0.9.16__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of datamarket might be problematic. Click here for more details.
- {datamarket-0.9.15 → datamarket-0.9.16}/PKG-INFO +1 -1
- {datamarket-0.9.15 → datamarket-0.9.16}/pyproject.toml +1 -1
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/alchemy.py +24 -20
- {datamarket-0.9.15 → datamarket-0.9.16}/LICENSE +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/README.md +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/__init__.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/__init__.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/aws.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/drive.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/ftp.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/nominatim.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/peerdb.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/proxy.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/interfaces/tinybird.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/params/__init__.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/params/nominatim.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/__init__.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/airflow.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/alchemy.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/main.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/selenium.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/soda.py +0 -0
- {datamarket-0.9.15 → datamarket-0.9.16}/src/datamarket/utils/typer.py +0 -0
|
@@ -2,16 +2,15 @@
|
|
|
2
2
|
# IMPORTS
|
|
3
3
|
|
|
4
4
|
import logging
|
|
5
|
-
from urllib.parse import quote_plus
|
|
6
|
-
from typing import Any, Iterator, List, Type, TypeVar
|
|
7
5
|
from collections.abc import MutableMapping
|
|
6
|
+
from typing import Any, Iterator, List, Type, TypeVar
|
|
7
|
+
from urllib.parse import quote_plus
|
|
8
8
|
|
|
9
|
-
from sqlalchemy import DDL, Result, Select, SQLColumnExpression, create_engine, text
|
|
9
|
+
from sqlalchemy import DDL, FrozenResult, Result, Select, SQLColumnExpression, create_engine, func, select, text
|
|
10
10
|
from sqlalchemy.dialects.postgresql import insert
|
|
11
11
|
from sqlalchemy.exc import IntegrityError
|
|
12
|
-
from sqlalchemy.orm import sessionmaker
|
|
13
|
-
from sqlalchemy import FrozenResult
|
|
14
12
|
from sqlalchemy.ext.declarative import DeclarativeMeta
|
|
13
|
+
from sqlalchemy.orm import sessionmaker
|
|
15
14
|
|
|
16
15
|
########################################################################################################################
|
|
17
16
|
# CLASSES
|
|
@@ -180,7 +179,7 @@ class AlchemyInterface:
|
|
|
180
179
|
def windowed_query(
|
|
181
180
|
self,
|
|
182
181
|
stmt: Select[Any],
|
|
183
|
-
|
|
182
|
+
order_by: List[SQLColumnExpression[Any]],
|
|
184
183
|
windowsize: int,
|
|
185
184
|
) -> Iterator[Result[Any]]:
|
|
186
185
|
"""
|
|
@@ -188,26 +187,31 @@ class AlchemyInterface:
|
|
|
188
187
|
|
|
189
188
|
Args:
|
|
190
189
|
stmt: The SQL select statement to execute.
|
|
191
|
-
|
|
190
|
+
order_by: The columns to use for ordering.
|
|
192
191
|
windowsize: The number of rows to fetch in each window.
|
|
193
192
|
|
|
194
193
|
Returns:
|
|
195
194
|
An iterator of Result objects, each containing a window of data.
|
|
196
195
|
|
|
197
|
-
|
|
196
|
+
More info: https://github.com/sqlalchemy/sqlalchemy/wiki/RangeQuery-and-WindowedRangeQuery
|
|
198
197
|
"""
|
|
198
|
+
# Add row_number over the specified order
|
|
199
|
+
row_number = func.row_number().over(order_by=order_by).label("row_number")
|
|
199
200
|
|
|
200
201
|
# Add the windowing column to the statement and sort by it for deterministic results
|
|
201
|
-
|
|
202
|
-
|
|
202
|
+
inner_stmt = stmt.add_columns(row_number).order_by(row_number)
|
|
203
|
+
subq = inner_stmt.subquery()
|
|
203
204
|
|
|
204
|
-
|
|
205
|
-
|
|
205
|
+
# Create an outer query that selects from the subquery
|
|
206
|
+
cols = [c for c in subq.c]
|
|
207
|
+
outer_query = select(*cols)
|
|
206
208
|
|
|
207
|
-
|
|
208
|
-
subq = subq.filter(column > last_id)
|
|
209
|
+
last_row_number = 0
|
|
209
210
|
|
|
210
|
-
|
|
211
|
+
while True:
|
|
212
|
+
# Filter on row_number in the outer query
|
|
213
|
+
current_query = outer_query.where(subq.c.row_number > last_row_number).limit(windowsize)
|
|
214
|
+
result = self.session.execute(current_query)
|
|
211
215
|
|
|
212
216
|
# Create a FrozenResult to allow peeking at the data without consuming
|
|
213
217
|
frozen_result: FrozenResult = result.freeze()
|
|
@@ -216,13 +220,13 @@ class AlchemyInterface:
|
|
|
216
220
|
if not chunk:
|
|
217
221
|
break
|
|
218
222
|
|
|
219
|
-
|
|
220
|
-
|
|
223
|
+
# Update for next iteration
|
|
224
|
+
last_row_number = chunk[-1].row_number - 1
|
|
221
225
|
|
|
222
226
|
# Create a new Result object from the FrozenResult
|
|
223
|
-
yield_result
|
|
227
|
+
yield_result = frozen_result()
|
|
224
228
|
|
|
225
|
-
# Remove
|
|
226
|
-
yield_result = yield_result.columns(*
|
|
229
|
+
# Remove row_number from result
|
|
230
|
+
yield_result = yield_result.columns(*range(len(cols) - 1))
|
|
227
231
|
|
|
228
232
|
yield yield_result
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|