datajunction-query 0.0.1a61__py3-none-any.whl → 0.0.1a62__py3-none-any.whl
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 datajunction-query might be problematic. Click here for more details.
- {datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/METADATA +1 -1
- {datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/RECORD +10 -10
- djqs/__about__.py +1 -1
- djqs/api/main.py +1 -1
- djqs/api/queries.py +6 -4
- djqs/constants.py +3 -0
- djqs/engine.py +29 -6
- {datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/WHEEL +0 -0
- {datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/licenses/AUTHORS.rst +0 -0
- {datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: datajunction-query
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.1a62
|
|
4
4
|
Summary: OSS Implementation of a DataJunction Query Service
|
|
5
5
|
Project-URL: repository, https://github.com/DataJunction/dj
|
|
6
6
|
Author-email: DataJunction Authors <roberto@dealmeida.net>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
djqs/__about__.py,sha256=
|
|
1
|
+
djqs/__about__.py,sha256=CutNphqU7kSQIFVLpZyS_P1sGJgbzf_o5Rh_gCBvt2E,51
|
|
2
2
|
djqs/__init__.py,sha256=nN5-uJoSVEwuc8n-wMygqeF0Xhxi_zqqbCgutZvAt3E,384
|
|
3
3
|
djqs/config.py,sha256=Flva9W8McnTunUlHGhYd0CsgbsjWbZIoPW25ZTzFxws,3029
|
|
4
|
-
djqs/constants.py,sha256=
|
|
5
|
-
djqs/engine.py,sha256=
|
|
4
|
+
djqs/constants.py,sha256=WS0uC-cKLQ_ZPhtevcv6tJ8WI6UtxYGZwTqJJtsTep0,485
|
|
5
|
+
djqs/engine.py,sha256=H3tSKVgBBc24OWMwl6Acz1DjaciF23kBik98w2cVXUU,6453
|
|
6
6
|
djqs/enum.py,sha256=GJVLYDJ2zWjjUBENgyjZZ_94A24BJtvci-AKTmA0zek,590
|
|
7
7
|
djqs/exceptions.py,sha256=z-EjGLRwHL_v3zl1-RICwQis7wUwl3000tse0YwuoBE,4992
|
|
8
8
|
djqs/fixes.py,sha256=TcXnh0I1z4vEAupPatzrvnqyToGihndnxmLJtIn-_Z8,33
|
|
@@ -12,16 +12,16 @@ djqs/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
12
12
|
djqs/api/catalogs.py,sha256=I_i8-Nok0V3ND1FpOCQ5Nmgaof5MLH8i0oeTjvDxQgw,3062
|
|
13
13
|
djqs/api/engines.py,sha256=278fsgIgQXe4WAmbfbxoA08ALe57us_zKlaK_hbiDrc,1611
|
|
14
14
|
djqs/api/helpers.py,sha256=91UGqs-SAq3fCU9yElBMev9vqtDospOjBq0icfFl1qs,2468
|
|
15
|
-
djqs/api/main.py,sha256=
|
|
16
|
-
djqs/api/queries.py,sha256=
|
|
15
|
+
djqs/api/main.py,sha256=Sjhh41RIoj-d1BQpBquW9D8O0n0Ft9Ka2Ntq7i_lo3o,2081
|
|
16
|
+
djqs/api/queries.py,sha256=eCs7dKt0mOJ8tGUNIk0nomWG7m_VPsnjUUJ7c7_dvuA,5643
|
|
17
17
|
djqs/api/tables.py,sha256=1hwYPRAG9kZfS8HE3r_omC4AjHadAbdhFIwx3e4KOvo,1582
|
|
18
18
|
djqs/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
19
|
djqs/models/catalog.py,sha256=o3Wlghwr6ax4Eo-3zE5Mdq478xyUxeaf2o3whFprXtU,2038
|
|
20
20
|
djqs/models/engine.py,sha256=k9cBvnYAfzz4yaBDvErDqXIwlqrRsKRbGikBKTQHJPA,889
|
|
21
21
|
djqs/models/query.py,sha256=Qsy69Cfrkn5myOZZfLrR83JB4ynPXogitUo8A7hRsz8,3338
|
|
22
22
|
djqs/models/table.py,sha256=7HmiXWHBWEthqdwPYLlsOgeKD-w9urCHoC4xaQ1RnM8,238
|
|
23
|
-
datajunction_query-0.0.
|
|
24
|
-
datajunction_query-0.0.
|
|
25
|
-
datajunction_query-0.0.
|
|
26
|
-
datajunction_query-0.0.
|
|
27
|
-
datajunction_query-0.0.
|
|
23
|
+
datajunction_query-0.0.1a62.dist-info/METADATA,sha256=3L3Cg3n-OUE9vopB_3GNzJKNppk0_aoSLJz4-St5KOs,9495
|
|
24
|
+
datajunction_query-0.0.1a62.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
25
|
+
datajunction_query-0.0.1a62.dist-info/licenses/AUTHORS.rst,sha256=G9YmXPfQ0kAuxqlCwvWVvUnZitP9hAc-rPfZ5q7Pv1U,235
|
|
26
|
+
datajunction_query-0.0.1a62.dist-info/licenses/LICENSE.txt,sha256=KuSxhVgPuUGoYWphJig4POcTAIUNLUj8vOx-cqQFMj8,1081
|
|
27
|
+
datajunction_query-0.0.1a62.dist-info/RECORD,,
|
djqs/__about__.py
CHANGED
djqs/api/main.py
CHANGED
|
@@ -32,7 +32,7 @@ async def lifespan(app: FastAPI): # pylint: disable=W0621,W0613
|
|
|
32
32
|
"""
|
|
33
33
|
try:
|
|
34
34
|
load_djqs_config(settings=settings, session=session)
|
|
35
|
-
except Exception as e: # pylint: disable=W0718
|
|
35
|
+
except Exception as e: # pylint: disable=W0718,C0103
|
|
36
36
|
_logger.warning("Could not load DJQS config: %s", e)
|
|
37
37
|
yield
|
|
38
38
|
|
djqs/api/queries.py
CHANGED
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import uuid
|
|
7
7
|
from http import HTTPStatus
|
|
8
|
-
from typing import Any, List, Optional
|
|
8
|
+
from typing import Any, Dict, List, Optional
|
|
9
9
|
|
|
10
10
|
import msgpack
|
|
11
11
|
from accept_types import get_best_match
|
|
@@ -105,6 +105,7 @@ async def submit_query( # pylint: disable=too-many-arguments
|
|
|
105
105
|
settings,
|
|
106
106
|
response,
|
|
107
107
|
background_tasks,
|
|
108
|
+
request.headers,
|
|
108
109
|
)
|
|
109
110
|
|
|
110
111
|
return_type = get_best_match(accept, ["application/json", "application/msgpack"])
|
|
@@ -129,12 +130,13 @@ async def submit_query( # pylint: disable=too-many-arguments
|
|
|
129
130
|
)
|
|
130
131
|
|
|
131
132
|
|
|
132
|
-
def save_query_and_run(
|
|
133
|
+
def save_query_and_run( # pylint: disable=R0913
|
|
133
134
|
create_query: QueryCreate,
|
|
134
135
|
session: Session,
|
|
135
136
|
settings: Settings,
|
|
136
137
|
response: Response,
|
|
137
138
|
background_tasks: BackgroundTasks,
|
|
139
|
+
headers: Optional[Dict[str, str]] = None,
|
|
138
140
|
) -> QueryResults:
|
|
139
141
|
"""
|
|
140
142
|
Store a new query to the DB and run it.
|
|
@@ -147,12 +149,12 @@ def save_query_and_run(
|
|
|
147
149
|
session.refresh(query)
|
|
148
150
|
|
|
149
151
|
if query.async_:
|
|
150
|
-
background_tasks.add_task(process_query, session, settings, query)
|
|
152
|
+
background_tasks.add_task(process_query, session, settings, query, headers)
|
|
151
153
|
|
|
152
154
|
response.status_code = HTTPStatus.CREATED
|
|
153
155
|
return QueryResults(results=[], errors=[], **query.dict())
|
|
154
156
|
|
|
155
|
-
return process_query(session, settings, query)
|
|
157
|
+
return process_query(session, settings, query, headers)
|
|
156
158
|
|
|
157
159
|
|
|
158
160
|
def load_query_results(
|
djqs/constants.py
CHANGED
djqs/engine.py
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Query related functions.
|
|
3
3
|
"""
|
|
4
|
-
|
|
5
4
|
import logging
|
|
6
5
|
import os
|
|
7
6
|
from datetime import datetime, timezone
|
|
8
|
-
from typing import List, Tuple
|
|
7
|
+
from typing import Dict, List, Optional, Tuple
|
|
9
8
|
|
|
10
9
|
import duckdb
|
|
11
10
|
import snowflake.connector
|
|
@@ -14,6 +13,7 @@ from sqlalchemy import create_engine, text
|
|
|
14
13
|
from sqlmodel import Session, select
|
|
15
14
|
|
|
16
15
|
from djqs.config import Settings
|
|
16
|
+
from djqs.constants import SQLALCHEMY_URI
|
|
17
17
|
from djqs.models.engine import Engine, EngineType
|
|
18
18
|
from djqs.models.query import (
|
|
19
19
|
ColumnMetadata,
|
|
@@ -66,9 +66,10 @@ def get_columns_from_description(
|
|
|
66
66
|
return columns
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
def run_query(
|
|
69
|
+
def run_query( # pylint: disable=R0914
|
|
70
70
|
session: Session,
|
|
71
71
|
query: Query,
|
|
72
|
+
headers: Optional[Dict[str, str]] = None,
|
|
72
73
|
) -> List[Tuple[str, List[ColumnMetadata], Stream]]:
|
|
73
74
|
"""
|
|
74
75
|
Run a query and return its results.
|
|
@@ -76,13 +77,25 @@ def run_query(
|
|
|
76
77
|
For each statement we return a tuple with the statement SQL, a description of the
|
|
77
78
|
columns (name and type) and a stream of rows (tuples).
|
|
78
79
|
"""
|
|
80
|
+
|
|
79
81
|
_logger.info("Running query on catalog %s", query.catalog_name)
|
|
82
|
+
|
|
80
83
|
engine = session.exec(
|
|
81
84
|
select(Engine)
|
|
82
85
|
.where(Engine.name == query.engine_name)
|
|
83
86
|
.where(Engine.version == query.engine_version),
|
|
84
87
|
).one()
|
|
85
|
-
|
|
88
|
+
|
|
89
|
+
query_server = headers.get("SQLALCHEMY_URI") if headers else None
|
|
90
|
+
|
|
91
|
+
if query_server:
|
|
92
|
+
_logger.info(
|
|
93
|
+
"Creating sqlalchemy engine using request header param %s",
|
|
94
|
+
SQLALCHEMY_URI,
|
|
95
|
+
)
|
|
96
|
+
sqla_engine = create_engine(query_server)
|
|
97
|
+
elif engine.type == EngineType.DUCKDB:
|
|
98
|
+
_logger.info("Creating duckdb connection")
|
|
86
99
|
conn = (
|
|
87
100
|
duckdb.connect()
|
|
88
101
|
if engine.uri == "duckdb:///:memory:"
|
|
@@ -92,7 +105,8 @@ def run_query(
|
|
|
92
105
|
)
|
|
93
106
|
)
|
|
94
107
|
return run_duckdb_query(query, conn)
|
|
95
|
-
|
|
108
|
+
elif engine.type == EngineType.SNOWFLAKE:
|
|
109
|
+
_logger.info("Creating snowflake connection")
|
|
96
110
|
conn = snowflake.connector.connect(
|
|
97
111
|
**engine.extra_params,
|
|
98
112
|
password=os.getenv("SNOWSQL_PWD"),
|
|
@@ -100,6 +114,10 @@ def run_query(
|
|
|
100
114
|
cur = conn.cursor()
|
|
101
115
|
|
|
102
116
|
return run_snowflake_query(query, cur)
|
|
117
|
+
|
|
118
|
+
_logger.info(
|
|
119
|
+
"Creating sqlalchemy engine using engine name and version defined on query",
|
|
120
|
+
)
|
|
103
121
|
sqla_engine = create_engine(engine.uri, connect_args=engine.extra_params)
|
|
104
122
|
connection = sqla_engine.connect()
|
|
105
123
|
|
|
@@ -152,6 +170,7 @@ def process_query(
|
|
|
152
170
|
session: Session,
|
|
153
171
|
settings: Settings,
|
|
154
172
|
query: Query,
|
|
173
|
+
headers: Optional[Dict[str, str]] = None,
|
|
155
174
|
) -> QueryResults:
|
|
156
175
|
"""
|
|
157
176
|
Process a query.
|
|
@@ -164,7 +183,11 @@ def process_query(
|
|
|
164
183
|
query.started = datetime.now(timezone.utc)
|
|
165
184
|
try:
|
|
166
185
|
root = []
|
|
167
|
-
for sql, columns, stream in run_query(
|
|
186
|
+
for sql, columns, stream in run_query(
|
|
187
|
+
session=session,
|
|
188
|
+
query=query,
|
|
189
|
+
headers=headers,
|
|
190
|
+
):
|
|
168
191
|
rows = list(stream)
|
|
169
192
|
root.append(
|
|
170
193
|
StatementResults(
|
|
File without changes
|
{datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/licenses/AUTHORS.rst
RENAMED
|
File without changes
|
{datajunction_query-0.0.1a61.dist-info → datajunction_query-0.0.1a62.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|