diff --git a/ingestion/src/metadata/ingestion/source/database/bigquery/metadata.py b/ingestion/src/metadata/ingestion/source/database/bigquery/metadata.py index 310cb203601..3161b063365 100644 --- a/ingestion/src/metadata/ingestion/source/database/bigquery/metadata.py +++ b/ingestion/src/metadata/ingestion/source/database/bigquery/metadata.py @@ -34,9 +34,11 @@ from metadata.generated.schema.entity.data.database import Database from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema from metadata.generated.schema.entity.data.storedProcedure import StoredProcedureCode from metadata.generated.schema.entity.data.table import ( + ConstraintType, PartitionColumnDetails, PartitionIntervalTypes, Table, + TableConstraint, TablePartition, TableType, ) @@ -96,6 +98,7 @@ from metadata.ingestion.source.database.life_cycle_query_mixin import ( from metadata.ingestion.source.database.multi_db_source import MultiDBSource from metadata.utils import fqn from metadata.utils.credentials import GOOGLE_CREDENTIALS +from metadata.utils.execution_time_tracker import calculate_execution_time from metadata.utils.filters import filter_by_database, filter_by_schema from metadata.utils.logger import ingestion_logger from metadata.utils.sqlalchemy_utils import ( @@ -657,6 +660,42 @@ class BigquerySource(LifeCycleQueryMixin, CommonDbSourceService, MultiDBSource): ) return None + @calculate_execution_time() + def update_table_constraints( + self, + table_name, + schema_name, + db_name, + table_constraints, + foreign_columns, + columns, + ) -> List[TableConstraint]: + """ + From topology. + process the table constraints of all tables + """ + table_constraints = super().update_table_constraints( + table_name, + schema_name, + db_name, + table_constraints, + foreign_columns, + columns, + ) + try: + table = self.client.get_table(fqn._build(db_name, schema_name, table_name)) + if hasattr(table, "clustering_fields") and table.clustering_fields: + table_constraints.append( + TableConstraint( + constraintType=ConstraintType.CLUSTER_KEY, + columns=table.clustering_fields, + ) + ) + except Exception as exc: + logger.warning(f"Error getting clustering fields for {table_name}: {exc}") + logger.debug(traceback.format_exc()) + return table_constraints + def get_table_partition_details( self, table_name: str, schema_name: str, inspector: Inspector ) -> Tuple[bool, Optional[TablePartition]]: diff --git a/openmetadata-spec/src/main/resources/json/schema/entity/data/table.json b/openmetadata-spec/src/main/resources/json/schema/entity/data/table.json index 4ad8fb950ed..d7e26c64432 100644 --- a/openmetadata-spec/src/main/resources/json/schema/entity/data/table.json +++ b/openmetadata-spec/src/main/resources/json/schema/entity/data/table.json @@ -193,7 +193,8 @@ "PRIMARY_KEY", "FOREIGN_KEY", "SORT_KEY", - "DIST_KEY" + "DIST_KEY", + "CLUSTER_KEY" ] }, "columns": { diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts index 5f77612a38a..bc444dcc9e6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 Collate. + * Copyright 2025 Collate. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -10,9 +10,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - - /** +/** * A `Table` entity organizes data in rows and columns and is defined in a `Database Schema`. */ export interface Table { @@ -1064,6 +1062,7 @@ export interface TableConstraint { } export enum ConstraintType { + ClusterKey = "CLUSTER_KEY", DistKey = "DIST_KEY", ForeignKey = "FOREIGN_KEY", PrimaryKey = "PRIMARY_KEY", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json index 690eb3ab147..d2688d0fd91 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json @@ -181,6 +181,7 @@ "closed-task-plural": "Geschlossene Aufgaben", "closed-this-task-lowercase": "diese Aufgabe schließen", "cloud-config-source": "Cloud-Konfigurationsquelle", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "Alle minimieren", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json index ffebb99d84e..41055696662 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json @@ -181,6 +181,7 @@ "closed-task-plural": "Closed Tasks", "closed-this-task-lowercase": "closed this task", "cloud-config-source": "Cloud Config Source", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "Collapse All", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json index 3703b2f9933..156872374ab 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json @@ -181,6 +181,7 @@ "closed-task-plural": "Tareas cerradas", "closed-this-task-lowercase": "cerró esta tarea", "cloud-config-source": "Fuente de configuración en el cloud", + "cluster": "Cluster", "code": "Código", "collapse": "Collapse", "collapse-all": "Contraer todo", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json index 8772b632665..18677e23538 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json @@ -181,6 +181,7 @@ "closed-task-plural": "Tâches Clôturées", "closed-this-task-lowercase": "fermer cette tâche", "cloud-config-source": "Source de Configuration Cloud", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "Tout Réduire", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json index b8e0a9b2436..6940b0f4fda 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json @@ -181,6 +181,7 @@ "closed-task-plural": "Tarefas pechadas", "closed-this-task-lowercase": "pechou esta tarefa", "cloud-config-source": "Fonte de configuración na nube", + "cluster": "Cluster", "code": "Código", "collapse": "Colapsar", "collapse-all": "Colapsar todo", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json index d6adf28d607..ead95aba628 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json @@ -181,6 +181,7 @@ "closed-task-plural": "משימות סגורות", "closed-this-task-lowercase": "סגר את המשימה הזו", "cloud-config-source": "מקור תצורת ענן", + "cluster": "Cluster", "code": "קוד", "collapse": "Collapse", "collapse-all": "קפיצה לתחתית", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json index ae5326363ec..1327ae2b4fa 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json @@ -181,6 +181,7 @@ "closed-task-plural": "終了したタスク", "closed-this-task-lowercase": "このタスクを終了する", "cloud-config-source": "Cloud Config Source", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "全て折り畳む", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json index 8f2565acdd5..d596e1ebb1c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json @@ -181,6 +181,7 @@ "closed-task-plural": "बंद केलेली कार्ये", "closed-this-task-lowercase": "हे कार्य बंद केले", "cloud-config-source": "क्लाउड कॉन्फिग स्रोत", + "cluster": "Cluster", "code": "कोड", "collapse": "संकुचित करा", "collapse-all": "सर्व संकुचित करा", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json index 15817176b0a..21543ca5299 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json @@ -181,6 +181,7 @@ "closed-task-plural": "Gesloten taken", "closed-this-task-lowercase": "deze taak gesloten", "cloud-config-source": "Cloud Config-bron", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "Alles inklappen", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json index 2546b560b9b..9922b9400d7 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json @@ -181,6 +181,7 @@ "closed-task-plural": "وظایف بسته شده", "closed-this-task-lowercase": "این وظیفه بسته شد", "cloud-config-source": "منبع پیکربندی ابری", + "cluster": "Cluster", "code": "کد", "collapse": "فروپاشی", "collapse-all": "فروپاشی همه", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json index 09f82975404..a6a819bc5f8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json @@ -181,6 +181,7 @@ "closed-task-plural": "Tarefas Fechadas", "closed-this-task-lowercase": "fechou esta tarefa", "cloud-config-source": "Fonte de Configuração na Nuvem", + "cluster": "Cluster", "code": "Código", "collapse": "Collapse", "collapse-all": "Recolher Tudo", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json index 3aba26aae30..41e2c1ae3a9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json @@ -181,6 +181,7 @@ "closed-task-plural": "Tarefas Fechadas", "closed-this-task-lowercase": "fechou esta tarefa", "cloud-config-source": "Fonte de Configuração na Nuvem", + "cluster": "Cluster", "code": "Código", "collapse": "Collapse", "collapse-all": "Recolher Tudo", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json index 2841b74c9ed..74b6a843648 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json @@ -181,6 +181,7 @@ "closed-task-plural": "Закрытые задачи", "closed-this-task-lowercase": "закрыть задачу", "cloud-config-source": "Источник облачной конфигурации", + "cluster": "Cluster", "code": "Code", "collapse": "Collapse", "collapse-all": "Свернуть все", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json index ab625290b3e..d84c39bca1b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json @@ -181,6 +181,7 @@ "closed-task-plural": "งานที่ปิดแล้ว", "closed-this-task-lowercase": "ปิดงานนี้", "cloud-config-source": "แหล่งที่มาของการกำหนดค่าบนคลาวด์", + "cluster": "Cluster", "code": "รหัส", "collapse": "ย่อ", "collapse-all": "ย่อทั้งหมด", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json index 2a2717b4f01..4768af56a9e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json @@ -181,6 +181,7 @@ "closed-task-plural": "已关闭任务", "closed-this-task-lowercase": "关闭此任务", "cloud-config-source": "云配置源", + "cluster": "Cluster", "code": "Code", "collapse": "折叠", "collapse-all": "全部折叠", diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx index 733166acfd0..06a153e7c95 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx @@ -247,6 +247,15 @@ export const getConstraintIcon = ({ break; } + case ConstraintType.ClusterKey: { + title = t('label.entity-key', { + entity: t('label.cluster'), + }); + icon = isConstraintDeleted ? IconDistLineThrough : IconDistKey; + dataTestId = 'cluster-key'; + + break; + } default: return null; }