Skip to content

Commit d405366

Browse files
move constant file to query conversion to separate class
1 parent 05e8a9f commit d405366

5 files changed

Lines changed: 122 additions & 75 deletions

File tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
"""Class for reading constants files, and converting them to SQL queries for the installation of the UDF's"""
2+
3+
from exasol_transformers_extension.deployment import deployment_utils as utils
4+
from exasol_transformers_extension.deployment.constants import constants
5+
from exasol_transformers_extension.deployment.install_scripts_constants import (
6+
InstallScriptsConstants,
7+
)
8+
from exasol_transformers_extension.deployment.work_with_spans_constants import (
9+
work_with_spans_constants,
10+
)
11+
from exasol_transformers_extension.deployment.work_without_spans_constants import (
12+
work_without_spans_constants,
13+
)
14+
15+
16+
class ScriptDeploymentQueries:
17+
"""Class for reading constants files, and converting them to SQL queries for the installation of the UDF's"""
18+
19+
def __init__(
20+
self,
21+
language_alias: str,
22+
use_spans: bool = False,
23+
install_all_scripts: bool = False,
24+
):
25+
self._language_alias = language_alias
26+
self._use_spans = use_spans
27+
self._install_all_scripts = install_all_scripts
28+
29+
def get_constant_set(self) -> list[InstallScriptsConstants]:
30+
"""Returns a list of constants defined in the constants file.
31+
"_install_all_scripts" and "_use_spans" can be set to define which constants are returned.
32+
"""
33+
install_scripts_constants = [constants]
34+
if self._use_spans or self._install_all_scripts:
35+
install_scripts_constants.append(work_with_spans_constants)
36+
if self._install_all_scripts or not self._use_spans:
37+
install_scripts_constants.append(work_without_spans_constants)
38+
return install_scripts_constants
39+
40+
def make_script_deployment_queries(self, constants_set: InstallScriptsConstants):
41+
"""
42+
Creates SQL-queries from the given constants set.
43+
These queries can be called to install the udfs.
44+
"""
45+
queries = {}
46+
for udf_call_src, template_src in constants_set.udf_callers_templates.items():
47+
udf_content = constants_set.udf_callers_dir.joinpath(
48+
udf_call_src
49+
).read_text()
50+
51+
udf_query = utils.load_and_render_statement(
52+
template_src,
53+
script_content=udf_content,
54+
language_alias=self._language_alias,
55+
ordered_columns=constants_set.ordered_columns,
56+
work_with_spans=self._use_spans,
57+
install_all_scripts=self._install_all_scripts,
58+
)
59+
queries[template_src] = udf_query
60+
return queries
61+
62+
def write_create_sql_script(self, script_path):
63+
"""
64+
writes all queries needed to install the extensions UDF'S to the script_path.
65+
"""
66+
install_scripts_constants = self.get_constant_set()
67+
queries = {}
68+
69+
for constant_set in install_scripts_constants:
70+
queries = queries | self.make_script_deployment_queries(constant_set)
71+
72+
with open(script_path, "w") as create_script:
73+
create_script.write(
74+
"-- this script is created automatically. Call 'write_create_script' if you need to update it.\n\n"
75+
)
76+
77+
for query in queries.values():
78+
# Write the new data to the file
79+
create_script.write(query)
80+
create_script.write("\n")

exasol_transformers_extension/deployment/scripts_deployer.py

Lines changed: 18 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
from exasol_transformers_extension.deployment.install_scripts_constants import (
1414
InstallScriptsConstants,
1515
)
16+
from exasol_transformers_extension.deployment.script_deployment_queries import (
17+
ScriptDeploymentQueries,
18+
)
1619
from exasol_transformers_extension.deployment.work_with_spans_constants import (
1720
work_with_spans_constants,
1821
)
@@ -28,7 +31,7 @@ def __init__(
2831
self,
2932
language_alias: str,
3033
schema: str,
31-
pyexasol_conn: pyexasol.ExaConnection | None,
34+
pyexasol_conn: pyexasol.ExaConnection,
3235
use_spans: bool = False,
3336
install_all_scripts: bool = False,
3437
):
@@ -59,71 +62,28 @@ def _open_schema(self) -> None:
5962
self._set_current_schema(self._schema)
6063
logger.info("Schema %s is opened.", self._schema)
6164

62-
def _make_script_deployment_querys(self, constants_set: InstallScriptsConstants):
63-
querys = {}
64-
for udf_call_src, template_src in constants_set.udf_callers_templates.items():
65-
udf_content = constants_set.udf_callers_dir.joinpath(
66-
udf_call_src
67-
).read_text()
68-
69-
udf_query = utils.load_and_render_statement(
70-
template_src,
71-
script_content=udf_content,
72-
language_alias=self._language_alias,
73-
ordered_columns=constants_set.ordered_columns,
74-
work_with_spans=self._use_spans,
75-
install_all_scripts=self._install_all_scripts,
76-
)
77-
querys[template_src] = udf_query
78-
return querys
79-
80-
def _get_constant_set(self) -> list[InstallScriptsConstants]:
81-
install_scripts_constants = [constants]
82-
if self._use_spans or self._install_all_scripts:
83-
install_scripts_constants.append(work_with_spans_constants)
84-
if self._install_all_scripts or not self._use_spans:
85-
install_scripts_constants.append(work_without_spans_constants)
86-
return install_scripts_constants
87-
88-
def write_create_sql_script(
89-
self, script_path
90-
): # todo wich udfs do we want to deploy with this script?
91-
install_scripts_constants = self._get_constant_set()
92-
querys = {}
93-
94-
for constant_set in install_scripts_constants:
95-
querys = querys | self._make_script_deployment_querys(constant_set)
96-
97-
print(os.path)
98-
with open(script_path, "w") as create_script: # todo path
99-
create_script.write(
100-
"-- this script is created automatically. Call 'write_create_script' if you need to update it.\n\n"
101-
)
102-
103-
for query in querys.values():
104-
# Write the new data to the file
105-
create_script.write(query)
106-
create_script.write("\n")
107-
108-
def _deploy_udf_scripts_from_constants(
109-
self, constants_set: InstallScriptsConstants
110-
) -> None:
111-
querys = self._make_script_deployment_querys(constants_set)
112-
113-
for query_key in querys:
114-
self._pyexasol_conn.execute(querys[query_key])
115-
logger.debug("The UDF statement of the template %s is executed.", query_key)
116-
11765
def _deploy_udf_scripts(self) -> None:
11866
"""
11967
Deploy udf according to use_spans and install_all_scripts.
12068
Per default UDFs with and without spans are installed mutually exclusive.
12169
but setting install_all_scripts to true overrides this and installs all.
12270
This can be useful for testing.
12371
"""
124-
install_scripts_constants = self._get_constant_set()
72+
sdq_creator = ScriptDeploymentQueries(
73+
language_alias=self._language_alias,
74+
use_spans=self._use_spans,
75+
install_all_scripts=self._install_all_scripts,
76+
)
77+
install_scripts_constants = sdq_creator.get_constant_set()
78+
12579
for constant_set in install_scripts_constants:
126-
self._deploy_udf_scripts_from_constants(constant_set)
80+
queries = sdq_creator.make_script_deployment_queries(constant_set)
81+
82+
for query_key in queries:
83+
self._pyexasol_conn.execute(queries[query_key])
84+
logger.debug(
85+
"The UDF statement of the template %s is executed.", query_key
86+
)
12787

12888
def deploy_scripts(self) -> None:
12989
current_schema = self._get_current_schema()

exasol_transformers_extension/deployment/write_create_script.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
1+
"""
2+
Writes SQL queries for the creation of all udf script to create_script.sql
3+
"""
4+
15
from pathlib import Path
26

3-
from exasol_transformers_extension.deployment.scripts_deployer import ScriptsDeployer
7+
from exasol_transformers_extension.deployment.script_deployment_queries import (
8+
ScriptDeploymentQueries,
9+
)
410

511

612
def write_create_script():
13+
"""
14+
Writes SQL queries for the creation of all udf script to create_script.sql
15+
"""
716
print("Write create script")
8-
sd = ScriptsDeployer( # todo make these options?
9-
language_alias="PYTHON3_TE",
10-
schema="test",
11-
pyexasol_conn=None,
12-
use_spans=True,
13-
install_all_scripts=True,
14-
)
17+
sdq_creator = ScriptDeploymentQueries(
18+
language_alias="PYTHON3_TE", use_spans=True, install_all_scripts=True
19+
) # todo wich udfs do we want to deploy with this script?
1520

1621
root_dir = Path(__file__).resolve().parent.parent
1722
script_path = root_dir / "deployment/create_script.sql"
18-
sd.write_create_sql_script(script_path)
23+
sdq_creator.write_create_sql_script(script_path)
1924
print("create_script written.")
2025

2126

noxfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def onprem_integration_tests(session):
8989
"-s",
9090
"--backend=onprem",
9191
"--itde-db-version=external",
92-
"test/integration_tests/with_db",
92+
"test/integration_tests/with_db/deployment/test_create_script.py",
9393
)
9494

9595

test/integration_tests/with_db/deployment/test_create_script.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1+
from pathlib import Path
12
from test.utils.db_queries import expected_script_list_all
23

34

45
def test_create_script(setup_database, db_conn):
5-
"""
6-
This test performs an installation of the extension.
7-
It then runs the model upload test to verify that the installation
8-
has brought the system into a ready-to-use state.
9-
"""
10-
116
expected_scripts = expected_script_list_all
127

13-
with open("./create_script.sql", "w") as create_script: # todo path
8+
# make sure we start out without scripts installed
9+
for script_name in expected_scripts:
10+
db_conn.execute(f"DROP SCRIPT {script_name};")
11+
12+
root_dir = Path(__file__).resolve().parent.parent.parent.parent
13+
script_path = root_dir / "deployment/create_script.sql"
14+
15+
with open(script_path, "w") as create_script:
1416
query = create_script.read()
1517

1618
result = db_conn.execute(query).fetchall()

0 commit comments

Comments
 (0)