From 4dd2177c87280e5ad35c9afb86f538b9d2af899c Mon Sep 17 00:00:00 2001 From: ckunki Date: Wed, 9 Oct 2024 13:40:45 +0200 Subject: [PATCH] #191: Renamed `parameter` to `parameters` to match JSON input in user guide --- doc/changes/changes_0.1.0.md | 1 + .../lua/src/query_handler_runner_main.lua | 4 +- .../json_udf_query_handler_factory.py | 12 ++-- .../udf_query_handler_factory.py | 6 +- .../test_query_handlers/query_handler_test.py | 40 ++++++------- .../udf_framework/mock_query_handlers.py | 58 +++++++++---------- .../test_json_udf_query_handler.py | 38 ++++++------ 7 files changed, 82 insertions(+), 77 deletions(-) diff --git a/doc/changes/changes_0.1.0.md b/doc/changes/changes_0.1.0.md index f0da0875..5acc2c95 100644 --- a/doc/changes/changes_0.1.0.md +++ b/doc/changes/changes_0.1.0.md @@ -50,6 +50,7 @@ Code name: * #184: Updated micromamba to the latest version 2.0.0 * #176: Updated usage of `exasol-bucketfs` to new API * #185: Removed directory and script for building SLC AAF +* #191: Renamed `parameter` to `parameters` to match JSON input in user guide ### Documentation diff --git a/exasol_advanced_analytics_framework/lua/src/query_handler_runner_main.lua b/exasol_advanced_analytics_framework/lua/src/query_handler_runner_main.lua index b5be2d72..1363fe97 100644 --- a/exasol_advanced_analytics_framework/lua/src/query_handler_runner_main.lua +++ b/exasol_advanced_analytics_framework/lua/src/query_handler_runner_main.lua @@ -8,8 +8,8 @@ query_handler_runner = require("query_handler_runner") --- -- This is the main function of the Query Loop. -- --- @param json_str input parameters as JSON string --- @param exa the database context (`exa`) of the Lua script +-- @param json_str input parameters as JSON string +-- @param exa the database context (`exa`) of the Lua script -- function query_handler_runner_main(json_str, exa) return query_handler_runner.run(json_str, exa) diff --git a/exasol_advanced_analytics_framework/udf_framework/json_udf_query_handler_factory.py b/exasol_advanced_analytics_framework/udf_framework/json_udf_query_handler_factory.py index 5828f893..3791387a 100644 --- a/exasol_advanced_analytics_framework/udf_framework/json_udf_query_handler_factory.py +++ b/exasol_advanced_analytics_framework/udf_framework/json_udf_query_handler_factory.py @@ -13,13 +13,13 @@ class JsonUDFQueryHandler(UDFQueryHandler): - def __init__(self, parameter: str, + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext, wrapped_json_query_handler_class: Type[JSONQueryHandler]): - super().__init__(parameter, query_handler_context) - json_parameter = json.loads(parameter) + super().__init__(parameters, query_handler_context) + json_parameter = json.loads(parameters) self._wrapped_json_query_handler = wrapped_json_query_handler_class( - parameter=json_parameter, + parameters=json_parameter, query_handler_context=query_handler_context) def start(self) -> Union[Continue, Finish[str]]: @@ -46,8 +46,8 @@ class JsonUDFQueryHandlerFactory(UDFQueryHandlerFactory, ABC): def __init__(self, wrapped_json_query_handler_class: Type[JSONQueryHandler]): self._wrapped_json_query_handler_class = wrapped_json_query_handler_class - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: return JsonUDFQueryHandler( - parameter=parameter, + parameters=parameters, query_handler_context=query_handler_context, wrapped_json_query_handler_class=self._wrapped_json_query_handler_class) diff --git a/exasol_advanced_analytics_framework/udf_framework/udf_query_handler_factory.py b/exasol_advanced_analytics_framework/udf_framework/udf_query_handler_factory.py index 47162ddb..4ac14134 100644 --- a/exasol_advanced_analytics_framework/udf_framework/udf_query_handler_factory.py +++ b/exasol_advanced_analytics_framework/udf_framework/udf_query_handler_factory.py @@ -9,8 +9,12 @@ class UDFQueryHandlerFactory(ABC): """ An abstract class for factories which are injected by name to the QueryHandlerRunnerUDF which then will create the instance from the name. + + Parameters is of type ``str``. If you want to pass multiple parameters to + a query handler then these need to be encoded into a string, e.g. with + ``json.dumps()``. """ @abstractmethod - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: """Creates a UDFQueryHandler""" diff --git a/tests/test_package/test_query_handlers/query_handler_test.py b/tests/test_package/test_query_handlers/query_handler_test.py index 8ba70a5f..50cc4591 100644 --- a/tests/test_package/test_query_handlers/query_handler_test.py +++ b/tests/test_package/test_query_handlers/query_handler_test.py @@ -27,12 +27,12 @@ class QueryHandlerTestWithOneIteration(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) - if not isinstance(parameter, str): - raise AssertionError(f"Expected parameter={parameter} to be a string.") - if parameter != TEST_INPUT: - raise AssertionError(f"Expected parameter={parameter} to be '{TEST_INPUT}'.") + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) + if not isinstance(parameters, str): + raise AssertionError(f"Expected parameters={parameters} to be a string.") + if parameters != TEST_INPUT: + raise AssertionError(f"Expected parameters={parameters} to be '{TEST_INPUT}'.") def start(self) -> Union[Continue, Finish[ResultType]]: return Finish(result=FINAL_RESULT) @@ -43,14 +43,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class QueryHandlerTestWithOneIterationFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return QueryHandlerTestWithOneIteration(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return QueryHandlerTestWithOneIteration(parameters, query_handler_context) class QueryHandlerTestWithTwoIteration(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) def start(self) -> Union[Continue, Finish[str]]: return_query = 'SELECT 1 AS "a", 2 AS "b" FROM DUAL' @@ -80,13 +80,13 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class QueryHandlerTestWithTwoIterationFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return QueryHandlerTestWithTwoIteration(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return QueryHandlerTestWithTwoIteration(parameters, query_handler_context) class QueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) self.child = None def start(self) -> Union[Continue, Finish[str]]: @@ -99,14 +99,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class QueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContextFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return QueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return QueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(parameters, query_handler_context) class QueryHandlerWithOneIterationWithNotReleasedTemporaryObject(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) self.proxy = None self.child = None @@ -121,5 +121,5 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class QueryHandlerWithOneIterationWithNotReleasedTemporaryObjectFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return QueryHandlerWithOneIterationWithNotReleasedTemporaryObject(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return QueryHandlerWithOneIterationWithNotReleasedTemporaryObject(parameters, query_handler_context) diff --git a/tests/unit_tests/udf_framework/mock_query_handlers.py b/tests/unit_tests/udf_framework/mock_query_handlers.py index 086fbe2b..a1e0ca15 100644 --- a/tests/unit_tests/udf_framework/mock_query_handlers.py +++ b/tests/unit_tests/udf_framework/mock_query_handlers.py @@ -27,12 +27,12 @@ class MockQueryHandlerWithOneIteration(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) - if not isinstance(parameter, str): - raise AssertionError(f"Expected parameter={parameter} to be a string.") - if parameter != TEST_INPUT: - raise AssertionError(f"Expected parameter={parameter} to be '{TEST_INPUT}'.") + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) + if not isinstance(parameters, str): + raise AssertionError(f"Expected parameters={parameters} to be a string.") + if parameters != TEST_INPUT: + raise AssertionError(f"Expected parameters={parameters} to be '{TEST_INPUT}'.") def start(self) -> Union[Continue, Finish[str]]: return Finish(result=FINAL_RESULT) @@ -43,16 +43,16 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class MockQueryHandlerWithOneIterationFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return MockQueryHandlerWithOneIteration(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return MockQueryHandlerWithOneIteration(parameters, query_handler_context) class MockQueryHandlerWithTwoIterations(UDFQueryHandler): def __init__(self, - parameter: str, + parameters: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) - self._parameter = parameter + super().__init__(parameters, query_handler_context) + self._parameters = parameters def start(self) -> Union[Continue, Finish[str]]: return_query = "SELECT a, table1.b, c FROM table1, table2 " \ @@ -84,14 +84,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class MockQueryHandlerWithTwoIterationsFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return MockQueryHandlerWithTwoIterations(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return MockQueryHandlerWithTwoIterations(parameters, query_handler_context) class QueryHandlerTestWithOneIterationAndTempTable(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) def start(self) -> Union[Continue, Finish[str]]: self._query_handler_context.get_temporary_table_name() @@ -103,14 +103,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class QueryHandlerTestWithOneIterationAndTempTableFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return QueryHandlerTestWithOneIterationAndTempTable(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return QueryHandlerTestWithOneIterationAndTempTable(parameters, query_handler_context) class MockQueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) self.child = None def start(self) -> Union[Continue, Finish[str]]: @@ -123,14 +123,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class MockQueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContextFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return MockQueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return MockQueryHandlerWithOneIterationWithNotReleasedChildQueryHandlerContext(parameters, query_handler_context) class MockQueryHandlerWithOneIterationWithNotReleasedTemporaryObject(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) self.proxy = None self.child = None @@ -145,14 +145,14 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class MockQueryHandlerWithOneIterationWithNotReleasedTemporaryObjectFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return MockQueryHandlerWithOneIterationWithNotReleasedTemporaryObject(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return MockQueryHandlerWithOneIterationWithNotReleasedTemporaryObject(parameters, query_handler_context) class MockQueryHandlerUsingConnection(UDFQueryHandler): - def __init__(self, parameter: str, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: str, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) def start(self) -> Union[Continue, Finish[str]]: connection = self._query_handler_context.get_connection(TEST_CONNECTION) @@ -165,5 +165,5 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini class MockQueryHandlerUsingConnectionFactory(UDFQueryHandlerFactory): - def create(self, parameter: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: - return MockQueryHandlerUsingConnection(parameter, query_handler_context) + def create(self, parameters: str, query_handler_context: ScopeQueryHandlerContext) -> UDFQueryHandler: + return MockQueryHandlerUsingConnection(parameters, query_handler_context) diff --git a/tests/unit_tests/udf_framework/test_json_udf_query_handler.py b/tests/unit_tests/udf_framework/test_json_udf_query_handler.py index 8ae06ba5..98076c13 100644 --- a/tests/unit_tests/udf_framework/test_json_udf_query_handler.py +++ b/tests/unit_tests/udf_framework/test_json_udf_query_handler.py @@ -19,8 +19,8 @@ class ConstructorTestJSONQueryHandler(JSONQueryHandler): - def __init__(self, parameter: JSONType, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) + def __init__(self, parameters: JSONType, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) def start(self) -> Union[Continue, Finish[JSONType]]: raise AssertionError("Should not be called") @@ -30,12 +30,12 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini def test_constructor_valid_json(top_level_query_handler_context): - parameter = { + parameters = { "test_key": "test_value" } - json_str_parameter = json.dumps(parameter) + json_str_parameter = json.dumps(parameters) query_handler = JsonUDFQueryHandler( - parameter=json_str_parameter, + parameters=json_str_parameter, query_handler_context=top_level_query_handler_context, wrapped_json_query_handler_class=ConstructorTestJSONQueryHandler ) @@ -44,7 +44,7 @@ def test_constructor_valid_json(top_level_query_handler_context): def test_constructor_invalid_json(top_level_query_handler_context): with pytest.raises(JSONDecodeError): query_handler = JsonUDFQueryHandler( - parameter="'abc'='ced'", + parameters="'abc'='ced'", query_handler_context=top_level_query_handler_context, wrapped_json_query_handler_class=ConstructorTestJSONQueryHandler ) @@ -52,24 +52,24 @@ def test_constructor_invalid_json(top_level_query_handler_context): class StartReturnParameterTestJSONQueryHandler(JSONQueryHandler): - def __init__(self, parameter: JSONType, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) - self._parameter = parameter + def __init__(self, parameters: JSONType, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) + self._parameters = parameters def start(self) -> Union[Continue, Finish[JSONType]]: - return Finish[JSONType](self._parameter) + return Finish[JSONType](self._parameters) def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Finish[JSONType]]: raise AssertionError("Should not be called") def test_start_return_parameter(top_level_query_handler_context): - parameter = { + parameters = { "test_key": "test_value" } - json_str_parameter = json.dumps(parameter) + json_str_parameter = json.dumps(parameters) query_handler = JsonUDFQueryHandler( - parameter=json_str_parameter, + parameters=json_str_parameter, query_handler_context=top_level_query_handler_context, wrapped_json_query_handler_class=StartReturnParameterTestJSONQueryHandler ) @@ -79,9 +79,9 @@ def test_start_return_parameter(top_level_query_handler_context): class HandleQueryResultCheckQueryResultTestJSONQueryHandler(JSONQueryHandler): - def __init__(self, parameter: JSONType, query_handler_context: ScopeQueryHandlerContext): - super().__init__(parameter, query_handler_context) - self._parameter = parameter + def __init__(self, parameters: JSONType, query_handler_context: ScopeQueryHandlerContext): + super().__init__(parameters, query_handler_context) + self._parameters = parameters def start(self) -> Union[Continue, Finish[JSONType]]: raise AssertionError("Should not be called") @@ -92,12 +92,12 @@ def handle_query_result(self, query_result: QueryResult) -> Union[Continue, Fini def test_handle_query_result_check_query_result(top_level_query_handler_context): - parameter = { + parameters = { "test_key": "test_value" } - json_str_parameter = json.dumps(parameter) + json_str_parameter = json.dumps(parameters) query_handler = JsonUDFQueryHandler( - parameter=json_str_parameter, + parameters=json_str_parameter, query_handler_context=top_level_query_handler_context, wrapped_json_query_handler_class=HandleQueryResultCheckQueryResultTestJSONQueryHandler )