goe-framework 1.0.7__tar.gz → 1.0.8.dev0__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.
- {goe_framework-1.0.7/src/goe_framework.egg-info → goe_framework-1.0.8.dev0}/PKG-INFO +3 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/pyproject.toml +1 -1
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/orchestration_config.py +0 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/orchestration_defaults.py +0 -4
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect.py +0 -14
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/goe.py +14 -8
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/backend_api.py +0 -82
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/backend_table.py +3 -32
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_backend_api.py +2 -82
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_backend_table.py +0 -10
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/offload_transport_factory.py +0 -9
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/frontend_api.py +7 -13
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hadoop_backend_api.py +1 -190
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hadoop_backend_table.py +0 -31
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hive_backend_api.py +1 -161
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hive_backend_table.py +13 -10
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/impala_backend_api.py +1 -431
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/impala_backend_table.py +0 -7
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/sqoop_offload_transport.py +0 -4
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/mssql_frontend_api.py +7 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/mssql_offload_source_table.py +1 -7
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/mssql_offload_transport_rdbms_api.py +5 -5
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_backend_api.py +0 -74
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_backend_table.py +0 -6
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload.py +8 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_constants.py +0 -63
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_source_table.py +3 -7
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_transport.py +26 -18
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_transport_rdbms_api.py +3 -3
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/data_type_controls.py +3 -14
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/partition_controls.py +6 -10
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/sort_columns.py +2 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_frontend_api.py +7 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_offload_source_table.py +1 -30
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_offload_transport_rdbms_api.py +15 -36
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/snowflake_backend_api.py +0 -80
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/snowflake_backend_table.py +0 -6
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/dataproc_offload_transport.py +0 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/livy_offload_transport.py +0 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_frontend_api.py +5 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_offload_source_table.py +1 -6
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_offload_transport_rdbms_api.py +6 -6
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0/src/goe_framework.egg-info}/PKG-INFO +3 -2
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/AUTHORS +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/LICENSE +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/README.md +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/setup.cfg +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/conductor/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/conductor/hybrid_view_service.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/config_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/config_validation_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/config/option_descriptions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect_backend.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect_constants.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect_frontend.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/connect/connect_transport.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/exceptions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/cli_hdfs.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/goe_azure.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/goe_dfs.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/goe_dfs_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/goe_gcs.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/goe_s3.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/filesystem/web_hdfs.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/__main__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/api/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/api/routes/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/api/routes/docs.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/api/routes/orchestration.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/api/routes/system.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/asgi.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/config/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/config/application.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/config/gunicorn.conf.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/config/logging.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/config/router.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/enum.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/events.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/middleware/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/middleware/compression.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/middleware/cors.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/middleware/secure_headers.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/security.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/core/worker.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/exceptions/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/exceptions/base.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/exceptions/errors.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/heartbeat.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/prestart.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/base.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/error.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/generics.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/orchestration.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/schemas/system.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/heartbeat.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/hybrid_view.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/orchestrate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/periodic_tasks.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/services/system.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/cache.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/group_by.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/orchestrate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/ping.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/utils/system.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/worker.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/listener/wsgi.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/column_metadata.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/backend_api_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/backend_table_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/frontend_api_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/offload_source_table_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/offload_transport_rdbms_api_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/query_import_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/factory/staging_file_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/format_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hadoop_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hadoop_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/hive_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/hadoop/impala_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/mssql_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_constants.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/microsoft/synapse_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_messages.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_metadata_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_source_data.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_status_report.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_transport_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_validation.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/offload_xform_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/ddl_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/not_null_columns.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/stats_controls.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/table_structure_checks.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/operation/transport.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/option_validation.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/oracle/oracle_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/predicate_offload.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/query_import_interface.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/snowflake_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/snowflake_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/snowflake/snowflake_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/offload_transport_livy_requests.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/pyspark_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/spark/spark_thrift_backend_api.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/avro/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/avro/avro_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/avro/avro_staging_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/parquet/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/parquet/parquet_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/parquet/parquet_staging_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/staging/staging_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/synthetic_partition_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_literal.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_partition_expression.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/teradata/teradata_predicate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/cli_entry_points.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/command_steps.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/execution_id.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/orchestration_constants.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/orchestration_lock.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/orchestration/orchestration_runner.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/factory/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/factory/orchestration_repo_client_factory.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/oracle/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/oracle/oracle_orchestration_repo_client.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/orchestration_metadata.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/orchestration_repo_client.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/teradata/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/persistence/teradata/teradata_orchestration_repo_client.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync_analyzer.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync_command_file.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync_constants.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync_processor.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/schema_sync_step.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/steps/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/steps/add_backend_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/steps/add_oracle_column.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/schema_sync/steps/step_builder.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/scripts/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/scripts/agg_validate.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/__init__.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/avro_encoder.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/better_impyla.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/exception_trigger.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/goe_log.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/goe_log_fh.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/goe_version.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/hive_ddl_transform.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/hive_table_stats.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/hs2_connection.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/json_tools.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/local_cache.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/misc_functions.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/ora_query.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/parallel_exec.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/parquet_encoder.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/password_tools.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/polling_thread.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/redis_tools.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/retry_logic.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/util/simple_timer.py +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe_framework.egg-info/SOURCES.txt +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe_framework.egg-info/dependency_links.txt +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe_framework.egg-info/requires.txt +0 -0
- {goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe_framework.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: goe-framework
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.8.dev0
|
|
4
4
|
Maintainer-email: Neil Johnson <neiljohnson@google.com>
|
|
5
5
|
Project-URL: Homepage, https://github.com/gluent/goe
|
|
6
6
|
Project-URL: Issues, https://github.com/gluent/goe/issues
|
|
@@ -67,6 +67,7 @@ Provides-Extra: test
|
|
|
67
67
|
Requires-Dist: nox; extra == "test"
|
|
68
68
|
Requires-Dist: pytest; extra == "test"
|
|
69
69
|
Requires-Dist: pytest-xdist; extra == "test"
|
|
70
|
+
Dynamic: license-file
|
|
70
71
|
|
|
71
72
|
# GOE
|
|
72
73
|
A simple and flexible way to copy data from an Oracle Database to Google BigQuery.
|
|
@@ -199,7 +199,6 @@ EXPECTED_CONFIG_ARGS = [
|
|
|
199
199
|
"teradata_app_pass",
|
|
200
200
|
"teradata_server",
|
|
201
201
|
"teradata_repo_user",
|
|
202
|
-
"udf_db",
|
|
203
202
|
"use_ssl",
|
|
204
203
|
"use_oracle_wallet",
|
|
205
204
|
"webhdfs_host",
|
|
@@ -825,7 +824,6 @@ class OrchestrationConfig:
|
|
|
825
824
|
"teradata_repo_user",
|
|
826
825
|
orchestration_defaults.teradata_repo_user_default(),
|
|
827
826
|
),
|
|
828
|
-
udf_db=config_dict.get("udf_db", orchestration_defaults.udf_db_default()),
|
|
829
827
|
use_ssl=config_dict.get(
|
|
830
828
|
"use_ssl", orchestration_defaults.use_ssl_default()
|
|
831
829
|
),
|
|
@@ -476,10 +476,6 @@ def ldap_password_file_default():
|
|
|
476
476
|
return os.environ.get("HIVE_SERVER_LDAP_PASSWORD_FILE")
|
|
477
477
|
|
|
478
478
|
|
|
479
|
-
def udf_db_default():
|
|
480
|
-
return os.environ.get("OFFLOAD_UDF_DB")
|
|
481
|
-
|
|
482
|
-
|
|
483
479
|
def use_ssl_default():
|
|
484
480
|
return bool(os.environ.get("SSL_ACTIVE", "").lower() == "true" or ca_cert_default())
|
|
485
481
|
|
|
@@ -486,20 +486,6 @@ def get_connect_opts():
|
|
|
486
486
|
help="Adds missing configuration variables from the environment file template to the environment file",
|
|
487
487
|
)
|
|
488
488
|
# Hidden options to keep TeamCity testing functioning
|
|
489
|
-
opt.add_option(
|
|
490
|
-
"--validate-udfs",
|
|
491
|
-
dest="validate_udfs",
|
|
492
|
-
default=False,
|
|
493
|
-
action="store_true",
|
|
494
|
-
help=SUPPRESS_HELP,
|
|
495
|
-
)
|
|
496
|
-
opt.add_option(
|
|
497
|
-
"--install-udfs",
|
|
498
|
-
dest="install_udfs",
|
|
499
|
-
default=False,
|
|
500
|
-
action="store_true",
|
|
501
|
-
help=SUPPRESS_HELP,
|
|
502
|
-
)
|
|
503
489
|
opt.add_option(
|
|
504
490
|
"--create-backend-db",
|
|
505
491
|
dest="create_backend_db",
|
|
@@ -220,7 +220,6 @@ EXPECTED_OFFLOAD_ARGS = [
|
|
|
220
220
|
"offload_predicate_modify_hybrid_view",
|
|
221
221
|
"offload_stats_method",
|
|
222
222
|
"offload_transport_method",
|
|
223
|
-
"offload_type",
|
|
224
223
|
"offload_transport_consistent_read",
|
|
225
224
|
"offload_transport_dsn",
|
|
226
225
|
"offload_transport_fetch_size",
|
|
@@ -228,8 +227,10 @@ EXPECTED_OFFLOAD_ARGS = [
|
|
|
228
227
|
"offload_transport_queue_name",
|
|
229
228
|
"offload_transport_parallelism",
|
|
230
229
|
"offload_transport_small_table_threshold",
|
|
230
|
+
"offload_transport_snapshot",
|
|
231
231
|
"offload_transport_spark_properties",
|
|
232
232
|
"offload_transport_validation_polling_interval",
|
|
233
|
+
"offload_type",
|
|
233
234
|
"older_than_date",
|
|
234
235
|
"older_than_days",
|
|
235
236
|
"operation_name",
|
|
@@ -940,6 +941,11 @@ def normalise_offload_transport_user_options(options):
|
|
|
940
941
|
"OFFLOAD_TRANSPORT_FETCH_SIZE/--offload-transport-fetch-size",
|
|
941
942
|
options.offload_transport_fetch_size,
|
|
942
943
|
)
|
|
944
|
+
if options.offload_transport_snapshot:
|
|
945
|
+
options.offload_transport_snapshot = check_opt_is_posint(
|
|
946
|
+
"--offload-transport-snapshot",
|
|
947
|
+
options.offload_transport_snapshot,
|
|
948
|
+
)
|
|
943
949
|
|
|
944
950
|
verify_json_option(
|
|
945
951
|
"OFFLOAD_TRANSPORT_SPARK_PROPERTIES/--offload-transport-spark-properties",
|
|
@@ -2242,6 +2248,7 @@ class OffloadOperation(BaseOperation):
|
|
|
2242
2248
|
offload_transport_queue_name=options.offload_transport_queue_name,
|
|
2243
2249
|
offload_transport_parallelism=options.offload_transport_parallelism,
|
|
2244
2250
|
offload_transport_small_table_threshold=options.offload_transport_small_table_threshold,
|
|
2251
|
+
offload_transport_snapshot=options.offload_transport_snapshot,
|
|
2245
2252
|
offload_transport_spark_properties=options.offload_transport_spark_properties,
|
|
2246
2253
|
offload_transport_validation_polling_interval=options.offload_transport_validation_polling_interval,
|
|
2247
2254
|
offload_type=options.offload_type,
|
|
@@ -2416,6 +2423,7 @@ class OffloadOperation(BaseOperation):
|
|
|
2416
2423
|
"offload_transport_small_table_threshold",
|
|
2417
2424
|
orchestration_defaults.offload_transport_small_table_threshold_default(),
|
|
2418
2425
|
),
|
|
2426
|
+
offload_transport_snapshot=operation_dict.get("offload_transport_snapshot"),
|
|
2419
2427
|
offload_transport_spark_properties=operation_dict.get(
|
|
2420
2428
|
"offload_transport_spark_properties",
|
|
2421
2429
|
orchestration_defaults.offload_transport_spark_properties_default(),
|
|
@@ -2841,13 +2849,6 @@ def offload_table(
|
|
|
2841
2849
|
|
|
2842
2850
|
rows_offloaded = None
|
|
2843
2851
|
|
|
2844
|
-
pre_offload_snapshot = None
|
|
2845
|
-
if offload_options.db_type == offload_constants.DBTYPE_ORACLE:
|
|
2846
|
-
# Pre-offload SCN will be stored in metadata.
|
|
2847
|
-
pre_offload_snapshot = offload_source_table.get_current_scn(
|
|
2848
|
-
return_none_on_failure=True
|
|
2849
|
-
)
|
|
2850
|
-
|
|
2851
2852
|
create_final_backend_table_step(offload_target_table, offload_operation)
|
|
2852
2853
|
|
|
2853
2854
|
data_transport_client = offload_transport_factory(
|
|
@@ -2860,6 +2861,11 @@ def offload_table(
|
|
|
2860
2861
|
dfs_client,
|
|
2861
2862
|
)
|
|
2862
2863
|
|
|
2864
|
+
pre_offload_snapshot = None
|
|
2865
|
+
if offload_options.db_type == offload_constants.DBTYPE_ORACLE:
|
|
2866
|
+
# Pre-offload SCN will be stored in metadata.
|
|
2867
|
+
pre_offload_snapshot = data_transport_client.get_transport_snapshot()
|
|
2868
|
+
|
|
2863
2869
|
offload_target_table.set_final_table_casts(
|
|
2864
2870
|
offload_source_table.columns,
|
|
2865
2871
|
data_transport_client.get_staging_file().get_staging_columns(),
|
|
@@ -64,7 +64,6 @@ from goe.offload.offload_messages import VERBOSE, VVERBOSE
|
|
|
64
64
|
from goe.offload.offload_constants import (
|
|
65
65
|
CAPABILITY_BUCKET_HASH_COLUMN,
|
|
66
66
|
CAPABILITY_CANONICAL_DATE,
|
|
67
|
-
CAPABILITY_CANONICAL_FLOAT,
|
|
68
67
|
CAPABILITY_CANONICAL_TIME,
|
|
69
68
|
CAPABILITY_CASE_SENSITIVE,
|
|
70
69
|
CAPABILITY_COLUMN_STATS_SET,
|
|
@@ -78,11 +77,7 @@ from goe.offload.offload_constants import (
|
|
|
78
77
|
CAPABILITY_FS_SCHEME_INHERIT,
|
|
79
78
|
CAPABILITY_FS_SCHEME_WASB,
|
|
80
79
|
CAPABILITY_GOE_COLUMN_TRANSFORMATIONS,
|
|
81
|
-
CAPABILITY_GOE_JOIN_PUSHDOWN,
|
|
82
|
-
CAPABILITY_GOE_MATERIALIZED_JOIN,
|
|
83
80
|
CAPABILITY_GOE_PARTITION_FUNCTIONS,
|
|
84
|
-
CAPABILITY_GOE_SEQ_TABLE,
|
|
85
|
-
CAPABILITY_GOE_UDFS,
|
|
86
81
|
CAPABILITY_LOAD_DB_TRANSPORT,
|
|
87
82
|
CAPABILITY_NAN,
|
|
88
83
|
CAPABILITY_NANOSECONDS,
|
|
@@ -121,10 +116,6 @@ class BackendStatsException(Exception):
|
|
|
121
116
|
pass
|
|
122
117
|
|
|
123
118
|
|
|
124
|
-
class MissingSequenceTableException(Exception):
|
|
125
|
-
pass
|
|
126
|
-
|
|
127
|
-
|
|
128
119
|
class BackendApiConnectionException(Exception):
|
|
129
120
|
pass
|
|
130
121
|
|
|
@@ -1595,25 +1586,6 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
1595
1586
|
def get_user_name(self):
|
|
1596
1587
|
pass
|
|
1597
1588
|
|
|
1598
|
-
@abstractmethod
|
|
1599
|
-
def insert_literal_values(
|
|
1600
|
-
self,
|
|
1601
|
-
db_name,
|
|
1602
|
-
table_name,
|
|
1603
|
-
literal_list,
|
|
1604
|
-
column_list=None,
|
|
1605
|
-
max_rows_per_insert=250,
|
|
1606
|
-
split_by_cr=True,
|
|
1607
|
-
):
|
|
1608
|
-
"""Used to insert specific data into a table. The table should already exist.
|
|
1609
|
-
literal_list: A list of rows to insert (a list of lists).
|
|
1610
|
-
The row level lists should contain the exact right number of columns.
|
|
1611
|
-
column_list: The column specs for the columns to be inserted, if left blank this will default to all
|
|
1612
|
-
columns in the table
|
|
1613
|
-
Disclaimer: This code is used in testing and generating the sequence table. It is not robust enough to
|
|
1614
|
-
be a part of any Offload Transport
|
|
1615
|
-
"""
|
|
1616
|
-
|
|
1617
1589
|
@abstractmethod
|
|
1618
1590
|
def is_nan_sql_expression(self, column_expr):
|
|
1619
1591
|
"""Return a SQL expression testing if an expression is NaN (not-a-number)."""
|
|
@@ -1738,18 +1710,6 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
1738
1710
|
"""Returns True if the backend column requires a synthetic column if it is used for partitioning."""
|
|
1739
1711
|
pass
|
|
1740
1712
|
|
|
1741
|
-
@abstractmethod
|
|
1742
|
-
def populate_sequence_table(
|
|
1743
|
-
self, db_name, table_name, starting_seq, target_seq, split_by_cr=False
|
|
1744
|
-
):
|
|
1745
|
-
"""Populate options.sequence_table_name up to target_seq.
|
|
1746
|
-
split_by_cr: This option is a bit of a fudge but allows a calling program to parse the output.
|
|
1747
|
-
The idea being that, on some backends, this method may produce lengthy output
|
|
1748
|
-
which we may not want on screen. With split_by_cr the calling program has the
|
|
1749
|
-
opportunity to split the executed text by cr and only log some lines.
|
|
1750
|
-
"""
|
|
1751
|
-
pass
|
|
1752
|
-
|
|
1753
1713
|
@abstractmethod
|
|
1754
1714
|
def refresh_table_files(self, db_name, table_name, sync=None):
|
|
1755
1715
|
pass
|
|
@@ -1770,10 +1730,6 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
1770
1730
|
"""Check the role exists, returns True/False"""
|
|
1771
1731
|
pass
|
|
1772
1732
|
|
|
1773
|
-
@abstractmethod
|
|
1774
|
-
def sequence_table_max(self, db_name, table_name):
|
|
1775
|
-
pass
|
|
1776
|
-
|
|
1777
1733
|
@abstractmethod
|
|
1778
1734
|
def set_column_stats(
|
|
1779
1735
|
self, db_name, table_name, new_column_stats, ndv_cap, num_null_factor
|
|
@@ -1886,28 +1842,6 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
1886
1842
|
"""
|
|
1887
1843
|
pass
|
|
1888
1844
|
|
|
1889
|
-
@abstractmethod
|
|
1890
|
-
def udf_installation_os(self, user_udf_version):
|
|
1891
|
-
"""Copies any libraries required to support UDFs from our software package to wherever they should be.
|
|
1892
|
-
Returns a list of commands executed.
|
|
1893
|
-
"""
|
|
1894
|
-
pass
|
|
1895
|
-
|
|
1896
|
-
@abstractmethod
|
|
1897
|
-
def udf_installation_sql(self, create_udf_db, udf_db=None):
|
|
1898
|
-
"""Executes any SQL commands required for UDF installation.
|
|
1899
|
-
Returns a list of commands executed, in dry_run mode that's all it does.
|
|
1900
|
-
udf_db can be empty which means we won't specify one and pickup a default.
|
|
1901
|
-
"""
|
|
1902
|
-
pass
|
|
1903
|
-
|
|
1904
|
-
@abstractmethod
|
|
1905
|
-
def udf_installation_test(self, udf_db=None):
|
|
1906
|
-
"""Executes any SQL commands to test each UDF.
|
|
1907
|
-
udf_db can be empty which means we won't specify one and pickup a default.
|
|
1908
|
-
"""
|
|
1909
|
-
pass
|
|
1910
|
-
|
|
1911
1845
|
@abstractmethod
|
|
1912
1846
|
def valid_canonical_override(self, column, canonical_override):
|
|
1913
1847
|
"""Present has a number of options for overriding the default canonical mapping in to_canonical_column().
|
|
@@ -1952,10 +1886,6 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
1952
1886
|
"""
|
|
1953
1887
|
return self.is_capability_supported(CAPABILITY_CANONICAL_DATE)
|
|
1954
1888
|
|
|
1955
|
-
def canonical_float_supported(self):
|
|
1956
|
-
"""Does the backend have a pure 4 byte binary floating point data type"""
|
|
1957
|
-
return self.is_capability_supported(CAPABILITY_CANONICAL_FLOAT)
|
|
1958
|
-
|
|
1959
1889
|
def canonical_time_supported(self):
|
|
1960
1890
|
"""Does the backend have a pure time data type (no date part).
|
|
1961
1891
|
Note that there is an Impala override for this.
|
|
@@ -2008,21 +1938,9 @@ FROM %(db)s.%(table)s%(where_clause)s%(group_by)s%(order_by)s""" % {
|
|
|
2008
1938
|
def goe_column_transformations_supported(self):
|
|
2009
1939
|
return self.is_capability_supported(CAPABILITY_GOE_COLUMN_TRANSFORMATIONS)
|
|
2010
1940
|
|
|
2011
|
-
def goe_join_pushdown_supported(self):
|
|
2012
|
-
return self.is_capability_supported(CAPABILITY_GOE_JOIN_PUSHDOWN)
|
|
2013
|
-
|
|
2014
|
-
def goe_materialized_join_supported(self):
|
|
2015
|
-
return self.is_capability_supported(CAPABILITY_GOE_MATERIALIZED_JOIN)
|
|
2016
|
-
|
|
2017
1941
|
def goe_partition_functions_supported(self):
|
|
2018
1942
|
return self.is_capability_supported(CAPABILITY_GOE_PARTITION_FUNCTIONS)
|
|
2019
1943
|
|
|
2020
|
-
def goe_sequence_table_supported(self):
|
|
2021
|
-
return self.is_capability_supported(CAPABILITY_GOE_SEQ_TABLE)
|
|
2022
|
-
|
|
2023
|
-
def goe_udfs_supported(self):
|
|
2024
|
-
return self.is_capability_supported(CAPABILITY_GOE_UDFS)
|
|
2025
|
-
|
|
2026
1944
|
def load_db_transport_supported(self):
|
|
2027
1945
|
return self.is_capability_supported(CAPABILITY_LOAD_DB_TRANSPORT)
|
|
2028
1946
|
|
|
@@ -209,7 +209,6 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
209
209
|
self._offload_staging_format = getattr(
|
|
210
210
|
self._orchestration_config, "offload_staging_format", None
|
|
211
211
|
)
|
|
212
|
-
self._udf_db = getattr(self._orchestration_config, "udf_db", None)
|
|
213
212
|
# If orchestration_operation is not set then we are not doing anything significant by way of offload/present
|
|
214
213
|
self._ipa_predicate_type = None
|
|
215
214
|
self._offload_distribute_enabled = None
|
|
@@ -1044,12 +1043,12 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
1044
1043
|
|
|
1045
1044
|
def _partition_function_sql_expression(self, partition_info, sql_input_expression):
|
|
1046
1045
|
"""Return a string containing a call to a partition function UDF.
|
|
1047
|
-
e.g.
|
|
1046
|
+
e.g. SCHEMA.UDF_NAME(sql_input_expression)
|
|
1048
1047
|
"""
|
|
1049
1048
|
assert partition_info
|
|
1050
|
-
|
|
1049
|
+
udf_schema, udf_name = partition_info.function.split(".")
|
|
1051
1050
|
return "{}({})".format(
|
|
1052
|
-
self._db_api.enclose_object_reference(
|
|
1051
|
+
self._db_api.enclose_object_reference(udf_schema, udf_name),
|
|
1053
1052
|
sql_input_expression,
|
|
1054
1053
|
)
|
|
1055
1054
|
|
|
@@ -1807,10 +1806,6 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
1807
1806
|
def default_date_based_partition_granularity(self):
|
|
1808
1807
|
return self._db_api.default_date_based_partition_granularity()
|
|
1809
1808
|
|
|
1810
|
-
def default_udf_db_name(self):
|
|
1811
|
-
"""By default we support UDF_DB but individual backends may have their own override"""
|
|
1812
|
-
return self._udf_db
|
|
1813
|
-
|
|
1814
1809
|
def delta_table_exists(self):
|
|
1815
1810
|
return False
|
|
1816
1811
|
|
|
@@ -2375,18 +2370,6 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
2375
2370
|
def staging_area_exists(self):
|
|
2376
2371
|
pass
|
|
2377
2372
|
|
|
2378
|
-
@abstractmethod
|
|
2379
|
-
def synthetic_bucket_data_type(self):
|
|
2380
|
-
pass
|
|
2381
|
-
|
|
2382
|
-
@abstractmethod
|
|
2383
|
-
def synthetic_bucket_filter_capable_column(self, backend_column):
|
|
2384
|
-
"""Returns the metadata method and SQL expression pattern used to generate the bucket id
|
|
2385
|
-
Currently only enabling bucket filtering for integral data
|
|
2386
|
-
When we consider opening this up to other types we should consider excluding TZ aware data because
|
|
2387
|
-
a backend upgrade could change the result of CASTs
|
|
2388
|
-
"""
|
|
2389
|
-
|
|
2390
2373
|
###########################################################################
|
|
2391
2374
|
# PUBLIC METHODS - HIGH LEVEL STEP METHODS AND SUPPORTING ABSTRACT METHODS
|
|
2392
2375
|
###########################################################################
|
|
@@ -2530,9 +2513,6 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
2530
2513
|
def canonical_date_supported(self):
|
|
2531
2514
|
return self._db_api.canonical_date_supported()
|
|
2532
2515
|
|
|
2533
|
-
def canonical_float_supported(self):
|
|
2534
|
-
return self._db_api.canonical_float_supported()
|
|
2535
|
-
|
|
2536
2516
|
def canonical_time_supported(self):
|
|
2537
2517
|
return self._db_api.canonical_time_supported()
|
|
2538
2518
|
|
|
@@ -2545,18 +2525,9 @@ class BackendTableInterface(metaclass=ABCMeta):
|
|
|
2545
2525
|
def goe_column_transformations_supported(self):
|
|
2546
2526
|
return self._db_api.goe_column_transformations_supported()
|
|
2547
2527
|
|
|
2548
|
-
def goe_join_pushdown_supported(self):
|
|
2549
|
-
return self._db_api.goe_join_pushdown_supported()
|
|
2550
|
-
|
|
2551
|
-
def goe_materialized_join_supported(self):
|
|
2552
|
-
return self._db_api.goe_materialized_join_supported()
|
|
2553
|
-
|
|
2554
2528
|
def goe_partition_functions_supported(self):
|
|
2555
2529
|
return self._db_api.goe_partition_functions_supported()
|
|
2556
2530
|
|
|
2557
|
-
def goe_udfs_supported(self):
|
|
2558
|
-
return self._db_api.goe_udfs_supported()
|
|
2559
|
-
|
|
2560
2531
|
def nan_supported(self):
|
|
2561
2532
|
return self._db_api.nan_supported()
|
|
2562
2533
|
|
{goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_backend_api.py
RENAMED
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
from datetime import datetime
|
|
24
24
|
import logging
|
|
25
25
|
from math import ceil
|
|
26
|
-
import pprint
|
|
27
26
|
import re
|
|
28
27
|
from textwrap import dedent
|
|
29
28
|
import traceback
|
|
@@ -255,9 +254,9 @@ class BackendBigQueryApi(BackendApiInterface):
|
|
|
255
254
|
def _check_kms_key_name(self, kms_key_name: str, key_type="job"):
|
|
256
255
|
"""Use startswith() to verify custom key for key name.
|
|
257
256
|
Example of custom key name:
|
|
258
|
-
projects/goe-
|
|
257
|
+
projects/goe-test/locations/us-west3/keyRings/krname/cryptoKeys/etl5
|
|
259
258
|
Example of what we get from a query_job object:
|
|
260
|
-
projects/goe-
|
|
259
|
+
projects/goe-test/locations/us-west3/keyRings/krname/cryptoKeys/etl5/cryptoKeyVersions/1
|
|
261
260
|
It's worth noting that this has not always been the case, BigQuery behaviour has changed in the past.
|
|
262
261
|
"""
|
|
263
262
|
if self._kms_key_name and not (kms_key_name or "").startswith(
|
|
@@ -1814,68 +1813,6 @@ FROM %(from_db_table)s%(where)s""" % {
|
|
|
1814
1813
|
row = self.execute_query_fetch_one("SELECT SESSION_USER()", log_level=None)
|
|
1815
1814
|
return row[0] if row else None
|
|
1816
1815
|
|
|
1817
|
-
def insert_literal_values(
|
|
1818
|
-
self,
|
|
1819
|
-
db_name,
|
|
1820
|
-
table_name,
|
|
1821
|
-
literal_list,
|
|
1822
|
-
column_list=None,
|
|
1823
|
-
max_rows_per_insert=250,
|
|
1824
|
-
split_by_cr=True,
|
|
1825
|
-
):
|
|
1826
|
-
"""Insert an array of literals into a table using INSERT...VALUES(...),(...),(...).
|
|
1827
|
-
We've done this for simplicity due to two issues:
|
|
1828
|
-
1) BigQuery issue: https://github.com/googleapis/google-cloud-python/issues/5539
|
|
1829
|
-
"The issue is eventual consistency with the backend. Replacing the table, while it has the
|
|
1830
|
-
same table_id, represents a new table in terms of it's internal UUID and thus backends may
|
|
1831
|
-
deliver to the "old" table for a short period (typically a few minutes)."
|
|
1832
|
-
This means we can have problems with this method of inserting rows, it is likely only suitable for testing.
|
|
1833
|
-
2) Python does not support encoding Decimal to JSON until Python 3.10:
|
|
1834
|
-
https://bugs.python.org/issue16535
|
|
1835
|
-
Which gives us issue with this API:
|
|
1836
|
-
site-packages/google/cloud/bigquery/client.py", line 3421, in insert_rows
|
|
1837
|
-
return self.insert_rows_json(table, json_rows, **kwargs)
|
|
1838
|
-
...
|
|
1839
|
-
json/encoder.py", line 179, in default
|
|
1840
|
-
raise TypeError(f'Object of type {o.__class__.__name__} '
|
|
1841
|
-
TypeError: Object of type Decimal is not JSON serializable
|
|
1842
|
-
"""
|
|
1843
|
-
|
|
1844
|
-
def gen_literal(py_val, data_type):
|
|
1845
|
-
return str(self.to_backend_literal(py_val, data_type))
|
|
1846
|
-
|
|
1847
|
-
assert db_name
|
|
1848
|
-
assert table_name
|
|
1849
|
-
assert literal_list and isinstance(literal_list, list)
|
|
1850
|
-
assert isinstance(literal_list[0], list)
|
|
1851
|
-
|
|
1852
|
-
column_list = column_list or self.get_columns(db_name, table_name)
|
|
1853
|
-
column_names = [_.name for _ in column_list]
|
|
1854
|
-
data_type_strs = [_.format_data_type() for _ in column_list]
|
|
1855
|
-
|
|
1856
|
-
cmds = []
|
|
1857
|
-
remaining_rows = literal_list[:]
|
|
1858
|
-
while remaining_rows:
|
|
1859
|
-
this_chunk = remaining_rows[:max_rows_per_insert]
|
|
1860
|
-
remaining_rows = remaining_rows[max_rows_per_insert:]
|
|
1861
|
-
formatted_rows = []
|
|
1862
|
-
for row in this_chunk:
|
|
1863
|
-
formatted_rows.append(
|
|
1864
|
-
",".join(
|
|
1865
|
-
gen_literal(py_val, data_type)
|
|
1866
|
-
for py_val, data_type in zip(row, data_type_strs)
|
|
1867
|
-
)
|
|
1868
|
-
)
|
|
1869
|
-
sql = self._insert_literals_using_insert_values_sql_text(
|
|
1870
|
-
db_name,
|
|
1871
|
-
table_name,
|
|
1872
|
-
column_names,
|
|
1873
|
-
formatted_rows,
|
|
1874
|
-
split_by_cr=split_by_cr,
|
|
1875
|
-
)
|
|
1876
|
-
cmds.extend(self.execute_dml(sql, log_level=VVERBOSE))
|
|
1877
|
-
return cmds
|
|
1878
|
-
|
|
1879
1816
|
def is_nan_sql_expression(self, column_expr):
|
|
1880
1817
|
"""is_nan for BigQuery"""
|
|
1881
1818
|
return "is_nan(%s)" % column_expr
|
|
@@ -2086,11 +2023,6 @@ FROM %(from_db_table)s%(where)s""" % {
|
|
|
2086
2023
|
"""
|
|
2087
2024
|
return -(2**63)
|
|
2088
2025
|
|
|
2089
|
-
def populate_sequence_table(
|
|
2090
|
-
self, db_name, table_name, starting_seq, target_seq, split_by_cr=False
|
|
2091
|
-
):
|
|
2092
|
-
raise NotImplementedError("Sequence table does not apply for BigQuery")
|
|
2093
|
-
|
|
2094
2026
|
def refresh_table_files(self, db_name, table_name, sync=None):
|
|
2095
2027
|
"""No requirement to re-scan files for a table on BigQuery but drop from cache because that will be stale"""
|
|
2096
2028
|
self.drop_state()
|
|
@@ -2128,9 +2060,6 @@ FROM %(from_db_table)s%(where)s""" % {
|
|
|
2128
2060
|
"""No roles in BigQuery"""
|
|
2129
2061
|
pass
|
|
2130
2062
|
|
|
2131
|
-
def sequence_table_max(self, db_name, table_name):
|
|
2132
|
-
raise NotImplementedError("Sequence table does not apply for BigQuery")
|
|
2133
|
-
|
|
2134
2063
|
def set_column_stats(
|
|
2135
2064
|
self, db_name, table_name, new_column_stats, ndv_cap, num_null_factor
|
|
2136
2065
|
):
|
|
@@ -2287,15 +2216,6 @@ FROM %(from_db_table)s%(where)s""" % {
|
|
|
2287
2216
|
except NotFound:
|
|
2288
2217
|
return False
|
|
2289
2218
|
|
|
2290
|
-
def udf_installation_os(self, user_udf_version):
|
|
2291
|
-
raise NotImplementedError("GOE UDFs are not supported on BigQuery")
|
|
2292
|
-
|
|
2293
|
-
def udf_installation_sql(self, create_udf_db, udf_db=None):
|
|
2294
|
-
raise NotImplementedError("GOE UDFs are not supported on BigQuery")
|
|
2295
|
-
|
|
2296
|
-
def udf_installation_test(self, udf_db=None):
|
|
2297
|
-
raise NotImplementedError("GOE UDFs are not supported on BigQuery")
|
|
2298
|
-
|
|
2299
2219
|
def valid_canonical_override(self, column, canonical_override):
|
|
2300
2220
|
assert isinstance(column, BigQueryColumn)
|
|
2301
2221
|
if isinstance(canonical_override, CanonicalColumn):
|
{goe_framework-1.0.7 → goe_framework-1.0.8.dev0}/src/goe/offload/bigquery/bigquery_backend_table.py
RENAMED
|
@@ -499,10 +499,6 @@ class BackendBigQueryTable(BackendTableInterface):
|
|
|
499
499
|
else:
|
|
500
500
|
return []
|
|
501
501
|
|
|
502
|
-
def default_udf_db_name(self):
|
|
503
|
-
"""By default we support UDF_DB but on BigQuery we use the data db as a fall back"""
|
|
504
|
-
return self._udf_db or self.db_name
|
|
505
|
-
|
|
506
502
|
def empty_staging_area(self, staging_file):
|
|
507
503
|
self._rm_load_table_location()
|
|
508
504
|
|
|
@@ -623,12 +619,6 @@ class BackendBigQueryTable(BackendTableInterface):
|
|
|
623
619
|
self._warning("Staging database %s does not exist" % self._load_db_name)
|
|
624
620
|
return self._load_db_exists()
|
|
625
621
|
|
|
626
|
-
def synthetic_bucket_data_type(self):
|
|
627
|
-
raise NotImplementedError("Synthetic bucketing is not supported on BigQuery")
|
|
628
|
-
|
|
629
|
-
def synthetic_bucket_filter_capable_column(self, backend_column):
|
|
630
|
-
raise NotImplementedError("Synthetic bucketing is not supported on BigQuery")
|
|
631
|
-
|
|
632
622
|
def validate_type_conversions(self, staging_columns: list):
|
|
633
623
|
"""Validate the staged data before we insert it into the final backend table.
|
|
634
624
|
BigQuery catches overflowing casts but this way we can spot them beforehand and
|
|
@@ -35,7 +35,6 @@ def offload_transport_factory(
|
|
|
35
35
|
offload_options,
|
|
36
36
|
messages,
|
|
37
37
|
dfs_client,
|
|
38
|
-
rdbms_columns_override=None,
|
|
39
38
|
):
|
|
40
39
|
"""Constructs and returns an appropriate data transport object based on user inputs and RDBMS table"""
|
|
41
40
|
if offload_transport_method == OFFLOAD_TRANSPORT_METHOD_QUERY_IMPORT:
|
|
@@ -51,7 +50,6 @@ def offload_transport_factory(
|
|
|
51
50
|
offload_options,
|
|
52
51
|
messages,
|
|
53
52
|
dfs_client,
|
|
54
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
55
53
|
)
|
|
56
54
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SQOOP:
|
|
57
55
|
from goe.offload.hadoop.sqoop_offload_transport import (
|
|
@@ -68,7 +66,6 @@ def offload_transport_factory(
|
|
|
68
66
|
offload_options,
|
|
69
67
|
messages,
|
|
70
68
|
dfs_client,
|
|
71
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
72
69
|
)
|
|
73
70
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SQOOP_BY_QUERY:
|
|
74
71
|
from goe.offload.hadoop.sqoop_offload_transport import (
|
|
@@ -85,7 +82,6 @@ def offload_transport_factory(
|
|
|
85
82
|
offload_options,
|
|
86
83
|
messages,
|
|
87
84
|
dfs_client,
|
|
88
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
89
85
|
)
|
|
90
86
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SPARK_THRIFT:
|
|
91
87
|
from goe.offload.offload_transport import OffloadTransportSparkThrift
|
|
@@ -100,7 +96,6 @@ def offload_transport_factory(
|
|
|
100
96
|
offload_options,
|
|
101
97
|
messages,
|
|
102
98
|
dfs_client,
|
|
103
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
104
99
|
)
|
|
105
100
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SPARK_SUBMIT:
|
|
106
101
|
from goe.offload.offload_transport import OffloadTransportSparkSubmit
|
|
@@ -115,7 +110,6 @@ def offload_transport_factory(
|
|
|
115
110
|
offload_options,
|
|
116
111
|
messages,
|
|
117
112
|
dfs_client,
|
|
118
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
119
113
|
)
|
|
120
114
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SPARK_DATAPROC_GCLOUD:
|
|
121
115
|
from goe.offload.spark.dataproc_offload_transport import (
|
|
@@ -133,7 +127,6 @@ def offload_transport_factory(
|
|
|
133
127
|
offload_options,
|
|
134
128
|
messages,
|
|
135
129
|
dfs_client,
|
|
136
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
137
130
|
)
|
|
138
131
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SPARK_BATCHES_GCLOUD:
|
|
139
132
|
from goe.offload.spark.dataproc_offload_transport import (
|
|
@@ -150,7 +143,6 @@ def offload_transport_factory(
|
|
|
150
143
|
offload_options,
|
|
151
144
|
messages,
|
|
152
145
|
dfs_client,
|
|
153
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
154
146
|
)
|
|
155
147
|
elif offload_transport_method == OFFLOAD_TRANSPORT_METHOD_SPARK_LIVY:
|
|
156
148
|
from goe.offload.spark.livy_offload_transport import OffloadTransportSparkLivy
|
|
@@ -165,7 +157,6 @@ def offload_transport_factory(
|
|
|
165
157
|
offload_options,
|
|
166
158
|
messages,
|
|
167
159
|
dfs_client,
|
|
168
|
-
rdbms_columns_override=rdbms_columns_override,
|
|
169
160
|
)
|
|
170
161
|
else:
|
|
171
162
|
raise NotImplementedError(
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
# See the License for the specific language governing permissions and
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
"""FrontendApiInterface: Library for logic/interaction with an RDBMS frontend.
|
|
18
|
+
This module enforces an interface with common, high level, methods and an implementation
|
|
19
|
+
for each supported RDBMS, e.g. Oracle, MSSQL
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
import logging
|
|
@@ -29,16 +29,13 @@ from goe.offload.column_metadata import (
|
|
|
29
29
|
)
|
|
30
30
|
from goe.offload.offload_constants import (
|
|
31
31
|
CAPABILITY_CANONICAL_DATE,
|
|
32
|
-
CAPABILITY_CANONICAL_FLOAT,
|
|
33
32
|
CAPABILITY_CANONICAL_TIME,
|
|
34
33
|
CAPABILITY_CASE_SENSITIVE,
|
|
35
34
|
CAPABILITY_GOE_HAS_DB_CODE_COMPONENT,
|
|
36
|
-
CAPABILITY_GOE_JOIN_PUSHDOWN,
|
|
37
35
|
CAPABILITY_GOE_LIST_PARTITION_APPEND,
|
|
38
36
|
CAPABILITY_GOE_MULTI_COLUMN_INCREMENTAL_KEY,
|
|
39
37
|
CAPABILITY_GOE_OFFLOAD_STATUS_REPORT,
|
|
40
38
|
CAPABILITY_GOE_SCHEMA_SYNC,
|
|
41
|
-
CAPABILITY_HYBRID_SCHEMA,
|
|
42
39
|
CAPABILITY_LOW_HIGH_VALUE_FROM_STATS,
|
|
43
40
|
CAPABILITY_NAN,
|
|
44
41
|
CAPABILITY_PARAMETERIZED_QUERIES,
|
|
@@ -406,6 +403,10 @@ class FrontendApiInterface(metaclass=ABCMeta):
|
|
|
406
403
|
[OracleColumn(...), OracleColumn(...)]
|
|
407
404
|
"""
|
|
408
405
|
|
|
406
|
+
@abstractmethod
|
|
407
|
+
def get_current_scn(self):
|
|
408
|
+
"""Return the current system change number for the frontend."""
|
|
409
|
+
|
|
409
410
|
@abstractmethod
|
|
410
411
|
def get_db_unique_name(self) -> str:
|
|
411
412
|
"""Return the unique name for the frontend database"""
|
|
@@ -833,10 +834,6 @@ class FrontendApiInterface(metaclass=ABCMeta):
|
|
|
833
834
|
"""
|
|
834
835
|
return self.is_capability_supported(CAPABILITY_CANONICAL_DATE)
|
|
835
836
|
|
|
836
|
-
def canonical_float_supported(self) -> bool:
|
|
837
|
-
"""Does the frontend have a pure 4 byte binary floating point data type"""
|
|
838
|
-
return self.is_capability_supported(CAPABILITY_CANONICAL_FLOAT)
|
|
839
|
-
|
|
840
837
|
def canonical_time_supported(self) -> bool:
|
|
841
838
|
"""Does the frontend have a pure time data type (no date part).
|
|
842
839
|
Note that there is an Impala override for this.
|
|
@@ -851,9 +848,6 @@ class FrontendApiInterface(metaclass=ABCMeta):
|
|
|
851
848
|
"""Does the frontend have any in-database GOE code"""
|
|
852
849
|
return self.is_capability_supported(CAPABILITY_GOE_HAS_DB_CODE_COMPONENT)
|
|
853
850
|
|
|
854
|
-
def goe_join_pushdown_supported(self) -> bool:
|
|
855
|
-
return self.is_capability_supported(CAPABILITY_GOE_JOIN_PUSHDOWN)
|
|
856
|
-
|
|
857
851
|
def goe_lpa_supported(self) -> bool:
|
|
858
852
|
return self.is_capability_supported(CAPABILITY_GOE_LIST_PARTITION_APPEND)
|
|
859
853
|
|