fdc-shared-kernel 0.0.200__tar.gz → 0.0.201__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.
Files changed (206) hide show
  1. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/PKG-INFO +1 -1
  2. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
  3. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/fdc_shared_kernel.egg-info/SOURCES.txt +0 -4
  4. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/pyproject.toml +1 -1
  5. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/warehouse_handlers_map.py +1 -2
  6. fdc_shared_kernel-0.0.200/shared_kernel/data_warehouse_handlers/connections/csv_warehouse_connection.py +0 -161
  7. fdc_shared_kernel-0.0.200/shared_kernel/data_warehouse_handlers/csv_handler.py +0 -55
  8. fdc_shared_kernel-0.0.200/shared_kernel/data_warehouse_handlers/custom_query_builders/athena_query.py +0 -27
  9. fdc_shared_kernel-0.0.200/shared_kernel/data_warehouse_handlers/query_executors/csv_query_executor.py +0 -105
  10. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/README.md +0 -0
  11. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/README_pypi.md +0 -0
  12. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  13. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/fdc_shared_kernel.egg-info/requires.txt +0 -0
  14. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  15. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/requirements.txt +0 -0
  16. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/setup.cfg +0 -0
  17. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/__init__.py +0 -0
  18. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/agent_communication_channel/__init__.py +0 -0
  19. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/agent_communication_channel/agent_channel.py +0 -0
  20. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/agent_communication_channel/contexts.py +0 -0
  21. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/agent_communication_channel/event_channel.py +0 -0
  22. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/ai_audit_log/__init__.py +0 -0
  23. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/ai_chat_persistence/__init__.py +0 -0
  24. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/ai_chat_persistence/chat_persistence.py +0 -0
  25. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/async_task_executor/__init__.py +0 -0
  26. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/async_task_executor/async_task_executor.py +0 -0
  27. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/auth/__init__.py +0 -0
  28. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/auth/jwt_helper.py +0 -0
  29. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/auth/token_handler.py +0 -0
  30. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/auth/workbook_permission_handler.py +0 -0
  31. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/aws/__init__.py +0 -0
  32. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/aws/athena_client.py +0 -0
  33. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/__init__.py +0 -0
  34. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/batch_job_status_tracker/container_job_status_tracker.py +0 -0
  35. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_handlers/__init__.py +0 -0
  36. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_handlers/aws_batch_job_handler.py +0 -0
  37. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_handlers/azure_apps_job_handler.py +0 -0
  38. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_handlers/job_handler_factory.py +0 -0
  39. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_handlers/job_status_mapper.py +0 -0
  40. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_storage_managers/__init__.py +0 -0
  41. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_storage_managers/azure_blob_storage_manager.py +0 -0
  42. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_storage_managers/job_storage_manager_factory.py +0 -0
  43. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/batch_job/job_storage_managers/s3_job_storage_manager.py +0 -0
  44. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/config/__init__.py +0 -0
  45. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/constants/constants.py +0 -0
  46. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/__init__.py +0 -0
  47. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/base_executor.py +0 -0
  48. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/databricks_warehouse_connection.py +0 -0
  49. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/fabric_sql_warehouse_connection.py +0 -0
  50. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/jdbc_warehouse_connection.py +0 -0
  51. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/mssql_warehouse_connection.py +0 -0
  52. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/mysql_warehouse_connection.py +0 -0
  53. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/postgresql_warehouse_connection.py +0 -0
  54. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/redshift_warehouse_connection.py +0 -0
  55. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/connections/snowflake_warehouse_connection.py +0 -0
  56. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/custom_query_builders/databricks_query.py +0 -0
  57. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/databricks_handler.py +0 -0
  58. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/fabric_sql_handler.py +0 -0
  59. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/factory.py +0 -0
  60. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/jdbc_driver_registry.py +0 -0
  61. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/jdbc_handler.py +0 -0
  62. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/mssql_handler.py +0 -0
  63. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/mysql_handler.py +0 -0
  64. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/odbc_handler.py +0 -0
  65. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/postgresql_handler.py +0 -0
  66. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/databricks_query_executor.py +0 -0
  67. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/fabric_sql_query_executor.py +0 -0
  68. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/jdbc_query_executor.py +0 -0
  69. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/mssql_query_executor.py +0 -0
  70. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/mysql_query_executor.py +0 -0
  71. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/postgresql_query_executor.py +0 -0
  72. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/redshift_query_executor.py +0 -0
  73. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/query_executors/snowflake_query_executor.py +0 -0
  74. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/redshift_handler.py +0 -0
  75. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/snowflake_handler.py +0 -0
  76. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/data_warehouse_handlers/utils.py +0 -0
  77. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/database/__init__.py +0 -0
  78. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/__init__.py +0 -0
  79. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/aws_batch_job_context.py +0 -0
  80. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/azure_container_app_job_context.py +0 -0
  81. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/event_executor.py +0 -0
  82. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/job_context.py +0 -0
  83. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/job_record_dataclasses.py +0 -0
  84. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/dataclasses/warehouse_configs.py +0 -0
  85. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/__init__.py +0 -0
  86. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/__init__.py +0 -0
  87. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/csv.py +0 -0
  88. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/databricks.py +0 -0
  89. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/db2.py +0 -0
  90. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/jdbc.py +0 -0
  91. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/jira.py +0 -0
  92. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/mssql.py +0 -0
  93. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/mysql.py +0 -0
  94. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/oracle.py +0 -0
  95. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/postgres.py +0 -0
  96. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/redshift.py +0 -0
  97. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/salesforce.py +0 -0
  98. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/snowflake.py +0 -0
  99. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/connectors_to_system/sqlalchemy.py +0 -0
  100. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/system_to_warehouse/__init__.py +0 -0
  101. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/system_to_warehouse/postgres.py +0 -0
  102. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/datatype_mappings/system_to_warehouse/redshift.py +0 -0
  103. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/enums/__init__.py +0 -0
  104. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/enums/async_task_executor.py +0 -0
  105. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/enums/connection_engine.py +0 -0
  106. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/enums/status_tracker.py +0 -0
  107. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/event_executor/__init__.py +0 -0
  108. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/event_executor/event_executor.py +0 -0
  109. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/event_executor/job_executor.py +0 -0
  110. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/event_executor/utils.py +0 -0
  111. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/__init__.py +0 -0
  112. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/batch_job_exceptions.py +0 -0
  113. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  114. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/custom_exceptions.py +0 -0
  115. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  116. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/http_exceptions.py +0 -0
  117. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  118. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/operational_exceptions.py +0 -0
  119. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/security_exceptions.py +0 -0
  120. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/exceptions/user_intervention_exception.py +0 -0
  121. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/http/__init__.py +0 -0
  122. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/http/httpx_http_client.py +0 -0
  123. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/http/request_http_client.py +0 -0
  124. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/__init__.py +0 -0
  125. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/base_job_handler.py +0 -0
  126. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/data_warehouse_handler.py +0 -0
  127. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/databus.py +0 -0
  128. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/encryption.py +0 -0
  129. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/http.py +0 -0
  130. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/keyvault.py +0 -0
  131. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/query_executor.py +0 -0
  132. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/storage_manager.py +0 -0
  133. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/interfaces/warehouse_connection.py +0 -0
  134. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/logger/__init__.py +0 -0
  135. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/__init__.py +0 -0
  136. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/aws_databus.py +0 -0
  137. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/azure_databus.py +0 -0
  138. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/http_databus.py +0 -0
  139. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/nats_databus.py +0 -0
  140. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/nats_publisher.py +0 -0
  141. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/nats_test.py +0 -0
  142. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/utils/aws_utility.py +0 -0
  143. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/utils/azure_utility.py +0 -0
  144. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/messaging/utils/event_messages.py +0 -0
  145. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/metrics/__init__.py +0 -0
  146. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/metrics/status_tracker.py +0 -0
  147. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/models/__init__.py +0 -0
  148. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/registries/__init__.py +0 -0
  149. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/registries/schema_onboarding_event_registry.py +0 -0
  150. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/registries/service_event_registry.py +0 -0
  151. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/__init__.py +0 -0
  152. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/base_tracker.py +0 -0
  153. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/enums.py +0 -0
  154. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/exceptions.py +0 -0
  155. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/run_manager.py +0 -0
  156. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/schema_onboarding_tracker.py +0 -0
  157. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/shared_helpers.py +0 -0
  158. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/task_determination.py +0 -0
  159. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/task_helpers.py +0 -0
  160. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/task_manager.py +0 -0
  161. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/template_manager.py +0 -0
  162. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/schema_onboarding_tracker/utility_manager.py +0 -0
  163. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/__init__.py +0 -0
  164. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/encryption/__init__.py +0 -0
  165. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/encryption/manager.py +0 -0
  166. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/encryption/providers.py +0 -0
  167. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/key_vault/__init__.py +0 -0
  168. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
  169. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
  170. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/status_tracker/__init__.py +0 -0
  171. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/status_tracker/status_tracker.py +0 -0
  172. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/storage_handlers/__init__.py +0 -0
  173. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/storage_handlers/blob_file_handler.py +0 -0
  174. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/storage_handlers/s3_storage_handler.py +0 -0
  175. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/__init__.py +0 -0
  176. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/config/__init__.py +0 -0
  177. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/config/test_config.py +0 -0
  178. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/logger/__init__.py +0 -0
  179. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/logger/test_logger.py +0 -0
  180. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/messaging/__init__.py +0 -0
  181. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/messaging/test_aws_databus.py +0 -0
  182. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/messaging/test_event_executor.py +0 -0
  183. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  184. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/security/test_encryption.py +0 -0
  185. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/utils/__init__.py +0 -0
  186. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/utils/test_data_validators.py +0 -0
  187. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  188. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/tests/utils/test_string_utils.py +0 -0
  189. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/traceability/__init__.py +0 -0
  190. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/traceability/traceability_handler.py +0 -0
  191. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/__init__.py +0 -0
  192. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/data_validators_utils.py +0 -0
  193. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/date_format_utils.py +0 -0
  194. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/date_utils.py +0 -0
  195. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/logging_utils.py +0 -0
  196. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/request_id.py +0 -0
  197. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/string_utils.py +0 -0
  198. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/template_renderer.py +0 -0
  199. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/thread_debug_utils.py +0 -0
  200. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/thread_local_storage.py +0 -0
  201. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/shared_kernel/utils/thread_log_traker.py +0 -0
  202. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/tests/__init__.py +0 -0
  203. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/tests/messaging/__init__.py +0 -0
  204. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/tests/messaging/utils/__init__.py +0 -0
  205. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/tests/messaging/utils/test_aws_utility.py +0 -0
  206. {fdc_shared_kernel-0.0.200 → fdc_shared_kernel-0.0.201}/tests/test_job_executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.200
3
+ Version: 0.0.201
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.200
3
+ Version: 0.0.201
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -38,7 +38,6 @@ shared_kernel/config/__init__.py
38
38
  shared_kernel/constants/constants.py
39
39
  shared_kernel/data_warehouse_handlers/__init__.py
40
40
  shared_kernel/data_warehouse_handlers/base_executor.py
41
- shared_kernel/data_warehouse_handlers/csv_handler.py
42
41
  shared_kernel/data_warehouse_handlers/databricks_handler.py
43
42
  shared_kernel/data_warehouse_handlers/fabric_sql_handler.py
44
43
  shared_kernel/data_warehouse_handlers/factory.py
@@ -52,7 +51,6 @@ shared_kernel/data_warehouse_handlers/redshift_handler.py
52
51
  shared_kernel/data_warehouse_handlers/snowflake_handler.py
53
52
  shared_kernel/data_warehouse_handlers/utils.py
54
53
  shared_kernel/data_warehouse_handlers/warehouse_handlers_map.py
55
- shared_kernel/data_warehouse_handlers/connections/csv_warehouse_connection.py
56
54
  shared_kernel/data_warehouse_handlers/connections/databricks_warehouse_connection.py
57
55
  shared_kernel/data_warehouse_handlers/connections/fabric_sql_warehouse_connection.py
58
56
  shared_kernel/data_warehouse_handlers/connections/jdbc_warehouse_connection.py
@@ -61,9 +59,7 @@ shared_kernel/data_warehouse_handlers/connections/mysql_warehouse_connection.py
61
59
  shared_kernel/data_warehouse_handlers/connections/postgresql_warehouse_connection.py
62
60
  shared_kernel/data_warehouse_handlers/connections/redshift_warehouse_connection.py
63
61
  shared_kernel/data_warehouse_handlers/connections/snowflake_warehouse_connection.py
64
- shared_kernel/data_warehouse_handlers/custom_query_builders/athena_query.py
65
62
  shared_kernel/data_warehouse_handlers/custom_query_builders/databricks_query.py
66
- shared_kernel/data_warehouse_handlers/query_executors/csv_query_executor.py
67
63
  shared_kernel/data_warehouse_handlers/query_executors/databricks_query_executor.py
68
64
  shared_kernel/data_warehouse_handlers/query_executors/fabric_sql_query_executor.py
69
65
  shared_kernel/data_warehouse_handlers/query_executors/jdbc_query_executor.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fdc_shared_kernel"
7
- version = "0.0.200"
7
+ version = "0.0.201"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -8,7 +8,6 @@ from shared_kernel.data_warehouse_handlers.redshift_handler import RedshiftWareh
8
8
  from shared_kernel.data_warehouse_handlers.snowflake_handler import SnowflakeWarehouseHandler
9
9
  from shared_kernel.data_warehouse_handlers.jdbc_handler import JDBCWarehouseHandler
10
10
  from shared_kernel.data_warehouse_handlers.fabric_sql_handler import FabricSQLWarehouseHandler
11
- from shared_kernel.data_warehouse_handlers.csv_handler import CSVWarehouseHandler
12
11
  from shared_kernel.enums.connection_engine import ConnectionEngine
13
12
 
14
13
 
@@ -23,5 +22,5 @@ warehouse_handlers = {
23
22
  ConnectionEngine.DATABRICKS.value: DatabricksWarehouseHandler,
24
23
  ConnectionEngine.JDBC.value: JDBCWarehouseHandler,
25
24
  ConnectionEngine.FABRIC_SQL.value: FabricSQLWarehouseHandler,
26
- ConnectionEngine.CSV.value: CSVWarehouseHandler,
25
+ ConnectionEngine.CSV.value: RedshiftWarehouseHandler,
27
26
  }
@@ -1,161 +0,0 @@
1
- import time
2
- from contextlib import contextmanager
3
-
4
- from shared_kernel.aws.athena_client import build_athena_client, build_aws_client
5
- from shared_kernel.config import Config
6
- from shared_kernel.dataclasses.warehouse_configs import CSVConfig
7
- from shared_kernel.exceptions.http_exceptions import BadRequest
8
- from shared_kernel.interfaces.warehouse_connection import DataWarehouseConnection, cancel_check_connection
9
- from shared_kernel.logger import Logger
10
-
11
- config = Config()
12
- logger = Logger(config.get("APP_NAME"))
13
-
14
- TERMINAL_STATES = ("SUCCEEDED", "FAILED", "CANCELLED")
15
-
16
-
17
- class AthenaCursor:
18
- """Cursor-like adapter over boto3 Athena start_query_execution/poll/get_query_results,
19
- so Athena's async query model can be used behind the same cursor-shaped contract.
20
- """
21
-
22
- def __init__(
23
- self,
24
- athena_client,
25
- database: str,
26
- output_location: str,
27
- role_arn: str = None,
28
- region: str = None,
29
- poll_interval: float = 1.0,
30
- ):
31
- self._client = athena_client
32
- self._database = database
33
- self._output_location = output_location
34
- self._role_arn = role_arn
35
- self._region = region
36
- self._poll_interval = poll_interval
37
- self._columns = []
38
- self._column_types = []
39
- self._rows = []
40
- self._exec_id = None
41
-
42
- @property
43
- def description(self):
44
- # DB-API-shaped: (name, type_code, ...) — type_code holds the Athena/
45
- # Presto native type string (e.g. "varchar", "bigint")
46
- return [
47
- (name, type_code, None, None, None, None, None)
48
- for name, type_code in zip(self._columns, self._column_types)
49
- ]
50
-
51
- def execute(self, query: str, params: tuple = None):
52
- exec_response = self._client.start_query_execution(
53
- QueryString=query,
54
- QueryExecutionContext={"Database": self._database},
55
- ResultConfiguration={"OutputLocation": self._output_location},
56
- WorkGroup="primary",
57
- )
58
- self._exec_id = exec_response["QueryExecutionId"]
59
-
60
- while True:
61
- stats = self._client.get_query_execution(QueryExecutionId=self._exec_id)
62
- state = stats["QueryExecution"]["Status"]["State"]
63
- if state in TERMINAL_STATES:
64
- break
65
- time.sleep(self._poll_interval)
66
-
67
- if state != "SUCCEEDED":
68
- reason = stats["QueryExecution"]["Status"].get("StateChangeReason", "Unknown error")
69
- raise Exception(f"Athena query {state.lower()}: {reason}")
70
-
71
- response = self._client.get_query_results(QueryExecutionId=self._exec_id, MaxResults=1000)
72
- column_info = response["ResultSet"]["ResultSetMetadata"]["ColumnInfo"]
73
- self._columns = [c.get("Name", "") for c in column_info]
74
- self._column_types = [c.get("Type", "varchar") for c in column_info]
75
-
76
- # Athena's first result row echoes the column headers (as VarCharValue),
77
- # skip it — real column names/order already come from ColumnInfo above.
78
- rows_data = response["ResultSet"]["Rows"]
79
- data_rows = rows_data[1:] if rows_data else []
80
- self._rows = [
81
- tuple(c.get("VarCharValue", "") for c in r["Data"]) for r in data_rows
82
- ]
83
-
84
- self._delete_output()
85
- return self
86
-
87
- def _delete_output(self):
88
- try:
89
- s3_client = build_aws_client("s3", role_arn=self._role_arn, region=self._region)
90
- bucket, prefix = _parse_s3_location(self._output_location)
91
- s3_client.delete_object(Bucket=bucket, Key=f"{prefix}{self._exec_id}.csv")
92
- s3_client.delete_object(Bucket=bucket, Key=f"{prefix}{self._exec_id}.csv.metadata")
93
- except Exception as e:
94
- logger.warning(f"Failed to delete Athena output for {self._exec_id}: {e}")
95
-
96
- def fetchall(self):
97
- return self._rows
98
-
99
- def fetchone(self):
100
- return self._rows[0] if self._rows else None
101
-
102
- def cancel(self):
103
- if self._exec_id:
104
- self._client.stop_query_execution(QueryExecutionId=self._exec_id)
105
-
106
-
107
- def _parse_s3_location(s3_uri: str):
108
- without_scheme = s3_uri.replace("s3://", "", 1)
109
- bucket, _, prefix = without_scheme.partition("/")
110
- if prefix and not prefix.endswith("/"):
111
- prefix += "/"
112
- return bucket, prefix
113
-
114
-
115
- class CSVWarehouseConnection(DataWarehouseConnection):
116
- """Athena/Glue-backed connection for the CSV data source.
117
-
118
- Athena is stateless and per-query (no persistent session), so unlike the
119
- SQLAlchemy-pooled connections this class has no engine/connection to keep
120
- alive between queries.
121
- """
122
-
123
- def __init__(self, source_config: CSVConfig):
124
- if source_config is None:
125
- raise ValueError("Missing required parameter: source_config (CSVConfig)")
126
- self._config = source_config
127
- self._client = None
128
-
129
- def _get_client(self):
130
- if self._client is None:
131
- self._client = build_athena_client(
132
- role_arn=self._config.athena_cross_account_role_arn,
133
- region=self._config.region,
134
- )
135
- return self._client
136
-
137
- @contextmanager
138
- @cancel_check_connection
139
- def get_connection(self, retries: int = 3, delay: int = 5, query_timeout: int = 30):
140
- cursor = AthenaCursor(
141
- athena_client=self._get_client(),
142
- database=self._config.glue_database,
143
- output_location=self._config.athena_output_location,
144
- role_arn=self._config.athena_cross_account_role_arn,
145
- region=self._config.region,
146
- )
147
- yield cursor
148
-
149
- def is_valid_connection(self) -> bool:
150
- return True
151
-
152
- def close_connection(self):
153
- self._client = None
154
-
155
- def test_connection(self) -> bool:
156
- try:
157
- with self.get_connection(retries=1) as cursor:
158
- cursor.execute("SELECT 1")
159
- return True
160
- except Exception as e:
161
- raise BadRequest(f"Athena/Glue connection test failed: {str(e)}") from e
@@ -1,55 +0,0 @@
1
- from pypika import Query
2
-
3
- from shared_kernel.data_warehouse_handlers.connections.csv_warehouse_connection import CSVWarehouseConnection
4
- from shared_kernel.data_warehouse_handlers.custom_query_builders.athena_query import AthenaQuery
5
- from shared_kernel.data_warehouse_handlers.query_executors.csv_query_executor import CSVQueryExecutor
6
- from shared_kernel.dataclasses.warehouse_configs import CSVConfig
7
- from shared_kernel.interfaces.data_warehouse_handler import WarehouseHandler
8
-
9
-
10
- class CSVWarehouseHandler(WarehouseHandler):
11
-
12
- def get_config(self) -> CSVConfig:
13
- required = ("glue_database", "region", "s3_bucket", "s3_prefix", "athena_output_location")
14
- missing = [f for f in required if not self.payload.get(f)]
15
- if missing:
16
- raise ValueError(f"CSV payload is missing required fields: {missing}.")
17
-
18
- return CSVConfig(
19
- glue_database=str(self.payload.get("glue_database")).strip(),
20
- region=str(self.payload.get("region")).strip(),
21
- s3_bucket=str(self.payload.get("s3_bucket")).strip(),
22
- s3_prefix=str(self.payload.get("s3_prefix")).strip(),
23
- athena_output_location=str(self.payload.get("athena_output_location")).strip(),
24
- athena_cross_account_role_arn=self.payload.get("athena_cross_account_role_arn"),
25
- schema=self.payload.get("schema"),
26
- schema_list=self.payload.get("schema_list"),
27
- pagination=self.pagination,
28
- )
29
-
30
- def _build_connection(self) -> CSVWarehouseConnection:
31
- """Internal — not exposed to callers."""
32
- return CSVWarehouseConnection(source_config=self.get_config())
33
-
34
- def get_executor(self) -> CSVQueryExecutor:
35
- return CSVQueryExecutor(warehouse_connection=self._build_connection())
36
-
37
- def get_query_object(self) -> Query:
38
- return AthenaQuery
39
-
40
- def create_records_and_count_query(
41
- self,
42
- query: str,
43
- limit: str,
44
- page: str,
45
- ) -> tuple[str, str]:
46
- count_query = f"SELECT COUNT(*) FROM ({query}) AS _count"
47
-
48
- if limit:
49
- # Athena requires OFFSET before LIMIT in the grammar.
50
- if page:
51
- offset = (int(page) - 1) * int(limit)
52
- query = f"{query} OFFSET {offset}"
53
- query = f"{query} LIMIT {int(limit)}"
54
-
55
- return count_query, query
@@ -1,27 +0,0 @@
1
- from pypika import Query
2
- from pypika.queries import QueryBuilder
3
-
4
-
5
- class AthenaQuery(Query):
6
- """
7
- Defines a query class for use with Athena (Trino/Presto engine).
8
- """
9
-
10
- @classmethod
11
- def _builder(cls, **kwargs) -> "AthenaQueryBuilder":
12
- return AthenaQueryBuilder(dialect="athena", **kwargs)
13
-
14
-
15
- class AthenaQueryBuilder(QueryBuilder):
16
- QUERY_CLS = AthenaQuery
17
-
18
- def _apply_pagination(self, querystring: str) -> str:
19
- # Trino/Presto (and therefore Athena) requires OFFSET before LIMIT;
20
- # the pypika default emits LIMIT before OFFSET, which Athena rejects.
21
- if self._offset:
22
- querystring += self._offset_sql()
23
-
24
- if self._limit is not None:
25
- querystring += self._limit_sql()
26
-
27
- return querystring
@@ -1,105 +0,0 @@
1
- import time
2
- from concurrent.futures import ThreadPoolExecutor, as_completed
3
- from typing import Any, Dict, List, Optional, Tuple
4
-
5
- from shared_kernel.config import Config
6
- from shared_kernel.data_warehouse_handlers.base_executor import BaseQueryExecutor, cancel_check
7
- from shared_kernel.interfaces.warehouse_connection import DataWarehouseConnection
8
- from shared_kernel.logger import Logger
9
-
10
- config = Config()
11
- logger = Logger(config.get("APP_NAME"))
12
- MAX_QUERY_CONCURRENCY = 5
13
-
14
-
15
- class CSVQueryExecutor(BaseQueryExecutor):
16
- """Query executor for the Athena/Glue-backed CSV data source."""
17
-
18
- def __init__(self, warehouse_connection: DataWarehouseConnection) -> None:
19
- self.warehouse_connection = warehouse_connection
20
-
21
- @cancel_check
22
- def execute_query(
23
- self,
24
- query: str,
25
- params: Optional[tuple] = None,
26
- ) -> List[Dict[str, Any]]:
27
- with self.warehouse_connection.get_connection() as cursor:
28
- self.active_connections.add(cursor)
29
- try:
30
- logger.info(f"Executing Athena query: {query}")
31
- start = time.perf_counter()
32
- cursor.execute(query, params)
33
- elapsed = time.perf_counter() - start
34
- logger.info(f"Athena query executed in {elapsed:.6f}s")
35
-
36
- columns = [col[0] for col in cursor.description]
37
- return [dict(zip(columns, row)) for row in cursor.fetchall()]
38
- except Exception as e:
39
- logger.error(f"Athena query failed: {query} — {e}", exc_info=True)
40
- raise Exception(f"Query execution failed: {str(e)}") from e
41
- finally:
42
- self.active_connections.discard(cursor)
43
-
44
- def execute_queries(
45
- self,
46
- queries: List[str],
47
- ) -> List[List[Dict[str, Any]]]:
48
- if not queries:
49
- return []
50
-
51
- indexed: List[Tuple[int, str]] = list(enumerate(queries))
52
- results: List[Optional[List[Dict[str, Any]]]] = [None] * len(queries)
53
-
54
- with ThreadPoolExecutor(max_workers=MAX_QUERY_CONCURRENCY) as pool:
55
- future_to_index = {
56
- pool.submit(self.execute_query, query): idx
57
- for idx, query in indexed
58
- }
59
-
60
- for future in as_completed(future_to_index):
61
- idx = future_to_index[future]
62
- try:
63
- results[idx] = future.result()
64
- except Exception as e:
65
- for pending in future_to_index:
66
- if not pending.done():
67
- pending.cancel()
68
- raise Exception(
69
- f"Parallel query execution failed on query index {idx}: {e}"
70
- ) from e
71
-
72
- return results
73
-
74
- @cancel_check
75
- def execute_query_with_column_types(
76
- self,
77
- query: str,
78
- params: Optional[tuple] = None,
79
- ) -> Tuple[List[Dict[str, Any]], List[Tuple]]:
80
- with self.warehouse_connection.get_connection() as cursor:
81
- self.active_connections.add(cursor)
82
- try:
83
- logger.info(f"Executing Athena query with column types: {query}")
84
- start = time.perf_counter()
85
- cursor.execute(query, params)
86
- elapsed = time.perf_counter() - start
87
- logger.info(f"Athena query executed in {elapsed:.6f}s")
88
-
89
- description = cursor.description or []
90
- if not description:
91
- return [], []
92
-
93
- columns = [col[0] for col in description]
94
- rows = [dict(zip(columns, row)) for row in cursor.fetchall()]
95
- return rows, description
96
- except Exception as e:
97
- logger.error(f"Athena query failed: {query} — {e}", exc_info=True)
98
- raise Exception(f"Query execution failed: {str(e)}") from e
99
- finally:
100
- self.active_connections.discard(cursor)
101
-
102
- def cancel(self) -> None:
103
- logger.warning(f"Cancelling {len(self.active_connections)} active Athena query cursor(s).")
104
- for cursor in list(self.active_connections):
105
- self._cancel_connection(cursor)