acryl-datahub 0.15.0.6rc2__py3-none-any.whl → 1.0.0rc1__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.

Potentially problematic release.


This version of acryl-datahub might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  datahub/__init__.py,sha256=aq_i5lVREmoLfYIqcx_pEQicO855YlhD19tWc1eZZNI,59
2
2
  datahub/__main__.py,sha256=pegIvQ9hzK7IhqVeUi1MeADSZ2QlP-D3K0OQdEg55RU,106
3
- datahub/_version.py,sha256=BhSRdcjgmWwrve2zKjSYh9Z1fk_7CHpbmijLhhWMrJM,324
3
+ datahub/_version.py,sha256=eCl5OqKrV3CyQ-N-bMuAVTkwd6mFmeQ6QD9j87EU4YM,321
4
4
  datahub/entrypoints.py,sha256=2TYgHhs3sCxJlojIHjqfxzt3_ImPwPzq4vBtsUuMqu4,8885
5
5
  datahub/errors.py,sha256=w6h8b27j9XlmPbTwqpu7-wgiTrXlHzcnUOnJ_iOrwzo,520
6
6
  datahub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -70,7 +70,7 @@ datahub/cli/docker_cli.py,sha256=w9ZQMRVlHwfJI2XDe7mO0lwnT7-dZoK6tPadSMgwEM8,364
70
70
  datahub/cli/env_utils.py,sha256=RQzjg4JE29hjPt4v7p-RuqoOr99w8E3DBHWiN2Sm7T4,252
71
71
  datahub/cli/exists_cli.py,sha256=IsuU86R-g7BJjAl1vULH6d-BWJHAKa4XHLZl5WxGUEM,1233
72
72
  datahub/cli/get_cli.py,sha256=VV80BCXfZ0-C8fr2k43SIuN9DB-fOYP9StWsTHnXwFw,2327
73
- datahub/cli/iceberg_cli.py,sha256=8pnFYZM4enmOqhBh1c02Q8o25vkaY7PXW5KpQ_jp0hk,21786
73
+ datahub/cli/iceberg_cli.py,sha256=Jp3si_xZkOYr1uKA3h9_GlLJbiZPtVN_SpMgLa8OgoE,22984
74
74
  datahub/cli/ingest_cli.py,sha256=WAS_8BkoumzYVOsN8vbptKtQiQ61T958B_k49xJKdqI,22531
75
75
  datahub/cli/json_file.py,sha256=nWo-VVthaaW4Do1eUqgrzk0fShb29MjiKXvZVOTq76c,943
76
76
  datahub/cli/lite_cli.py,sha256=lolCnWWMMYojRMebbYTpHWBmOBQF_729RpW4A_y_xF4,13034
@@ -282,8 +282,8 @@ datahub/ingestion/source/datahub/report.py,sha256=VHBfCbwFRzdLdB7hQG9ST4EiZxl_vB
282
282
  datahub/ingestion/source/datahub/state.py,sha256=PZoT7sSK1wadVf5vN6phrgr7I6LL7ePP-EJjP1OO0bQ,3507
283
283
  datahub/ingestion/source/dbt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
284
284
  datahub/ingestion/source/dbt/dbt_cloud.py,sha256=tNpSHbPlLq-oFGbJsdkWY9kIaWmpjcZLWhj1CSewGGY,17981
285
- datahub/ingestion/source/dbt/dbt_common.py,sha256=y4VINaQQ-WhEf-rICGLGi1U88nKmRdVQPmh88OJROWg,80536
286
- datahub/ingestion/source/dbt/dbt_core.py,sha256=SHtZg8ZAtmUwegpltIU8MhxBYuB_-oPOY4iBXc4SQIY,22713
285
+ datahub/ingestion/source/dbt/dbt_common.py,sha256=bZN3J0FhqpKw-DXwE1SPYbsuOx-IaF57VoR4XUhP118,80763
286
+ datahub/ingestion/source/dbt/dbt_core.py,sha256=izfsJhPyv5e14H-5BXWhEeN1P6hdZvcjmutEptVxY4U,22987
287
287
  datahub/ingestion/source/dbt/dbt_tests.py,sha256=Q5KISW_AOOWqyxmyOgJQquyX7xlfOqKu9WhrHoLKC0M,9881
288
288
  datahub/ingestion/source/delta_lake/__init__.py,sha256=u5oqUeus81ONAtdl6o9Puw33ODSMun-0wLIamrZ4BUM,71
289
289
  datahub/ingestion/source/delta_lake/config.py,sha256=bVBwGjCPiXyjbCLQsamt4hAsKJMtMuxupKjwZEwtU78,3374
@@ -302,7 +302,7 @@ datahub/ingestion/source/dremio/dremio_source.py,sha256=XMx3EP0ciIaQjMffNljp8w-G
302
302
  datahub/ingestion/source/dremio/dremio_sql_queries.py,sha256=W0rcXawlwJOHNYr5o73rilMijtFOO3cVkn6pY-JLc6o,8186
303
303
  datahub/ingestion/source/dynamodb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
304
  datahub/ingestion/source/dynamodb/data_reader.py,sha256=vC77KpcP8LJN0g8wsPRDVw4sebv0ZWIP3tJkEIHaomA,3120
305
- datahub/ingestion/source/dynamodb/dynamodb.py,sha256=o2wM1cVmkAhur4uAbpBl-PxiRG3nO7sdA3sATQjJrMo,22463
305
+ datahub/ingestion/source/dynamodb/dynamodb.py,sha256=hyWUFWjyfSqjs9ljM-GcS0IVmaeIufUJu4pkOvZwKoI,22599
306
306
  datahub/ingestion/source/fivetran/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
307
307
  datahub/ingestion/source/fivetran/config.py,sha256=BP3KRfAQ6H5qyEeJNu9vNfZNwLoyj4Tl2kXiLVR5DNM,9027
308
308
  datahub/ingestion/source/fivetran/data_classes.py,sha256=ecdUJH5BEze0yv-uFpKWPNaNmV1gORDA2XMFk0zhcBw,595
@@ -338,7 +338,7 @@ datahub/ingestion/source/kafka_connect/sink_connectors.py,sha256=sbLntDi0c52i8uU
338
338
  datahub/ingestion/source/kafka_connect/source_connectors.py,sha256=-rFNXKD8_EFoXuU1CiKF3wHnsBtKCJrcYDwdTno98Xk,21265
339
339
  datahub/ingestion/source/looker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
340
  datahub/ingestion/source/looker/lkml_patched.py,sha256=XShEU7Wbz0DubDhYMjKf9wjKZrBJa2XPg9MIjp8rPhk,733
341
- datahub/ingestion/source/looker/looker_common.py,sha256=squUUBHxsLeT5xbZOTO66irtOB8fL0V4Q8Tgd9EJMYU,62067
341
+ datahub/ingestion/source/looker/looker_common.py,sha256=dmcrzEWFxPzZhIeyUYLZuMzhgx7QzvGp4xLTrTYISCA,62136
342
342
  datahub/ingestion/source/looker/looker_config.py,sha256=eVKw1nn9D8hUFdRfNyT3MtzL8w-zWhFeokiwSnNKQuc,13607
343
343
  datahub/ingestion/source/looker/looker_connection.py,sha256=yDmC6lDsHmL2e_Pw8ULylwOIHPWPp_6gT1iyLvD0fTw,2075
344
344
  datahub/ingestion/source/looker/looker_constant.py,sha256=GMKYtNXlpojPxa9azridKfcGLSJwKdUCTesp7U8dIrQ,402
@@ -466,7 +466,7 @@ datahub/ingestion/source/sql/mysql.py,sha256=nDWK4YbqomcJgnit9b8geUGrp_3eix4bt0_
466
466
  datahub/ingestion/source/sql/oracle.py,sha256=tVP3AiZO97psM8O8UzBb9C7__s8y4fkyQbXBv3m1LU4,24503
467
467
  datahub/ingestion/source/sql/postgres.py,sha256=uC1kYEI8VdxiZ1Y9IxMWzwmg11wtMqYN0e2fkok1rxo,11972
468
468
  datahub/ingestion/source/sql/presto.py,sha256=PB-CS5MX2dSRFRHjlxfkLHGXLZXFNCsVAAyRBtY6HMg,3611
469
- datahub/ingestion/source/sql/sql_common.py,sha256=E1QmJ35ZuDLiZj-s1niHvIdNMyEsZrwvq_Wuy2EoYMQ,48586
469
+ datahub/ingestion/source/sql/sql_common.py,sha256=98vCNU_ch41i_QSQSRWLIVRaTVfw6RWv4bP28SypfH0,48812
470
470
  datahub/ingestion/source/sql/sql_config.py,sha256=CBXkCpzBAGrWAXJFte_i5TmpzcsMJwEjGHpfzd6vAow,8964
471
471
  datahub/ingestion/source/sql/sql_generic.py,sha256=9AERvkK8kdJUeDOzCYJDb93xdv6Z4DGho0NfeHj5Uyg,2740
472
472
  datahub/ingestion/source/sql/sql_generic_profiler.py,sha256=8cDmNpT_UXzYmP8-RWoDCnewmVGCj2cYCzH9_gSsF3o,11590
@@ -475,7 +475,7 @@ datahub/ingestion/source/sql/sql_types.py,sha256=uuU3taVe4oCTXkqg1wSMGzTwVleRyUR
475
475
  datahub/ingestion/source/sql/sql_utils.py,sha256=q-Bsk6WxlsRtrw9RXBxvqI3zuaMTC_F25T2VrCziR9I,8418
476
476
  datahub/ingestion/source/sql/sqlalchemy_data_reader.py,sha256=FvHZ4JEK3aR2DYOBZiT_ZsAy12RjTu4t_KIR_92B11k,2644
477
477
  datahub/ingestion/source/sql/sqlalchemy_uri_mapper.py,sha256=KOpbmDIE2h1hyYEsbVHJi2B7FlsyUMTXZx4diyzltQg,1826
478
- datahub/ingestion/source/sql/teradata.py,sha256=5lTNMOOOmrG71fTAyTs7iYFroeTiGIdATwXQmH6sWJg,32741
478
+ datahub/ingestion/source/sql/teradata.py,sha256=79jaYgU8QjxnZ3nQ-wq-4xMFoTjCDOfNrpVNbUoS_wU,33449
479
479
  datahub/ingestion/source/sql/trino.py,sha256=FEn_BQ3pm23hKx94ek5kk5IXGNYcBqZEhllRJFUzfU8,17895
480
480
  datahub/ingestion/source/sql/two_tier_sql_source.py,sha256=YDrGBb5WKVls6qv17QU5foKrf71SydzEltc3WsVAhQc,5732
481
481
  datahub/ingestion/source/sql/vertica.py,sha256=_9OgSgIgqBml0av063rb8nACiT3SAmzpw0ouyF91wv8,33382
@@ -574,12 +574,12 @@ datahub/lite/lite_registry.py,sha256=bpH0kasP-LtwwUFNA2QsOIehfekAYfJtN-AkQLmSWnw
574
574
  datahub/lite/lite_server.py,sha256=p9Oa2nNs65mqcssSIVOr7VOzWqfVstz6ZQEdT4f82S0,1949
575
575
  datahub/lite/lite_util.py,sha256=pgBpT3vTO1YCQ2njZRNyicSkHYeEmQCt41BaXU8WvMo,4503
576
576
  datahub/metadata/__init__.py,sha256=AjhXPjI6cnpdcrBRrE5gOWo15vv2TTl2ctU4UAnUN7A,238
577
- datahub/metadata/_schema_classes.py,sha256=xDKwU0EtWDoHPgetCMWFYK80SRbZWONFE4HXApDZGo8,985155
578
- datahub/metadata/schema.avsc,sha256=i4ukol5SJl7lyGsw0cXfOirqVnQfAVzQx5tUDH-n-EU,646297
577
+ datahub/metadata/_schema_classes.py,sha256=n4PvKZyycu8LcAf22nUPz-s3KWlMtmcq5CJcX7R-8xM,985155
578
+ datahub/metadata/schema.avsc,sha256=vDa9khk0Bw672nxcPHkxuGU_KCokIqpFGlTvm7UdFX8,663285
579
579
  datahub/metadata/schema_classes.py,sha256=X5Jl5EaSxyHdXOQv14pJ5WkQALun4MRpJ4q12wVFE18,1299
580
580
  datahub/metadata/urns.py,sha256=nfrCTExR-k2P9w272WVtWSN3xW1VUJngPwP3xnvULjU,1217
581
581
  datahub/metadata/_urns/__init__.py,sha256=cOF3GHMDgPhmbLKbN02NPpuLGHSu0qNgQyBRv08eqF0,243
582
- datahub/metadata/_urns/urn_defs.py,sha256=SoCD7TNdGcPKI9vD8ZXLZzxggJTHtvRe4Jgaj_Mm2x8,132110
582
+ datahub/metadata/_urns/urn_defs.py,sha256=NkWFlWc3BLjiVV7W_LnjZ5u7QNdnlGay_12SO2M5skU,132110
583
583
  datahub/metadata/com/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
584
584
  datahub/metadata/com/linkedin/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
585
585
  datahub/metadata/com/linkedin/events/__init__.py,sha256=s_dR0plZF-rOxxIbE8ojekJqwiHzl2WYR-Z3kW6kKS0,298
@@ -869,13 +869,13 @@ datahub/metadata/schemas/VersionProperties.avsc,sha256=knGNZxD_tOdnzFXqtrUy_JyXu
869
869
  datahub/metadata/schemas/VersionSetKey.avsc,sha256=psjGNNcFua3Zs9Xlh4HnUHNmBEU74uYdJR5g20NhRJU,659
870
870
  datahub/metadata/schemas/VersionSetProperties.avsc,sha256=yrhhVNioD11nFlDO7IfUbxAQjhA9Tr-4wnAYH5I9W74,1172
871
871
  datahub/metadata/schemas/ViewProperties.avsc,sha256=3HhcbH5493dJUnEUtFMYMVfbYQ52aDedm5L4j77Nym4,1032
872
- datahub/metadata/schemas/__init__.py,sha256=uvLNC3VyCkWA_v8e9FdA1leFf46NFKDD0AajCfihepI,581
872
+ datahub/metadata/schemas/__init__.py,sha256=kCcak_fBn_KyuysZTJIoipAzZ8EO44Amk4DWSEvplEY,581
873
873
  datahub/sdk/__init__.py,sha256=fYD-f338EW5WPFW2NSiirMAsHkNgZfolIvneM7yxgBk,977
874
874
  datahub/sdk/_all_entities.py,sha256=0XFtmgeEtrWOXy_oWcwqrtvfvzo8obPIq3Z1fEr5-34,400
875
875
  datahub/sdk/_attribution.py,sha256=05iNVT_IDO7aU3vU6dJKCF8EoDAI1mwh4mAg_EBf3RY,1121
876
876
  datahub/sdk/_entity.py,sha256=A_AWqNjaV6Y1YvmIiPNm0UyC0aO52G_L-iwgp9XEtYs,3225
877
- datahub/sdk/_shared.py,sha256=FIEcYGm3LgRKLqn_i1FDePaqvMljkXIA9f3RMqaF1kY,11137
878
- datahub/sdk/container.py,sha256=6Y19pQLN5vXGM86TEKW7ItTBwE3S0U4BsAMilWhyXqw,6511
877
+ datahub/sdk/_shared.py,sha256=qBqJnY-793Tfg4eBFNt3VEcckiyymJsBBNgZBc3PkJI,11384
878
+ datahub/sdk/container.py,sha256=aqp175PGQ225dpi9vS6LbaGdUVcjsEblsZc4doIsHvU,6521
879
879
  datahub/sdk/dataset.py,sha256=BydV2papBEYL2de72UMNjSkAbsDNpVlXqiEkMlXJiLY,21514
880
880
  datahub/sdk/entity_client.py,sha256=DcHytfCM8X9J6mm_QXzFR-2vDQa88I9Q2ktSNC2oSUI,4277
881
881
  datahub/sdk/main_client.py,sha256=IKKzBMiKtT5zIMEHrvaMyxJ7DYBVNpqua70J0Ydl74Y,2068
@@ -905,7 +905,7 @@ datahub/sql_parsing/_sqlglot_patch.py,sha256=iYJ8zOThHqqbamD5jdNr9iHTWD7ewNeHzPi
905
905
  datahub/sql_parsing/datajob.py,sha256=1X8KpEk-y3_8xJuA_Po27EHZgOcxK9QADI6Om9gSGn0,1751
906
906
  datahub/sql_parsing/query_types.py,sha256=FKjDzszZzsrCfYfm7dgD6T_8865qxWl767fdGyHWBh4,2720
907
907
  datahub/sql_parsing/schema_resolver.py,sha256=8dYz6pC3Y35pXBn41grOE2dKkSiSeLHOz-N138uWQg4,10796
908
- datahub/sql_parsing/split_statements.py,sha256=uZhAXLaRxDfmK0lPBW2oM_YVdJfSMhdgndnfd9iIXuA,5001
908
+ datahub/sql_parsing/split_statements.py,sha256=Vi8VAgaEkGcK5bs48L-Krig3qhjxcvqvotCpL0ux-EY,8674
909
909
  datahub/sql_parsing/sql_parsing_aggregator.py,sha256=XNZWjeaRhzaT92mzsJZGJfYaxJENsyp5dSHTmL81RIc,70130
910
910
  datahub/sql_parsing/sql_parsing_common.py,sha256=h_V_m54hJ9EUh5kczq7cYOIeNeo4bgf0Px0H-Nq-UIg,2602
911
911
  datahub/sql_parsing/sql_parsing_result_utils.py,sha256=prwWTj1EB2fRPv1eMB4EkpFNafIYAt-X8TIK0NWqank,796
@@ -1012,9 +1012,9 @@ datahub_provider/operators/datahub_assertion_operator.py,sha256=uvTQ-jk2F0sbqqxp
1012
1012
  datahub_provider/operators/datahub_assertion_sensor.py,sha256=lCBj_3x1cf5GMNpHdfkpHuyHfVxsm6ff5x2Z5iizcAo,140
1013
1013
  datahub_provider/operators/datahub_operation_operator.py,sha256=aevDp2FzX7FxGlXrR0khoHNbxbhKR2qPEX5e8O2Jyzw,174
1014
1014
  datahub_provider/operators/datahub_operation_sensor.py,sha256=8fcdVBCEPgqy1etTXgLoiHoJrRt_nzFZQMdSzHqSG7M,168
1015
- acryl_datahub-0.15.0.6rc2.dist-info/LICENSE,sha256=9xNHpsD0uYF5ONzXsKDCuHHB-xbiCrSbueWXqrTNsxk,11365
1016
- acryl_datahub-0.15.0.6rc2.dist-info/METADATA,sha256=Bv5h1BaxWarbwfDdiiaD1wwyonRclpbgYtingIwN4B4,175375
1017
- acryl_datahub-0.15.0.6rc2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
1018
- acryl_datahub-0.15.0.6rc2.dist-info/entry_points.txt,sha256=U1e5ZwqPX1OaIbvGrwvozcdB8SbzFYXQM7plpdLKKeo,9592
1019
- acryl_datahub-0.15.0.6rc2.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
1020
- acryl_datahub-0.15.0.6rc2.dist-info/RECORD,,
1015
+ acryl_datahub-1.0.0rc1.dist-info/LICENSE,sha256=9xNHpsD0uYF5ONzXsKDCuHHB-xbiCrSbueWXqrTNsxk,11365
1016
+ acryl_datahub-1.0.0rc1.dist-info/METADATA,sha256=Z7QNzSBU3Gur8j0qxxg7MxnbI2CnvVleJLYc3IXohvM,175366
1017
+ acryl_datahub-1.0.0rc1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
1018
+ acryl_datahub-1.0.0rc1.dist-info/entry_points.txt,sha256=U1e5ZwqPX1OaIbvGrwvozcdB8SbzFYXQM7plpdLKKeo,9592
1019
+ acryl_datahub-1.0.0rc1.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
1020
+ acryl_datahub-1.0.0rc1.dist-info/RECORD,,
datahub/_version.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Published at https://pypi.org/project/acryl-datahub/.
2
2
  __package_name__ = "acryl-datahub"
3
- __version__ = "0.15.0.6rc2"
3
+ __version__ = "1.0.0rc1"
4
4
 
5
5
 
6
6
  def is_dev_mode() -> bool:
@@ -14,6 +14,7 @@ from datahub.cli.cli_utils import post_entity
14
14
  from datahub.configuration.common import GraphError
15
15
  from datahub.ingestion.graph.client import DataHubGraph, get_default_graph
16
16
  from datahub.metadata.schema_classes import SystemMetadataClass
17
+ from datahub.telemetry import telemetry
17
18
 
18
19
  logger = logging.getLogger(__name__)
19
20
 
@@ -161,6 +162,7 @@ def validate_warehouse(data_root: str) -> None:
161
162
  type=int,
162
163
  help=f"Expiration duration for temporary credentials used for role. Defaults to {DEFAULT_CREDS_EXPIRY_DURATION_SECONDS} seconds if unspecified",
163
164
  )
165
+ @telemetry.with_telemetry(capture_kwargs=["duration_seconds"])
164
166
  def create(
165
167
  warehouse: str,
166
168
  description: Optional[str],
@@ -313,6 +315,7 @@ def create(
313
315
  type=int,
314
316
  help=f"Expiration duration for temporary credentials used for role. Defaults to {DEFAULT_CREDS_EXPIRY_DURATION_SECONDS} seconds if unspecified",
315
317
  )
318
+ @telemetry.with_telemetry(capture_kwargs=["duration_seconds"])
316
319
  def update(
317
320
  warehouse: str,
318
321
  data_root: str,
@@ -398,6 +401,7 @@ def update(
398
401
 
399
402
 
400
403
  @iceberg.command()
404
+ @telemetry.with_telemetry()
401
405
  def list() -> None:
402
406
  """
403
407
  List iceberg warehouses
@@ -413,6 +417,7 @@ def list() -> None:
413
417
  @click.option(
414
418
  "-w", "--warehouse", required=True, type=str, help="The name of the warehouse"
415
419
  )
420
+ @telemetry.with_telemetry()
416
421
  def get(warehouse: str) -> None:
417
422
  """Fetches the details of the specified iceberg warehouse"""
418
423
  client = get_default_graph()
@@ -442,6 +447,7 @@ def get(warehouse: str) -> None:
442
447
  is_flag=True,
443
448
  help="force the delete if set without confirmation",
444
449
  )
450
+ @telemetry.with_telemetry(capture_kwargs=["dry_run", "force"])
445
451
  def delete(warehouse: str, dry_run: bool, force: bool) -> None:
446
452
  """
447
453
  Delete warehouse
@@ -470,11 +476,19 @@ def delete(warehouse: str, dry_run: bool, force: bool) -> None:
470
476
  # Do we really need this double-check?
471
477
  if "__typename" in entity and "urn" in entity:
472
478
  if entity["__typename"] in ["Container", "Dataset"]:
479
+ # add the Platform Resource URN to also be deleted for each dataset.
480
+ # This is not user visible, so no need to show a name to the user and include it in the count. Each
481
+ # instance corresponds to a dataset whose name is shown.
482
+ if entity["__typename"] == "Dataset":
483
+ resource_urn = platform_resource_urn(
484
+ entity["properties"]["qualifiedName"]
485
+ )
486
+ urns_to_delete.append(resource_urn)
487
+
473
488
  urns_to_delete.append(entity["urn"])
474
489
  resource_names_to_be_deleted.append(
475
490
  entity.get("name", entity.get("urn"))
476
491
  )
477
- # TODO: PlatformResource associated with datasets need to be deleted.
478
492
 
479
493
  if dry_run:
480
494
  click.echo(
@@ -485,18 +499,21 @@ def delete(warehouse: str, dry_run: bool, force: bool) -> None:
485
499
  else:
486
500
  if not force:
487
501
  click.confirm(
488
- f"This will delete {warehouse} warehouse, credentials, and {len(urns_to_delete)} datasets and namespaces from DataHub. Do you want to continue?",
502
+ f"This will delete {warehouse} warehouse, credentials, and {len(resource_names_to_be_deleted)} datasets and namespaces from DataHub. Do you want to continue?",
489
503
  abort=True,
490
504
  )
491
- client.hard_delete_entity(urn)
492
- client.hard_delete_entity(warehouse_aspect.clientId)
493
- client.hard_delete_entity(warehouse_aspect.clientSecret)
494
505
 
506
+ # Delete the resources in the warehouse first, so that in case it is interrupted, the warehouse itself is
507
+ # still available to enumerate the resources in it that are not yet deleted.
495
508
  for urn_to_delete in urns_to_delete:
496
509
  client.hard_delete_entity(urn_to_delete)
497
510
 
511
+ client.hard_delete_entity(urn)
512
+ client.hard_delete_entity(warehouse_aspect.clientId)
513
+ client.hard_delete_entity(warehouse_aspect.clientSecret)
514
+
498
515
  click.echo(
499
- f"✅ Successfully deleted iceberg warehouse {warehouse} and associated credentials, {len(urns_to_delete)} datasets and namespaces"
516
+ f"✅ Successfully deleted iceberg warehouse {warehouse} and associated credentials, {len(resource_names_to_be_deleted)} datasets and namespaces"
500
517
  )
501
518
 
502
519
 
@@ -504,6 +521,10 @@ def iceberg_data_platform_instance_urn(warehouse: str) -> str:
504
521
  return f"urn:li:dataPlatformInstance:({iceberg_data_platform()},{warehouse})"
505
522
 
506
523
 
524
+ def platform_resource_urn(dataset_name: str) -> str:
525
+ return f"urn:li:platformResource:iceberg.{dataset_name}"
526
+
527
+
507
528
  def iceberg_data_platform() -> str:
508
529
  return "urn:li:dataPlatform:iceberg"
509
530
 
@@ -677,6 +698,9 @@ def get_related_entities_for_platform_instance(
677
698
  ... on Dataset {
678
699
  urn
679
700
  name
701
+ properties{
702
+ qualifiedName
703
+ }
680
704
  }
681
705
  }
682
706
  }
@@ -357,6 +357,11 @@ class DBTCommonConfig(
357
357
  default=True,
358
358
  description="When enabled, includes the compiled code in the emitted metadata.",
359
359
  )
360
+ include_database_name: bool = Field(
361
+ default=True,
362
+ description="Whether to add database name to the table urn. "
363
+ "Set to False to skip it for engines like AWS Athena where it's not required.",
364
+ )
360
365
 
361
366
  @validator("target_platform")
362
367
  def validate_target_platform_value(cls, target_platform: str) -> str:
@@ -167,6 +167,7 @@ def extract_dbt_entities(
167
167
  use_identifiers: bool,
168
168
  tag_prefix: str,
169
169
  only_include_if_in_catalog: bool,
170
+ include_database_name: bool,
170
171
  report: DBTSourceReport,
171
172
  ) -> List[DBTNode]:
172
173
  sources_by_id = {x["unique_id"]: x for x in sources_results}
@@ -267,7 +268,7 @@ def extract_dbt_entities(
267
268
  dbt_name=key,
268
269
  dbt_adapter=manifest_adapter,
269
270
  dbt_package_name=manifest_node.get("package_name"),
270
- database=manifest_node["database"],
271
+ database=manifest_node["database"] if include_database_name else None,
271
272
  schema=manifest_node["schema"],
272
273
  name=name,
273
274
  alias=manifest_node.get("alias"),
@@ -543,14 +544,15 @@ class DBTCoreSource(DBTSourceBase, TestableSource):
543
544
  all_catalog_entities = {**catalog_nodes, **catalog_sources}
544
545
 
545
546
  nodes = extract_dbt_entities(
546
- all_manifest_entities,
547
- all_catalog_entities,
548
- sources_results,
549
- manifest_adapter,
550
- self.config.use_identifiers,
551
- self.config.tag_prefix,
552
- self.config.only_include_if_in_catalog,
553
- self.report,
547
+ all_manifest_entities=all_manifest_entities,
548
+ all_catalog_entities=all_catalog_entities,
549
+ sources_results=sources_results,
550
+ manifest_adapter=manifest_adapter,
551
+ use_identifiers=self.config.use_identifiers,
552
+ tag_prefix=self.config.tag_prefix,
553
+ only_include_if_in_catalog=self.config.only_include_if_in_catalog,
554
+ include_database_name=self.config.include_database_name,
555
+ report=self.report,
554
556
  )
555
557
 
556
558
  return (
@@ -165,6 +165,10 @@ _attribute_type_to_field_type_mapping: Dict[str, Type] = {
165
165
  SourceCapability.PLATFORM_INSTANCE,
166
166
  "By default, platform_instance will use the AWS account id",
167
167
  )
168
+ @capability(
169
+ SourceCapability.CLASSIFICATION,
170
+ "Optionally enabled via `classification.enabled`",
171
+ )
168
172
  class DynamoDBSource(StatefulIngestionSourceBase):
169
173
  """
170
174
  This plugin extracts the following:
@@ -244,6 +248,7 @@ class DynamoDBSource(StatefulIngestionSourceBase):
244
248
  name=dataset_name,
245
249
  )
246
250
  dataset_properties = DatasetPropertiesClass(
251
+ name=table_name,
247
252
  tags=[],
248
253
  customProperties={
249
254
  "table.arn": table_info["TableArn"],
@@ -1673,10 +1673,11 @@ class LookerUserRegistry:
1673
1673
  primary_key="",
1674
1674
  )
1675
1675
 
1676
- # Extract user email mappings
1676
+ # Extract user email mappings.
1677
+ # Sort it to ensure the order is deterministic.
1677
1678
  user_email_cache = {
1678
1679
  user_id: user.email
1679
- for user_id, user in self._user_cache.items()
1680
+ for user_id, user in sorted(self._user_cache.items())
1680
1681
  if user.email
1681
1682
  }
1682
1683
 
@@ -352,6 +352,15 @@ class SQLAlchemySource(StatefulIngestionSourceBase, TestableSource):
352
352
  )
353
353
  self.report.sql_aggregator = self.aggregator.report
354
354
 
355
+ def _add_default_options(self, sql_config: SQLCommonConfig) -> None:
356
+ """Add default SQLAlchemy options. Can be overridden by subclasses to add additional defaults."""
357
+ # Extra default SQLAlchemy option for better connection pooling and threading.
358
+ # https://docs.sqlalchemy.org/en/14/core/pooling.html#sqlalchemy.pool.QueuePool.params.max_overflow
359
+ if sql_config.is_profiling_enabled():
360
+ sql_config.options.setdefault(
361
+ "max_overflow", sql_config.profiling.max_workers
362
+ )
363
+
355
364
  @classmethod
356
365
  def test_connection(cls, config_dict: dict) -> TestConnectionReport:
357
366
  test_report = TestConnectionReport()
@@ -519,12 +528,7 @@ class SQLAlchemySource(StatefulIngestionSourceBase, TestableSource):
519
528
  # Known issue with sqlalchemy https://stackoverflow.com/questions/60804288/pycharm-duplicated-log-for-sqlalchemy-echo-true
520
529
  sqlalchemy_log._add_default_handler = lambda x: None # type: ignore
521
530
 
522
- # Extra default SQLAlchemy option for better connection pooling and threading.
523
- # https://docs.sqlalchemy.org/en/14/core/pooling.html#sqlalchemy.pool.QueuePool.params.max_overflow
524
- if sql_config.is_profiling_enabled():
525
- sql_config.options.setdefault(
526
- "max_overflow", sql_config.profiling.max_workers
527
- )
531
+ self._add_default_options(sql_config)
528
532
 
529
533
  for inspector in self.get_inspectors():
530
534
  profiler = None
@@ -22,6 +22,7 @@ from sqlalchemy import create_engine, inspect
22
22
  from sqlalchemy.engine import Engine
23
23
  from sqlalchemy.engine.base import Connection
24
24
  from sqlalchemy.engine.reflection import Inspector
25
+ from sqlalchemy.pool import QueuePool
25
26
  from sqlalchemy.sql.expression import text
26
27
  from teradatasqlalchemy.dialect import TeradataDialect
27
28
  from teradatasqlalchemy.options import configure
@@ -678,6 +679,16 @@ ORDER by DataBaseName, TableName;
678
679
  if self.config.stateful_ingestion:
679
680
  self.config.stateful_ingestion.remove_stale_metadata = False
680
681
 
682
+ def _add_default_options(self, sql_config: SQLCommonConfig) -> None:
683
+ """Add Teradata-specific default options"""
684
+ super()._add_default_options(sql_config)
685
+ if sql_config.is_profiling_enabled():
686
+ # Sqlalchemy uses QueuePool by default however Teradata uses SingletonThreadPool.
687
+ # SingletonThreadPool does not support parellel connections. For using profiling, we need to use QueuePool.
688
+ # https://docs.sqlalchemy.org/en/20/core/pooling.html#connection-pool-configuration
689
+ # https://github.com/Teradata/sqlalchemy-teradata/issues/96
690
+ sql_config.options.setdefault("poolclass", QueuePool)
691
+
681
692
  @classmethod
682
693
  def create(cls, config_dict, ctx):
683
694
  config = TeradataConfig.parse_obj(config_dict)
@@ -705,6 +716,7 @@ ORDER by DataBaseName, TableName;
705
716
  # This method can be overridden in the case that you want to dynamically
706
717
  # run on multiple databases.
707
718
  url = self.config.get_sql_alchemy_url()
719
+
708
720
  logger.debug(f"sql_alchemy_url={url}")
709
721
  engine = create_engine(url, **self.config.options)
710
722
  with engine.connect() as conn: