| 
									
										
										
										
											2021-12-01 12:46:28 +05:30
										 |  |  | #  Copyright 2021 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 | 
					
						
							|  |  |  | #  http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:31:38 +02:00
										 |  |  | OpenMetadata high-level API Table test | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2022-05-26 07:35:23 +02:00
										 |  |  | from copy import deepcopy | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  | from datetime import datetime, timezone | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | from unittest import TestCase | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  | from metadata.generated.schema.api.data.createDatabase import CreateDatabaseRequest | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  | from metadata.generated.schema.api.data.createDatabaseSchema import ( | 
					
						
							|  |  |  |     CreateDatabaseSchemaRequest, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  | from metadata.generated.schema.api.data.createTable import CreateTableRequest | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  | from metadata.generated.schema.api.data.createTableProfile import ( | 
					
						
							|  |  |  |     CreateTableProfileRequest, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | from metadata.generated.schema.api.services.createDatabaseService import ( | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  |     CreateDatabaseServiceRequest, | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  | from metadata.generated.schema.api.teams.createUser import CreateUserRequest | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | from metadata.generated.schema.entity.data.table import ( | 
					
						
							|  |  |  |     Column, | 
					
						
							|  |  |  |     ColumnJoins, | 
					
						
							|  |  |  |     ColumnProfile, | 
					
						
							|  |  |  |     DataType, | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |     JoinedWith, | 
					
						
							| 
									
										
										
										
											2022-11-25 06:56:12 +01:00
										 |  |  |     SqlQuery, | 
					
						
							| 
									
										
										
										
											2022-12-07 14:33:30 +01:00
										 |  |  |     SystemProfile, | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |     Table, | 
					
						
							|  |  |  |     TableData, | 
					
						
							|  |  |  |     TableJoins, | 
					
						
							|  |  |  |     TableProfile, | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |     TableProfilerConfig, | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  | from metadata.generated.schema.entity.services.connections.database.mysqlConnection import ( | 
					
						
							|  |  |  |     MysqlConnection, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-04-12 23:40:21 -07:00
										 |  |  | from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( | 
					
						
							|  |  |  |     OpenMetadataConnection, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | from metadata.generated.schema.entity.services.databaseService import ( | 
					
						
							| 
									
										
										
										
											2022-01-21 22:06:14 -08:00
										 |  |  |     DatabaseConnection, | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     DatabaseService, | 
					
						
							|  |  |  |     DatabaseServiceType, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2022-09-26 16:19:47 +05:30
										 |  |  | from metadata.generated.schema.security.client.openMetadataJWTClientConfig import ( | 
					
						
							|  |  |  |     OpenMetadataJWTClientConfig, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | from metadata.generated.schema.type.entityReference import EntityReference | 
					
						
							| 
									
										
										
										
											2022-06-03 13:42:28 +05:30
										 |  |  | from metadata.generated.schema.type.usageRequest import UsageRequest | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | from metadata.ingestion.ometa.ometa_api import OpenMetadata | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class OMetaTableTest(TestCase): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Run this integration test with the local API available | 
					
						
							|  |  |  |     Install the ingestion package before running the tests | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     service_entity_id = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-26 16:19:47 +05:30
										 |  |  |     server_config = OpenMetadataConnection( | 
					
						
							|  |  |  |         hostPort="http://localhost:8585/api", | 
					
						
							|  |  |  |         authProvider="openmetadata", | 
					
						
							|  |  |  |         securityConfig=OpenMetadataJWTClientConfig( | 
					
						
							|  |  |  |             jwtToken="eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     metadata = OpenMetadata(server_config) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-31 16:23:01 +01:00
										 |  |  |     assert metadata.health_check() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     user = metadata.create_or_update( | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  |         data=CreateUserRequest(name="random-user", email="random@user.com"), | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     ) | 
					
						
							|  |  |  |     owner = EntityReference(id=user.id, type="user") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  |     service = CreateDatabaseServiceRequest( | 
					
						
							| 
									
										
										
										
											2021-10-28 20:31:38 +02:00
										 |  |  |         name="test-service-table", | 
					
						
							| 
									
										
										
										
											2022-04-14 11:22:39 +02:00
										 |  |  |         serviceType=DatabaseServiceType.Mysql, | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |         connection=DatabaseConnection( | 
					
						
							|  |  |  |             config=MysqlConnection( | 
					
						
							|  |  |  |                 username="username", | 
					
						
							|  |  |  |                 password="password", | 
					
						
							|  |  |  |                 hostPort="http://localhost:1234", | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     ) | 
					
						
							|  |  |  |     service_type = "databaseService" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls) -> None: | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Prepare ingredients | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2021-10-31 16:23:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         cls.service_entity = cls.metadata.create_or_update(data=cls.service) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |         create_db = CreateDatabaseRequest( | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |             name="test-db", | 
					
						
							|  |  |  |             service=EntityReference(id=cls.service_entity.id, type="databaseService"), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |         create_db_entity = cls.metadata.create_or_update(data=create_db) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 12:19:36 +01:00
										 |  |  |         cls.db_reference = EntityReference( | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |             id=create_db_entity.id, name="test-db", type="database" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         create_schema = CreateDatabaseSchemaRequest( | 
					
						
							|  |  |  |             name="test-schema", database=cls.db_reference | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         create_schema_entity = cls.metadata.create_or_update(data=create_schema) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cls.schema_reference = EntityReference( | 
					
						
							|  |  |  |             id=create_schema_entity.id, name="test-schema", type="databaseSchema" | 
					
						
							| 
									
										
										
										
											2022-03-01 12:19:36 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-02-04 12:39:08 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         cls.entity = Table( | 
					
						
							|  |  |  |             id=uuid.uuid4(), | 
					
						
							|  |  |  |             name="test", | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |             databaseSchema=cls.schema_reference, | 
					
						
							|  |  |  |             fullyQualifiedName="test-service-table.test-db.test-schema.test", | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |             columns=[Column(name="id", dataType=DataType.BIGINT)], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  |         cls.create = CreateTableRequest( | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |             name="test", | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |             databaseSchema=cls.schema_reference, | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |             columns=[Column(name="id", dataType=DataType.BIGINT)], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls) -> None: | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Clean up | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         service_id = str( | 
					
						
							|  |  |  |             cls.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |                 entity=DatabaseService, fqn="test-service-table" | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |             ).id.__root__ | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-21 22:30:39 +05:30
										 |  |  |         cls.metadata.delete( | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |             entity=DatabaseService, | 
					
						
							|  |  |  |             entity_id=service_id, | 
					
						
							|  |  |  |             recursive=True, | 
					
						
							|  |  |  |             hard_delete=True, | 
					
						
							| 
									
										
										
										
											2022-03-21 22:30:39 +05:30
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_create(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can create a Table and we receive it back as Entity | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(res.name, self.entity.name) | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |         self.assertEqual(res.databaseSchema.id, self.entity.databaseSchema.id) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         self.assertEqual(res.owner, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_update(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Updating it properly changes its properties | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res_create = self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         updated = self.create.dict(exclude_unset=True) | 
					
						
							|  |  |  |         updated["owner"] = self.owner | 
					
						
							| 
									
										
										
										
											2022-02-01 01:29:56 +01:00
										 |  |  |         updated_entity = CreateTableRequest(**updated) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         res = self.metadata.create_or_update(data=updated_entity) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |         # Same ID, updated owner | 
					
						
							|  |  |  |         self.assertEqual(res.databaseSchema.id, updated_entity.databaseSchema.id) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         self.assertEqual(res_create.id, res.id) | 
					
						
							|  |  |  |         self.assertEqual(res.owner.id, self.user.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_name(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can fetch a Table by name and get it back as Entity | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual(res.name, self.entity.name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_id(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can fetch a Table by ID and get it back as Entity | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First pick up by name | 
					
						
							|  |  |  |         res_name = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  |         # Then fetch by ID | 
					
						
							|  |  |  |         res = self.metadata.get_by_id(entity=Table, entity_id=str(res_name.id.__root__)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(res_name.id, res.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_list(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can list all our Tables | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 07:35:23 +02:00
										 |  |  |         res = self.metadata.list_entities(entity=Table) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Fetch our test Database. We have already inserted it, so we should find it | 
					
						
							|  |  |  |         data = next( | 
					
						
							|  |  |  |             iter(ent for ent in res.entities if ent.name == self.entity.name), None | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         assert data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 07:35:23 +02:00
										 |  |  |     def test_list_all(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Validate generator utility to fetch all tables | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         fake_create = deepcopy(self.create) | 
					
						
							|  |  |  |         for i in range(0, 10): | 
					
						
							|  |  |  |             fake_create.name = self.create.name.__root__ + str(i) | 
					
						
							|  |  |  |             self.metadata.create_or_update(data=fake_create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         all_entities = self.metadata.list_all_entities( | 
					
						
							|  |  |  |             entity=Table, limit=2  # paginate in batches of pairs | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         assert ( | 
					
						
							|  |  |  |             len(list(all_entities)) >= 10 | 
					
						
							|  |  |  |         )  # In case the default testing entity is not present | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |     def test_delete(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can delete a Table by ID | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Find by name | 
					
						
							|  |  |  |         res_name = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  |         # Then fetch by ID | 
					
						
							| 
									
										
										
										
											2021-12-06 08:40:53 +01:00
										 |  |  |         res_id = self.metadata.get_by_id(entity=Table, entity_id=res_name.id) | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Delete | 
					
						
							|  |  |  |         self.metadata.delete(entity=Table, entity_id=str(res_id.id.__root__)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Then we should not find it | 
					
						
							|  |  |  |         res = self.metadata.list_entities(entity=Table) | 
					
						
							|  |  |  |         assert not next( | 
					
						
							| 
									
										
										
										
											2021-10-28 20:31:38 +02:00
										 |  |  |             iter( | 
					
						
							|  |  |  |                 ent | 
					
						
							|  |  |  |                 for ent in res.entities | 
					
						
							|  |  |  |                 if ent.fullyQualifiedName == self.entity.fullyQualifiedName | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             None, | 
					
						
							| 
									
										
										
										
											2021-10-26 23:18:43 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_ingest_sample_data(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can ingest sample TableData | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First pick up by name | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sample_data = TableData(columns=["id"], rows=[[1], [2], [3]]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res_sample = self.metadata.ingest_table_sample_data(res, sample_data) | 
					
						
							|  |  |  |         assert res_sample == sample_data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-12 15:08:01 +01:00
										 |  |  |         # Let's also validate that we can properly retrieve sample data back | 
					
						
							|  |  |  |         res_sample = self.metadata.get_sample_data(table=res).sampleData | 
					
						
							|  |  |  |         assert res_sample == sample_data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |     def test_ingest_table_profile_data(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can ingest profile data TableProfile | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First pick up by name | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         table_profile = TableProfile( | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |             timestamp=datetime.now().timestamp(), | 
					
						
							|  |  |  |             columnCount=1.0, | 
					
						
							|  |  |  |             rowCount=3.0, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         column_profile = [ | 
					
						
							|  |  |  |             ColumnProfile( | 
					
						
							|  |  |  |                 name="id", | 
					
						
							|  |  |  |                 uniqueCount=3.0, | 
					
						
							|  |  |  |                 uniqueProportion=1.0, | 
					
						
							|  |  |  |                 min=1, | 
					
						
							|  |  |  |                 max=3, | 
					
						
							|  |  |  |                 mean=1.5, | 
					
						
							|  |  |  |                 sum=2, | 
					
						
							|  |  |  |                 stddev=None, | 
					
						
							|  |  |  |                 timestamp=datetime.now(tz=timezone.utc).timestamp(), | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2022-12-07 14:33:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         system_profile = [ | 
					
						
							|  |  |  |             SystemProfile( | 
					
						
							|  |  |  |                 timestamp=datetime.now(tz=timezone.utc).timestamp(), | 
					
						
							|  |  |  |                 operation="INSERT", | 
					
						
							|  |  |  |                 rowsAffected=11, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             SystemProfile( | 
					
						
							|  |  |  |                 timestamp=datetime.now(tz=timezone.utc).timestamp(), | 
					
						
							|  |  |  |                 operation="UPDATE", | 
					
						
							|  |  |  |                 rowsAffected=110, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         profile = CreateTableProfileRequest( | 
					
						
							| 
									
										
										
										
											2022-12-07 14:33:30 +01:00
										 |  |  |             tableProfile=table_profile, | 
					
						
							|  |  |  |             columnProfile=column_profile, | 
					
						
							|  |  |  |             systemProfile=system_profile, | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-11-25 06:56:12 +01:00
										 |  |  |         self.metadata.ingest_profile_data(res, profile) | 
					
						
							| 
									
										
										
										
											2022-12-06 21:07:04 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         table = self.metadata.get_latest_table_profile(self.entity.fullyQualifiedName) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         assert table.profile == table_profile | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         res_column_profile = next( | 
					
						
							| 
									
										
										
										
											2022-12-06 21:07:04 -08:00
										 |  |  |             (col.profile for col in table.columns if col.name.__root__ == "id") | 
					
						
							| 
									
										
										
										
											2022-08-22 09:01:24 -07:00
										 |  |  |         ) | 
					
						
							|  |  |  |         assert res_column_profile == column_profile[0] | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_publish_table_usage(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can POST usage data for a Table | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First pick up by name | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-03 13:42:28 +05:30
										 |  |  |         usage = UsageRequest(date="2021-10-20", count=10) | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.publish_table_usage(res, usage) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_publish_frequently_joined_with(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can PUT freq Table JOINs | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # First pick up by name | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |         column_join_table_req = CreateTableRequest( | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |             name="another-test", | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |             databaseSchema=self.schema_reference, | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |             columns=[Column(name="another_id", dataType=DataType.BIGINT)], | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |         column_join_table_res = self.metadata.create_or_update(column_join_table_req) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         direct_join_table_req = CreateTableRequest( | 
					
						
							|  |  |  |             name="direct-join-test", | 
					
						
							|  |  |  |             databaseSchema=self.schema_reference, | 
					
						
							|  |  |  |             columns=[], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         direct_join_table_res = self.metadata.create_or_update(direct_join_table_req) | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         joins = TableJoins( | 
					
						
							|  |  |  |             startDate=datetime.now(), | 
					
						
							|  |  |  |             dayCount=1, | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |             directTableJoins=[ | 
					
						
							|  |  |  |                 JoinedWith( | 
					
						
							|  |  |  |                     fullyQualifiedName="test-service-table.test-db.test-schema.direct-join-test", | 
					
						
							|  |  |  |                     joinCount=2, | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |             columnJoins=[ | 
					
						
							|  |  |  |                 ColumnJoins( | 
					
						
							|  |  |  |                     columnName="id", | 
					
						
							|  |  |  |                     joinedWith=[ | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |                         JoinedWith( | 
					
						
							| 
									
										
										
										
											2022-04-05 21:20:39 +02:00
										 |  |  |                             fullyQualifiedName="test-service-table.test-db.test-schema.another-test.another_id", | 
					
						
							| 
									
										
										
										
											2021-11-01 16:57:53 +01:00
										 |  |  |                             joinCount=2, | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.publish_frequently_joined_with(res, joins) | 
					
						
							| 
									
										
										
										
											2022-05-26 09:41:26 +03:00
										 |  |  |         self.metadata.delete( | 
					
						
							|  |  |  |             entity=Table, entity_id=str(column_join_table_res.id.__root__) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.metadata.delete( | 
					
						
							|  |  |  |             entity=Table, entity_id=str(direct_join_table_res.id.__root__) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-25 06:56:12 +01:00
										 |  |  |     def test_table_queries(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Test add and update table query data | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = self.metadata.get_by_name( | 
					
						
							|  |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         query_no_user = SqlQuery(query="select * from awesome") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.ingest_table_queries_data( | 
					
						
							|  |  |  |             table=res, table_queries=[query_no_user] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-12-06 21:07:04 -08:00
										 |  |  |         table_with_query: Table = self.metadata.get_table_queries(res.id) | 
					
						
							| 
									
										
										
										
											2022-11-25 06:56:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         assert len(table_with_query.tableQueries) == 1 | 
					
						
							|  |  |  |         assert table_with_query.tableQueries[0].query == query_no_user.query | 
					
						
							|  |  |  |         assert table_with_query.tableQueries[0].users is None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Validate that we can properly add user information | 
					
						
							|  |  |  |         query_with_user = SqlQuery(query="select * from awesome", users=[self.owner]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.metadata.ingest_table_queries_data( | 
					
						
							|  |  |  |             table=res, table_queries=[query_with_user] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-12-06 21:07:04 -08:00
										 |  |  |         table_with_query: Table = self.metadata.get_table_queries(res.id) | 
					
						
							| 
									
										
										
										
											2022-11-25 06:56:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         assert len(table_with_query.tableQueries) == 1 | 
					
						
							|  |  |  |         assert table_with_query.tableQueries[0].query == query_with_user.query | 
					
						
							|  |  |  |         assert table_with_query.tableQueries[0].users == [self.owner] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  |     def test_list_versions(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         test list table entity versions | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Find by name | 
					
						
							|  |  |  |         res_name = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-10 09:07:39 +01:00
										 |  |  |         res = self.metadata.get_list_entity_versions( | 
					
						
							|  |  |  |             entity=Table, entity_id=res_name.id.__root__ | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  |         assert res | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_entity_version(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         test get table entity version | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Find by name | 
					
						
							|  |  |  |         res_name = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=self.entity.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  |         res = self.metadata.get_entity_version( | 
					
						
							| 
									
										
										
										
											2022-01-10 09:07:39 +01:00
										 |  |  |             entity=Table, entity_id=res_name.id.__root__, version=0.1 | 
					
						
							| 
									
										
										
										
											2022-01-07 10:37:56 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # check we get the correct version requested and the correct entity ID | 
					
						
							|  |  |  |         assert res.version.__root__ == 0.1 | 
					
						
							|  |  |  |         assert res.id == res_name.id | 
					
						
							| 
									
										
										
										
											2022-01-10 09:07:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_get_entity_ref(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         test get EntityReference | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         res = self.metadata.create_or_update(data=self.create) | 
					
						
							|  |  |  |         entity_ref = self.metadata.get_entity_reference( | 
					
						
							| 
									
										
										
										
											2022-05-26 21:00:18 +02:00
										 |  |  |             entity=Table, fqn=res.fullyQualifiedName | 
					
						
							| 
									
										
										
										
											2022-01-10 09:07:39 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         assert res.id == entity_ref.id | 
					
						
							| 
									
										
										
										
											2022-03-02 16:46:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 06:05:59 +01:00
										 |  |  |     def test_update_profile_sample(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can safely update the profile sample % | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         table = self.metadata.create_or_update(data=self.create) | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |         assert table.tableProfilerConfig is None | 
					
						
							| 
									
										
										
										
											2022-03-16 06:05:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |         self.metadata._create_or_update_table_profiler_config( | 
					
						
							| 
									
										
										
										
											2022-12-06 21:07:04 -08:00
										 |  |  |             table.id, table_profiler_config=TableProfilerConfig(profileSample=50.0) | 
					
						
							| 
									
										
										
										
											2022-03-16 06:05:59 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stored = self.metadata.get_by_name( | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |             entity=Table, fqn=table.fullyQualifiedName, fields=["tableProfilerConfig"] | 
					
						
							| 
									
										
										
										
											2022-03-16 06:05:59 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-08-04 07:22:47 -07:00
										 |  |  |         assert stored.tableProfilerConfig.profileSample == 50.0 |