apache-airflow-providers-google 12.0.0rc2__py3-none-any.whl → 14.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. airflow/providers/google/LICENSE +0 -52
  2. airflow/providers/google/__init__.py +1 -1
  3. airflow/providers/google/ads/hooks/ads.py +27 -13
  4. airflow/providers/google/ads/transfers/ads_to_gcs.py +18 -4
  5. airflow/providers/google/assets/bigquery.py +17 -0
  6. airflow/providers/google/cloud/_internal_client/secret_manager_client.py +2 -3
  7. airflow/providers/google/cloud/hooks/alloy_db.py +736 -8
  8. airflow/providers/google/cloud/hooks/automl.py +10 -4
  9. airflow/providers/google/cloud/hooks/bigquery.py +125 -22
  10. airflow/providers/google/cloud/hooks/bigquery_dts.py +8 -8
  11. airflow/providers/google/cloud/hooks/bigtable.py +2 -3
  12. airflow/providers/google/cloud/hooks/cloud_batch.py +3 -4
  13. airflow/providers/google/cloud/hooks/cloud_build.py +4 -5
  14. airflow/providers/google/cloud/hooks/cloud_composer.py +3 -4
  15. airflow/providers/google/cloud/hooks/cloud_memorystore.py +3 -4
  16. airflow/providers/google/cloud/hooks/cloud_run.py +3 -4
  17. airflow/providers/google/cloud/hooks/cloud_sql.py +7 -3
  18. airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +119 -7
  19. airflow/providers/google/cloud/hooks/compute.py +3 -3
  20. airflow/providers/google/cloud/hooks/datacatalog.py +3 -4
  21. airflow/providers/google/cloud/hooks/dataflow.py +12 -12
  22. airflow/providers/google/cloud/hooks/dataform.py +2 -3
  23. airflow/providers/google/cloud/hooks/datafusion.py +2 -2
  24. airflow/providers/google/cloud/hooks/dataplex.py +1032 -11
  25. airflow/providers/google/cloud/hooks/dataproc.py +4 -5
  26. airflow/providers/google/cloud/hooks/dataproc_metastore.py +3 -4
  27. airflow/providers/google/cloud/hooks/dlp.py +3 -4
  28. airflow/providers/google/cloud/hooks/gcs.py +7 -6
  29. airflow/providers/google/cloud/hooks/kms.py +2 -3
  30. airflow/providers/google/cloud/hooks/kubernetes_engine.py +8 -8
  31. airflow/providers/google/cloud/hooks/life_sciences.py +1 -1
  32. airflow/providers/google/cloud/hooks/managed_kafka.py +482 -0
  33. airflow/providers/google/cloud/hooks/natural_language.py +2 -3
  34. airflow/providers/google/cloud/hooks/os_login.py +2 -3
  35. airflow/providers/google/cloud/hooks/pubsub.py +6 -6
  36. airflow/providers/google/cloud/hooks/secret_manager.py +2 -3
  37. airflow/providers/google/cloud/hooks/spanner.py +2 -2
  38. airflow/providers/google/cloud/hooks/speech_to_text.py +2 -3
  39. airflow/providers/google/cloud/hooks/stackdriver.py +4 -4
  40. airflow/providers/google/cloud/hooks/tasks.py +3 -4
  41. airflow/providers/google/cloud/hooks/text_to_speech.py +2 -3
  42. airflow/providers/google/cloud/hooks/translate.py +236 -5
  43. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +9 -4
  44. airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +3 -4
  45. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +4 -5
  46. airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +3 -4
  47. airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +2 -3
  48. airflow/providers/google/cloud/hooks/vertex_ai/feature_store.py +3 -4
  49. airflow/providers/google/cloud/hooks/vertex_ai/generative_model.py +1 -181
  50. airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +3 -4
  51. airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +2 -3
  52. airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py +3 -4
  53. airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py +2 -3
  54. airflow/providers/google/cloud/hooks/video_intelligence.py +2 -3
  55. airflow/providers/google/cloud/hooks/vision.py +3 -4
  56. airflow/providers/google/cloud/hooks/workflows.py +2 -3
  57. airflow/providers/google/cloud/links/alloy_db.py +46 -0
  58. airflow/providers/google/cloud/links/bigquery.py +25 -0
  59. airflow/providers/google/cloud/links/dataplex.py +172 -2
  60. airflow/providers/google/cloud/links/kubernetes_engine.py +1 -2
  61. airflow/providers/google/cloud/links/managed_kafka.py +104 -0
  62. airflow/providers/google/cloud/links/translate.py +28 -0
  63. airflow/providers/google/cloud/log/gcs_task_handler.py +3 -3
  64. airflow/providers/google/cloud/log/stackdriver_task_handler.py +11 -10
  65. airflow/providers/google/cloud/openlineage/facets.py +67 -0
  66. airflow/providers/google/cloud/openlineage/mixins.py +438 -173
  67. airflow/providers/google/cloud/openlineage/utils.py +394 -61
  68. airflow/providers/google/cloud/operators/alloy_db.py +980 -69
  69. airflow/providers/google/cloud/operators/automl.py +83 -245
  70. airflow/providers/google/cloud/operators/bigquery.py +377 -74
  71. airflow/providers/google/cloud/operators/bigquery_dts.py +126 -13
  72. airflow/providers/google/cloud/operators/bigtable.py +1 -3
  73. airflow/providers/google/cloud/operators/cloud_base.py +1 -2
  74. airflow/providers/google/cloud/operators/cloud_batch.py +2 -4
  75. airflow/providers/google/cloud/operators/cloud_build.py +3 -5
  76. airflow/providers/google/cloud/operators/cloud_composer.py +5 -7
  77. airflow/providers/google/cloud/operators/cloud_memorystore.py +4 -6
  78. airflow/providers/google/cloud/operators/cloud_run.py +6 -5
  79. airflow/providers/google/cloud/operators/cloud_sql.py +20 -8
  80. airflow/providers/google/cloud/operators/cloud_storage_transfer_service.py +62 -8
  81. airflow/providers/google/cloud/operators/compute.py +3 -4
  82. airflow/providers/google/cloud/operators/datacatalog.py +9 -11
  83. airflow/providers/google/cloud/operators/dataflow.py +1 -112
  84. airflow/providers/google/cloud/operators/dataform.py +3 -5
  85. airflow/providers/google/cloud/operators/datafusion.py +1 -1
  86. airflow/providers/google/cloud/operators/dataplex.py +2046 -7
  87. airflow/providers/google/cloud/operators/dataproc.py +102 -17
  88. airflow/providers/google/cloud/operators/dataproc_metastore.py +7 -9
  89. airflow/providers/google/cloud/operators/dlp.py +17 -19
  90. airflow/providers/google/cloud/operators/gcs.py +14 -17
  91. airflow/providers/google/cloud/operators/kubernetes_engine.py +2 -2
  92. airflow/providers/google/cloud/operators/managed_kafka.py +788 -0
  93. airflow/providers/google/cloud/operators/natural_language.py +3 -5
  94. airflow/providers/google/cloud/operators/pubsub.py +39 -7
  95. airflow/providers/google/cloud/operators/speech_to_text.py +3 -5
  96. airflow/providers/google/cloud/operators/stackdriver.py +3 -5
  97. airflow/providers/google/cloud/operators/tasks.py +4 -6
  98. airflow/providers/google/cloud/operators/text_to_speech.py +2 -4
  99. airflow/providers/google/cloud/operators/translate.py +414 -5
  100. airflow/providers/google/cloud/operators/translate_speech.py +2 -4
  101. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +9 -8
  102. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +4 -6
  103. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +6 -8
  104. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +4 -6
  105. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +4 -6
  106. airflow/providers/google/cloud/operators/vertex_ai/generative_model.py +0 -322
  107. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +4 -6
  108. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +4 -6
  109. airflow/providers/google/cloud/operators/vertex_ai/pipeline_job.py +4 -6
  110. airflow/providers/google/cloud/operators/video_intelligence.py +3 -5
  111. airflow/providers/google/cloud/operators/vision.py +4 -6
  112. airflow/providers/google/cloud/operators/workflows.py +5 -7
  113. airflow/providers/google/cloud/secrets/secret_manager.py +1 -2
  114. airflow/providers/google/cloud/sensors/bigquery_dts.py +3 -5
  115. airflow/providers/google/cloud/sensors/bigtable.py +2 -3
  116. airflow/providers/google/cloud/sensors/cloud_composer.py +32 -8
  117. airflow/providers/google/cloud/sensors/cloud_storage_transfer_service.py +39 -1
  118. airflow/providers/google/cloud/sensors/dataplex.py +4 -6
  119. airflow/providers/google/cloud/sensors/dataproc.py +2 -3
  120. airflow/providers/google/cloud/sensors/dataproc_metastore.py +1 -2
  121. airflow/providers/google/cloud/sensors/gcs.py +2 -4
  122. airflow/providers/google/cloud/sensors/pubsub.py +2 -3
  123. airflow/providers/google/cloud/sensors/workflows.py +3 -5
  124. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +5 -5
  125. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +10 -12
  126. airflow/providers/google/cloud/transfers/gcs_to_gcs.py +1 -1
  127. airflow/providers/google/cloud/transfers/gcs_to_sftp.py +36 -4
  128. airflow/providers/google/cloud/transfers/mssql_to_gcs.py +27 -2
  129. airflow/providers/google/cloud/transfers/mysql_to_gcs.py +27 -2
  130. airflow/providers/google/cloud/transfers/postgres_to_gcs.py +27 -2
  131. airflow/providers/google/cloud/transfers/sftp_to_gcs.py +34 -5
  132. airflow/providers/google/cloud/transfers/sql_to_gcs.py +15 -0
  133. airflow/providers/google/cloud/transfers/trino_to_gcs.py +25 -2
  134. airflow/providers/google/cloud/triggers/bigquery_dts.py +1 -2
  135. airflow/providers/google/cloud/triggers/cloud_batch.py +1 -2
  136. airflow/providers/google/cloud/triggers/cloud_build.py +1 -2
  137. airflow/providers/google/cloud/triggers/cloud_composer.py +13 -3
  138. airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +102 -4
  139. airflow/providers/google/cloud/triggers/dataflow.py +2 -3
  140. airflow/providers/google/cloud/triggers/dataplex.py +1 -2
  141. airflow/providers/google/cloud/triggers/dataproc.py +2 -3
  142. airflow/providers/google/cloud/triggers/kubernetes_engine.py +1 -1
  143. airflow/providers/google/cloud/triggers/pubsub.py +1 -2
  144. airflow/providers/google/cloud/triggers/vertex_ai.py +7 -8
  145. airflow/providers/google/cloud/utils/credentials_provider.py +15 -8
  146. airflow/providers/google/cloud/utils/external_token_supplier.py +1 -0
  147. airflow/providers/google/common/auth_backend/google_openid.py +4 -4
  148. airflow/providers/google/common/consts.py +1 -2
  149. airflow/providers/google/common/hooks/base_google.py +8 -7
  150. airflow/providers/google/get_provider_info.py +186 -134
  151. airflow/providers/google/marketing_platform/hooks/analytics_admin.py +2 -3
  152. airflow/providers/google/marketing_platform/hooks/search_ads.py +1 -1
  153. airflow/providers/google/marketing_platform/operators/analytics_admin.py +5 -7
  154. {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-14.0.0.dist-info}/METADATA +41 -58
  155. {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-14.0.0.dist-info}/RECORD +157 -159
  156. airflow/providers/google/cloud/example_dags/example_facebook_ads_to_gcs.py +0 -141
  157. airflow/providers/google/cloud/example_dags/example_looker.py +0 -64
  158. airflow/providers/google/cloud/example_dags/example_presto_to_gcs.py +0 -194
  159. airflow/providers/google/cloud/example_dags/example_salesforce_to_gcs.py +0 -129
  160. airflow/providers/google/marketing_platform/example_dags/__init__.py +0 -16
  161. airflow/providers/google/marketing_platform/example_dags/example_display_video.py +0 -213
  162. {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-14.0.0.dist-info}/WHEEL +0 -0
  163. {apache_airflow_providers_google-12.0.0rc2.dist-info → apache_airflow_providers_google-14.0.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,104 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING
20
+
21
+ from airflow.providers.google.cloud.links.base import BaseGoogleLink
22
+
23
+ if TYPE_CHECKING:
24
+ from airflow.utils.context import Context
25
+
26
+ MANAGED_KAFKA_BASE_LINK = "/managedkafka"
27
+ MANAGED_KAFKA_CLUSTER_LINK = (
28
+ MANAGED_KAFKA_BASE_LINK + "/{location}/clusters/{cluster_id}?project={project_id}"
29
+ )
30
+ MANAGED_KAFKA_CLUSTER_LIST_LINK = MANAGED_KAFKA_BASE_LINK + "/clusters?project={project_id}"
31
+ MANAGED_KAFKA_TOPIC_LINK = (
32
+ MANAGED_KAFKA_BASE_LINK + "/{location}/clusters/{cluster_id}/topics/{topic_id}?project={project_id}"
33
+ )
34
+
35
+
36
+ class ApacheKafkaClusterLink(BaseGoogleLink):
37
+ """Helper class for constructing Apache Kafka Cluster link."""
38
+
39
+ name = "Apache Kafka Cluster"
40
+ key = "cluster_conf"
41
+ format_str = MANAGED_KAFKA_CLUSTER_LINK
42
+
43
+ @staticmethod
44
+ def persist(
45
+ context: Context,
46
+ task_instance,
47
+ cluster_id: str,
48
+ ):
49
+ task_instance.xcom_push(
50
+ context=context,
51
+ key=ApacheKafkaClusterLink.key,
52
+ value={
53
+ "location": task_instance.location,
54
+ "cluster_id": cluster_id,
55
+ "project_id": task_instance.project_id,
56
+ },
57
+ )
58
+
59
+
60
+ class ApacheKafkaClusterListLink(BaseGoogleLink):
61
+ """Helper class for constructing Apache Kafka Clusters link."""
62
+
63
+ name = "Apache Kafka Cluster List"
64
+ key = "cluster_list_conf"
65
+ format_str = MANAGED_KAFKA_CLUSTER_LIST_LINK
66
+
67
+ @staticmethod
68
+ def persist(
69
+ context: Context,
70
+ task_instance,
71
+ ):
72
+ task_instance.xcom_push(
73
+ context=context,
74
+ key=ApacheKafkaClusterListLink.key,
75
+ value={
76
+ "project_id": task_instance.project_id,
77
+ },
78
+ )
79
+
80
+
81
+ class ApacheKafkaTopicLink(BaseGoogleLink):
82
+ """Helper class for constructing Apache Kafka Topic link."""
83
+
84
+ name = "Apache Kafka Topic"
85
+ key = "topic_conf"
86
+ format_str = MANAGED_KAFKA_TOPIC_LINK
87
+
88
+ @staticmethod
89
+ def persist(
90
+ context: Context,
91
+ task_instance,
92
+ cluster_id: str,
93
+ topic_id: str,
94
+ ):
95
+ task_instance.xcom_push(
96
+ context=context,
97
+ key=ApacheKafkaTopicLink.key,
98
+ value={
99
+ "location": task_instance.location,
100
+ "cluster_id": cluster_id,
101
+ "topic_id": topic_id,
102
+ "project_id": task_instance.project_id,
103
+ },
104
+ )
@@ -56,6 +56,8 @@ TRANSLATION_NATIVE_MODEL_LINK = (
56
56
  )
57
57
  TRANSLATION_MODELS_LIST_LINK = TRANSLATION_BASE_LINK + "/models/list?project={project_id}"
58
58
 
59
+ TRANSLATION_HUB_RESOURCES_LIST_LINK = TRANSLATION_BASE_LINK + "/hub/resources?project={project_id}"
60
+
59
61
 
60
62
  class TranslationLegacyDatasetLink(BaseGoogleLink):
61
63
  """
@@ -368,3 +370,29 @@ class TranslateResultByOutputConfigLink(BaseGoogleLink):
368
370
  ),
369
371
  },
370
372
  )
373
+
374
+
375
+ class TranslationGlossariesListLink(BaseGoogleLink):
376
+ """
377
+ Helper class for constructing Translation Glossaries List link.
378
+
379
+ Link for the list of available glossaries.
380
+ """
381
+
382
+ name = "Translation Glossaries List"
383
+ key = "translation_glossaries_list"
384
+ format_str = TRANSLATION_HUB_RESOURCES_LIST_LINK
385
+
386
+ @staticmethod
387
+ def persist(
388
+ context: Context,
389
+ task_instance,
390
+ project_id: str,
391
+ ):
392
+ task_instance.xcom_push(
393
+ context,
394
+ key=TranslationGlossariesListLink.key,
395
+ value={
396
+ "project_id": project_id,
397
+ },
398
+ )
@@ -25,9 +25,6 @@ from functools import cached_property
25
25
  from pathlib import Path
26
26
  from typing import TYPE_CHECKING
27
27
 
28
- # not sure why but mypy complains on missing `storage` but it is clearly there and is importable
29
- from google.cloud import storage # type: ignore[attr-defined]
30
-
31
28
  from airflow.configuration import conf
32
29
  from airflow.exceptions import AirflowNotFoundException
33
30
  from airflow.providers.google.cloud.hooks.gcs import GCSHook, _parse_gcs_url
@@ -37,6 +34,9 @@ from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID
37
34
  from airflow.utils.log.file_task_handler import FileTaskHandler
38
35
  from airflow.utils.log.logging_mixin import LoggingMixin
39
36
 
37
+ # not sure why but mypy complains on missing `storage` but it is clearly there and is importable
38
+ from google.cloud import storage # type: ignore[attr-defined]
39
+
40
40
  if TYPE_CHECKING:
41
41
  from airflow.models.taskinstance import TaskInstance
42
42
 
@@ -25,23 +25,24 @@ from functools import cached_property
25
25
  from typing import TYPE_CHECKING
26
26
  from urllib.parse import urlencode
27
27
 
28
+ from airflow.exceptions import AirflowProviderDeprecationWarning
29
+ from airflow.providers.google.cloud.utils.credentials_provider import get_credentials_and_project_id
30
+ from airflow.providers.google.common.consts import CLIENT_INFO
31
+ from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
32
+ from airflow.utils.types import NOTSET, ArgNotSet
28
33
  from google.cloud import logging as gcp_logging
29
34
  from google.cloud.logging import Resource
30
35
  from google.cloud.logging.handlers.transports import BackgroundThreadTransport, Transport
31
36
  from google.cloud.logging_v2.services.logging_service_v2 import LoggingServiceV2Client
32
37
  from google.cloud.logging_v2.types import ListLogEntriesRequest, ListLogEntriesResponse
33
38
 
34
- from airflow.exceptions import RemovedInAirflow3Warning
35
- from airflow.providers.google.cloud.utils.credentials_provider import get_credentials_and_project_id
36
- from airflow.providers.google.common.consts import CLIENT_INFO
37
- from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
38
- from airflow.utils.log.trigger_handler import ctx_indiv_trigger
39
- from airflow.utils.types import NOTSET, ArgNotSet
40
-
41
39
  if TYPE_CHECKING:
40
+ from airflow.models import TaskInstance
42
41
  from google.auth.credentials import Credentials
43
42
 
44
- from airflow.models import TaskInstance
43
+
44
+ if not AIRFLOW_V_3_0_PLUS:
45
+ from airflow.utils.log.trigger_handler import ctx_indiv_trigger
45
46
 
46
47
  DEFAULT_LOGGER_NAME = "airflow"
47
48
  _GLOBAL_RESOURCE = Resource(type="global", labels={})
@@ -108,7 +109,7 @@ class StackdriverTaskHandler(logging.Handler):
108
109
  warnings.warn(
109
110
  "Param `name` is deprecated and will be removed in a future release. "
110
111
  "Please use `gcp_log_name` instead. ",
111
- RemovedInAirflow3Warning,
112
+ AirflowProviderDeprecationWarning,
112
113
  stacklevel=2,
113
114
  )
114
115
  gcp_log_name = str(name)
@@ -184,7 +185,7 @@ class StackdriverTaskHandler(logging.Handler):
184
185
  """
185
186
  message = self.format(record)
186
187
  ti = None
187
- if getattr(record, ctx_indiv_trigger.name, None):
188
+ if not AIRFLOW_V_3_0_PLUS and getattr(record, ctx_indiv_trigger.name, None):
188
189
  ti = getattr(record, "task_instance", None) # trigger context
189
190
  labels = self._get_labels(ti)
190
191
  self._transport.send(record, message, resource=self.resource, labels=labels)
@@ -0,0 +1,67 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+ from __future__ import annotations
19
+
20
+ from typing import TYPE_CHECKING
21
+
22
+ from attr import define, field
23
+
24
+ from airflow.providers.google import __version__ as provider_version
25
+
26
+ if TYPE_CHECKING:
27
+ from openlineage.client.generated.base import RunFacet
28
+ else:
29
+ try:
30
+ try:
31
+ from openlineage.client.generated.base import RunFacet
32
+ except ImportError: # Old OpenLineage client is used
33
+ from openlineage.client.facet import BaseFacet as RunFacet
34
+
35
+ @define
36
+ class BigQueryJobRunFacet(RunFacet):
37
+ """
38
+ Facet that represents relevant statistics of bigquery run.
39
+
40
+ :param cached: BigQuery caches query results. Rest of the statistics will not be provided for cached queries.
41
+ :param billedBytes: How many bytes BigQuery bills for.
42
+ :param properties: Full property tree of BigQUery run.
43
+ """
44
+
45
+ cached: bool
46
+ billedBytes: int | None = field(default=None)
47
+ properties: str | None = field(default=None)
48
+
49
+ @staticmethod
50
+ def _get_schema() -> str:
51
+ return (
52
+ "https://raw.githubusercontent.com/apache/airflow/"
53
+ f"providers-google/{provider_version}/airflow/providers/google/"
54
+ "openlineage/BigQueryJobRunFacet.json"
55
+ )
56
+ except ImportError: # OpenLineage is not available
57
+
58
+ def create_no_op(*_, **__) -> None:
59
+ """
60
+ Create a no-op placeholder.
61
+
62
+ This function creates and returns a None value, used as a placeholder when the OpenLineage client
63
+ library is available. It represents an action that has no effect.
64
+ """
65
+ return None
66
+
67
+ BigQueryJobRunFacet = create_no_op