From ac13f255e6f2dd6fc95e2d25ff610b842a2d0aa9 Mon Sep 17 00:00:00 2001 From: Brock Griffey <52086127+brock-acryl@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:18:37 -0500 Subject: [PATCH 01/13] feat(ingestion/snowflake):adds streams as a new dataset with lineage and properties. (#12318) Co-authored-by: Mayuri Nehate <33225191+mayurinehate@users.noreply.github.com> --- .../docs/sources/snowflake/snowflake_pre.md | 9 +- .../ingestion/source/common/subtypes.py | 1 + .../ingestion/source/snowflake/constants.py | 1 + .../source/snowflake/snowflake_config.py | 10 + .../source/snowflake/snowflake_queries.py | 55 +- .../source/snowflake/snowflake_query.py | 21 +- .../source/snowflake/snowflake_report.py | 6 + .../source/snowflake/snowflake_schema.py | 102 +- .../source/snowflake/snowflake_schema_gen.py | 356 +- .../source/snowflake/snowflake_utils.py | 25 +- .../source/snowflake/snowflake_v2.py | 18 +- .../tests/integration/snowflake/common.py | 46 + .../snowflake/snowflake_golden.json | 4236 ++++++++++------- .../snowflake_privatelink_golden.json | 383 ++ ...nowflake_structured_properties_golden.json | 314 ++ .../integration/snowflake/test_snowflake.py | 3 +- .../snowflake/test_snowflake_failures.py | 8 +- 17 files changed, 3783 insertions(+), 1811 deletions(-) diff --git a/metadata-ingestion/docs/sources/snowflake/snowflake_pre.md b/metadata-ingestion/docs/sources/snowflake/snowflake_pre.md index 4cfbc470e8c239..420715e5312cb6 100644 --- a/metadata-ingestion/docs/sources/snowflake/snowflake_pre.md +++ b/metadata-ingestion/docs/sources/snowflake/snowflake_pre.md @@ -15,6 +15,8 @@ grant operate, usage on warehouse "" to role datahub_role; grant usage on DATABASE "" to role datahub_role; grant usage on all schemas in database "" to role datahub_role; grant usage on future schemas in database "" to role datahub_role; +grant select on all streams in database "> to role datahub_role; +grant select on future streams in database "> to role datahub_role; // If you are NOT using Snowflake Profiling or Classification feature: Grant references privileges to your tables and views grant references on all tables in database "" to role datahub_role; @@ -50,9 +52,12 @@ The details of each granted privilege can be viewed in [snowflake docs](https:// If the warehouse is already running during ingestion or has auto-resume enabled, this permission is not required. - `usage` is required for us to run queries using the warehouse -- `usage` on `database` and `schema` are required because without it tables and views inside them are not accessible. If an admin does the required grants on `table` but misses the grants on `schema` or the `database` in which the table/view exists then we will not be able to get metadata for the table/view. +- `usage` on `database` and `schema` are required because without it tables, views, and streams inside them are not accessible. If an admin does the required grants on `table` but misses the grants on `schema` or the `database` in which the table/view/stream exists then we will not be able to get metadata for the table/view/stream. - If metadata is required only on some schemas then you can grant the usage privilieges only on a particular schema like - +```sql +grant usage on schema ""."" to role datahub_role; +``` +- `select` on `streams` is required in order for stream definitions to be available. This does not allow selecting of the data (not required) unless the underlying dataset has select access as well. ```sql grant usage on schema ""."" to role datahub_role; ``` diff --git a/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py b/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py index a5eecf198a9b49..8eb53259df8062 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py +++ b/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py @@ -24,6 +24,7 @@ class DatasetSubTypes(StrEnum): SAC_LIVE_DATA_MODEL = "Live Data Model" NEO4J_NODE = "Neo4j Node" NEO4J_RELATIONSHIP = "Neo4j Relationship" + SNOWFLAKE_STREAM = "Snowflake Stream" # TODO: Create separate entity... NOTEBOOK = "Notebook" diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/constants.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/constants.py index fc464cc5ea9bb5..84ccd2c67c95a1 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/constants.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/constants.py @@ -53,6 +53,7 @@ class SnowflakeObjectDomain(StrEnum): SCHEMA = "schema" COLUMN = "column" ICEBERG_TABLE = "iceberg table" + STREAM = "stream" GENERIC_PERMISSION_ERROR_KEY = "permission-error" diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_config.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_config.py index 6e1d4702b29c82..94ce51c031b8a0 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_config.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_config.py @@ -98,6 +98,11 @@ class SnowflakeFilterConfig(SQLFilterConfig): ) # table_pattern and view_pattern are inherited from SQLFilterConfig + stream_pattern: AllowDenyPattern = Field( + default=AllowDenyPattern.allow_all(), + description="Regex patterns for streams to filter in ingestion. Note: Defaults to table_pattern if not specified. Specify regex to match the entire view name in database.schema.view format. e.g. to match all views starting with customer in Customer database and public schema, use the regex 'Customer.public.customer.*'", + ) + match_fully_qualified_names: bool = Field( default=False, description="Whether `schema_pattern` is matched against fully qualified schema name `.`.", @@ -274,6 +279,11 @@ class SnowflakeV2Config( description="List of regex patterns for tags to include in ingestion. Only used if `extract_tags` is enabled.", ) + include_streams: bool = Field( + default=True, + description="If enabled, streams will be ingested as separate entities from tables/views.", + ) + structured_property_pattern: AllowDenyPattern = Field( default=AllowDenyPattern.allow_all(), description=( diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_queries.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_queries.py index 69d0b62a8edfdf..eb015f9d13281f 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_queries.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_queries.py @@ -49,6 +49,7 @@ from datahub.sql_parsing.schema_resolver import SchemaResolver from datahub.sql_parsing.sql_parsing_aggregator import ( KnownLineageMapping, + ObservedQuery, PreparsedQuery, SqlAggregatorReport, SqlParsingAggregator, @@ -241,7 +242,13 @@ def get_workunits_internal( use_cached_audit_log = audit_log_file.exists() queries: FileBackedList[ - Union[KnownLineageMapping, PreparsedQuery, TableRename, TableSwap] + Union[ + KnownLineageMapping, + PreparsedQuery, + TableRename, + TableSwap, + ObservedQuery, + ] ] if use_cached_audit_log: logger.info("Using cached audit log") @@ -252,7 +259,13 @@ def get_workunits_internal( shared_connection = ConnectionWrapper(audit_log_file) queries = FileBackedList(shared_connection) - entry: Union[KnownLineageMapping, PreparsedQuery, TableRename, TableSwap] + entry: Union[ + KnownLineageMapping, + PreparsedQuery, + TableRename, + TableSwap, + ObservedQuery, + ] with self.report.copy_history_fetch_timer: for entry in self.fetch_copy_history(): @@ -329,7 +342,7 @@ def fetch_copy_history(self) -> Iterable[KnownLineageMapping]: def fetch_query_log( self, users: UsersMapping - ) -> Iterable[Union[PreparsedQuery, TableRename, TableSwap]]: + ) -> Iterable[Union[PreparsedQuery, TableRename, TableSwap, ObservedQuery]]: query_log_query = _build_enriched_query_log_query( start_time=self.config.window.start_time, end_time=self.config.window.end_time, @@ -362,7 +375,7 @@ def fetch_query_log( def _parse_audit_log_row( self, row: Dict[str, Any], users: UsersMapping - ) -> Optional[Union[TableRename, TableSwap, PreparsedQuery]]: + ) -> Optional[Union[TableRename, TableSwap, PreparsedQuery, ObservedQuery]]: json_fields = { "DIRECT_OBJECTS_ACCESSED", "OBJECTS_MODIFIED", @@ -398,6 +411,34 @@ def _parse_audit_log_row( pass else: return None + + user = CorpUserUrn( + self.identifiers.get_user_identifier( + res["user_name"], users.get(res["user_name"]) + ) + ) + + # Use direct_objects_accessed instead objects_modified + # objects_modified returns $SYS_VIEW_X with no mapping + has_stream_objects = any( + obj.get("objectDomain") == "Stream" for obj in direct_objects_accessed + ) + + # If a stream is used, default to query parsing. + if has_stream_objects: + logger.debug("Found matching stream object") + return ObservedQuery( + query=res["query_text"], + session_id=res["session_id"], + timestamp=res["query_start_time"].astimezone(timezone.utc), + user=user, + default_db=res["default_db"], + default_schema=res["default_schema"], + query_hash=get_query_fingerprint( + res["query_text"], self.identifiers.platform, fast=True + ), + ) + upstreams = [] column_usage = {} @@ -460,12 +501,6 @@ def _parse_audit_log_row( ) ) - user = CorpUserUrn( - self.identifiers.get_user_identifier( - res["user_name"], users.get(res["user_name"]) - ) - ) - timestamp: datetime = res["query_start_time"] timestamp = timestamp.astimezone(timezone.utc) diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_query.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_query.py index 7092041f8da95c..565ebb60701888 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_query.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_query.py @@ -9,6 +9,7 @@ from datahub.utilities.prefix_batch_builder import PrefixGroup SHOW_VIEWS_MAX_PAGE_SIZE = 10000 +SHOW_STREAM_MAX_PAGE_SIZE = 10000 def create_deny_regex_sql_filter( @@ -36,6 +37,7 @@ class SnowflakeQuery: SnowflakeObjectDomain.VIEW.capitalize(), SnowflakeObjectDomain.MATERIALIZED_VIEW.capitalize(), SnowflakeObjectDomain.ICEBERG_TABLE.capitalize(), + SnowflakeObjectDomain.STREAM.capitalize(), } ACCESS_HISTORY_TABLE_VIEW_DOMAINS_FILTER = "({})".format( @@ -44,7 +46,8 @@ class SnowflakeQuery: ACCESS_HISTORY_TABLE_DOMAINS_FILTER = ( "(" f"'{SnowflakeObjectDomain.TABLE.capitalize()}'," - f"'{SnowflakeObjectDomain.VIEW.capitalize()}'" + f"'{SnowflakeObjectDomain.VIEW.capitalize()}'," + f"'{SnowflakeObjectDomain.STREAM.capitalize()}'," ")" ) @@ -963,3 +966,19 @@ def dmf_assertion_results(start_time_millis: int, end_time_millis: int) -> str: @staticmethod def get_all_users() -> str: return """SELECT name as "NAME", email as "EMAIL" FROM SNOWFLAKE.ACCOUNT_USAGE.USERS""" + + @staticmethod + def streams_for_database( + db_name: str, + limit: int = SHOW_STREAM_MAX_PAGE_SIZE, + stream_pagination_marker: Optional[str] = None, + ) -> str: + # SHOW STREAMS can return a maximum of 10000 rows. + # https://docs.snowflake.com/en/sql-reference/sql/show-streams#usage-notes + assert limit <= SHOW_STREAM_MAX_PAGE_SIZE + + # To work around this, we paginate through the results using the FROM clause. + from_clause = ( + f"""FROM '{stream_pagination_marker}'""" if stream_pagination_marker else "" + ) + return f"""SHOW STREAMS IN DATABASE {db_name} LIMIT {limit} {from_clause};""" diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_report.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_report.py index 8feebf1d661385..bd558bc72f1aad 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_report.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_report.py @@ -104,6 +104,7 @@ class SnowflakeV2Report( schemas_scanned: int = 0 databases_scanned: int = 0 tags_scanned: int = 0 + streams_scanned: int = 0 include_usage_stats: bool = False include_operational_stats: bool = False @@ -113,6 +114,7 @@ class SnowflakeV2Report( table_lineage_query_secs: float = -1 external_lineage_queries_secs: float = -1 num_tables_with_known_upstreams: int = 0 + num_streams_with_known_upstreams: int = 0 num_upstream_lineage_edge_parsing_failed: int = 0 num_secure_views_missing_definition: int = 0 num_structured_property_templates_created: int = 0 @@ -131,6 +133,8 @@ class SnowflakeV2Report( num_get_tags_for_object_queries: int = 0 num_get_tags_on_columns_for_table_queries: int = 0 + num_get_streams_for_schema_queries: int = 0 + rows_zero_objects_modified: int = 0 _processed_tags: MutableSet[str] = field(default_factory=set) @@ -157,6 +161,8 @@ def report_entity_scanned(self, name: str, ent_type: str = "table") -> None: return self._scanned_tags.add(name) self.tags_scanned += 1 + elif ent_type == "stream": + self.streams_scanned += 1 else: raise KeyError(f"Unknown entity {ent_type}.") diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema.py index c31b7dfe5b9b4e..c1d29127699aaf 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema.py @@ -14,7 +14,7 @@ ) from datahub.ingestion.source.sql.sql_generic import BaseColumn, BaseTable, BaseView from datahub.utilities.file_backed_collections import FileBackedDict -from datahub.utilities.prefix_batch_builder import build_prefix_batches +from datahub.utilities.prefix_batch_builder import PrefixGroup, build_prefix_batches from datahub.utilities.serialized_lru_cache import serialized_lru_cache logger: logging.Logger = logging.getLogger(__name__) @@ -118,6 +118,7 @@ class SnowflakeSchema: comment: Optional[str] tables: List[str] = field(default_factory=list) views: List[str] = field(default_factory=list) + streams: List[str] = field(default_factory=list) tags: Optional[List[SnowflakeTag]] = None @@ -131,6 +132,29 @@ class SnowflakeDatabase: tags: Optional[List[SnowflakeTag]] = None +@dataclass +class SnowflakeStream: + name: str + created: datetime + owner: str + source_type: str + type: str + stale: str + mode: str + invalid_reason: str + owner_role_type: str + database_name: str + schema_name: str + table_name: str + comment: Optional[str] + columns: List[SnowflakeColumn] = field(default_factory=list) + stale_after: Optional[datetime] = None + base_tables: Optional[str] = None + tags: Optional[List[SnowflakeTag]] = None + column_tags: Dict[str, List[SnowflakeTag]] = field(default_factory=dict) + last_altered: Optional[datetime] = None + + class _SnowflakeTagCache: def __init__(self) -> None: # self._database_tags[] = list of tags applied to database @@ -208,6 +232,7 @@ def as_obj(self) -> Dict[str, Dict[str, int]]: self.get_tables_for_database, self.get_views_for_database, self.get_columns_for_schema, + self.get_streams_for_database, self.get_pk_constraints_for_schema, self.get_fk_constraints_for_schema, ] @@ -431,9 +456,18 @@ def get_columns_for_schema( # For massive schemas, use a FileBackedDict to avoid memory issues. columns = FileBackedDict() - object_batches = build_prefix_batches( - all_objects, max_batch_size=10000, max_groups_in_batch=5 - ) + # Single prefix table case (for streams) + if len(all_objects) == 1: + object_batches = [ + [PrefixGroup(prefix=all_objects[0], names=[], exact_match=True)] + ] + else: + # Build batches for full schema scan + object_batches = build_prefix_batches( + all_objects, max_batch_size=10000, max_groups_in_batch=5 + ) + + # Process batches for batch_index, object_batch in enumerate(object_batches): if batch_index > 0: logger.info( @@ -611,3 +645,63 @@ def get_tags_on_columns_for_table( tags[column_name].append(snowflake_tag) return tags + + @serialized_lru_cache(maxsize=1) + def get_streams_for_database( + self, db_name: str + ) -> Dict[str, List[SnowflakeStream]]: + page_limit = SHOW_VIEWS_MAX_PAGE_SIZE + + streams: Dict[str, List[SnowflakeStream]] = {} + + first_iteration = True + stream_pagination_marker: Optional[str] = None + while first_iteration or stream_pagination_marker is not None: + cur = self.connection.query( + SnowflakeQuery.streams_for_database( + db_name, + limit=page_limit, + stream_pagination_marker=stream_pagination_marker, + ) + ) + + first_iteration = False + stream_pagination_marker = None + + result_set_size = 0 + for stream in cur: + result_set_size += 1 + + stream_name = stream["name"] + schema_name = stream["schema_name"] + if schema_name not in streams: + streams[schema_name] = [] + streams[stream["schema_name"]].append( + SnowflakeStream( + name=stream["name"], + created=stream["created_on"], + owner=stream["owner"], + comment=stream["comment"], + source_type=stream["source_type"], + type=stream["type"], + stale=stream["stale"], + mode=stream["mode"], + database_name=stream["database_name"], + schema_name=stream["schema_name"], + invalid_reason=stream["invalid_reason"], + owner_role_type=stream["owner_role_type"], + stale_after=stream["stale_after"], + table_name=stream["table_name"], + base_tables=stream["base_tables"], + last_altered=stream["created_on"], + ) + ) + + if result_set_size >= page_limit: + # If we hit the limit, we need to send another request to get the next page. + logger.info( + f"Fetching next page of streams for {db_name} - after {stream_name}" + ) + stream_pagination_marker = stream_name + + return streams diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema_gen.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema_gen.py index 134f0b343ccfe6..0490b323bda9ea 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema_gen.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_schema_gen.py @@ -48,6 +48,7 @@ SnowflakeFK, SnowflakePK, SnowflakeSchema, + SnowflakeStream, SnowflakeTable, SnowflakeTag, SnowflakeView, @@ -58,6 +59,7 @@ SnowflakeIdentifierBuilder, SnowflakeStructuredReportMixin, SnowsightUrlBuilder, + split_qualified_name, ) from datahub.ingestion.source.sql.sql_utils import ( add_table_to_schema_container, @@ -70,6 +72,7 @@ ) from datahub.ingestion.source_report.ingestion_stage import ( EXTERNAL_TABLE_DDL_LINEAGE, + LINEAGE_EXTRACTION, METADATA_EXTRACTION, PROFILING, ) @@ -81,6 +84,7 @@ TimeStamp, ) from datahub.metadata.com.linkedin.pegasus2avro.dataset import ( + DatasetLineageTypeClass, DatasetProperties, ViewProperties, ) @@ -420,73 +424,120 @@ def _process_schema( schema_name = snowflake_schema.name if self.config.extract_tags != TagOption.skip: - snowflake_schema.tags = self.tag_extractor.get_tags_on_object( - schema_name=schema_name, db_name=db_name, domain="schema" - ) + self._process_tags(snowflake_schema, schema_name, db_name, domain="schema") if self.config.include_technical_schema: yield from self.gen_schema_containers(snowflake_schema, db_name) - # We need to do this first so that we can use it when fetching columns. + tables, views, streams = [], [], [] + if self.config.include_tables: tables = self.fetch_tables_for_schema( snowflake_schema, db_name, schema_name ) + db_tables[schema_name] = tables + yield from self._process_tables( + tables, snowflake_schema, db_name, schema_name + ) + if self.config.include_views: views = self.fetch_views_for_schema(snowflake_schema, db_name, schema_name) + yield from self._process_views( + views, snowflake_schema, db_name, schema_name + ) - if self.config.include_tables: - db_tables[schema_name] = tables + if self.config.include_streams: + self.report.num_get_streams_for_schema_queries += 1 + streams = self.fetch_streams_for_schema( + snowflake_schema, db_name, schema_name + ) + yield from self._process_streams(streams, snowflake_schema, db_name) - if self.config.include_technical_schema: - data_reader = self.make_data_reader() - for table in tables: - table_wu_generator = self._process_table( - table, snowflake_schema, db_name - ) + if self.config.include_technical_schema and snowflake_schema.tags: + yield from self._process_tags_in_schema(snowflake_schema) - yield from classification_workunit_processor( - table_wu_generator, - self.classification_handler, - data_reader, - [db_name, schema_name, table.name], - ) + if ( + not snowflake_schema.views + and not snowflake_schema.tables + and not snowflake_schema.streams + ): + self.structured_reporter.info( + title="No tables/views/streams found in schema", + message="If objects exist, please grant REFERENCES or SELECT permissions on them.", + context=f"{db_name}.{schema_name}", + ) - if self.config.include_views: - if self.aggregator: - for view in views: - view_identifier = self.identifiers.get_dataset_identifier( + def _process_tags(self, snowflake_schema, schema_name, db_name, domain): + snowflake_schema.tags = self.tag_extractor.get_tags_on_object( + schema_name=schema_name, db_name=db_name, domain=domain + ) + + def _process_tables( + self, + tables: List[SnowflakeTable], + snowflake_schema: SnowflakeSchema, + db_name: str, + schema_name: str, + ) -> Iterable[MetadataWorkUnit]: + if self.config.include_technical_schema: + data_reader = self.make_data_reader() + for table in tables: + table_wu_generator = self._process_table( + table, snowflake_schema, db_name + ) + yield from classification_workunit_processor( + table_wu_generator, + self.classification_handler, + data_reader, + [db_name, schema_name, table.name], + ) + + def _process_views( + self, + views: List[SnowflakeView], + snowflake_schema: SnowflakeSchema, + db_name: str, + schema_name: str, + ) -> Iterable[MetadataWorkUnit]: + if self.aggregator: + for view in views: + view_identifier = self.identifiers.get_dataset_identifier( + view.name, schema_name, db_name + ) + if view.is_secure and not view.view_definition: + view.view_definition = self.fetch_secure_view_definition( view.name, schema_name, db_name ) - if view.is_secure and not view.view_definition: - view.view_definition = self.fetch_secure_view_definition( - view.name, schema_name, db_name - ) - if view.view_definition: - self.aggregator.add_view_definition( - view_urn=self.identifiers.gen_dataset_urn(view_identifier), - view_definition=view.view_definition, - default_db=db_name, - default_schema=schema_name, - ) - elif view.is_secure: - self.report.num_secure_views_missing_definition += 1 + if view.view_definition: + self.aggregator.add_view_definition( + view_urn=self.identifiers.gen_dataset_urn(view_identifier), + view_definition=view.view_definition, + default_db=db_name, + default_schema=schema_name, + ) + elif view.is_secure: + self.report.num_secure_views_missing_definition += 1 - if self.config.include_technical_schema: - for view in views: - yield from self._process_view(view, snowflake_schema, db_name) + if self.config.include_technical_schema: + for view in views: + yield from self._process_view(view, snowflake_schema, db_name) - if self.config.include_technical_schema and snowflake_schema.tags: + def _process_streams( + self, + streams: List[SnowflakeStream], + snowflake_schema: SnowflakeSchema, + db_name: str, + ) -> Iterable[MetadataWorkUnit]: + for stream in streams: + yield from self._process_stream(stream, snowflake_schema, db_name) + + def _process_tags_in_schema( + self, snowflake_schema: SnowflakeSchema + ) -> Iterable[MetadataWorkUnit]: + if snowflake_schema.tags: for tag in snowflake_schema.tags: yield from self._process_tag(tag) - if not snowflake_schema.views and not snowflake_schema.tables: - self.structured_reporter.info( - title="No tables/views found in schema", - message="If tables exist, please grant REFERENCES or SELECT permissions on them.", - context=f"{db_name}.{schema_name}", - ) - def fetch_secure_view_definition( self, table_name: str, schema_name: str, db_name: str ) -> Optional[str]: @@ -729,7 +780,7 @@ def _format_tags_as_structured_properties( def gen_dataset_workunits( self, - table: Union[SnowflakeTable, SnowflakeView], + table: Union[SnowflakeTable, SnowflakeView, SnowflakeStream], schema_name: str, db_name: str, ) -> Iterable[MetadataWorkUnit]: @@ -788,7 +839,9 @@ def gen_dataset_workunits( subTypes = SubTypes( typeNames=( - [DatasetSubTypes.VIEW] + [DatasetSubTypes.SNOWFLAKE_STREAM] + if isinstance(table, SnowflakeStream) + else [DatasetSubTypes.VIEW] if isinstance(table, SnowflakeView) else [DatasetSubTypes.TABLE] ) @@ -843,28 +896,50 @@ def gen_dataset_workunits( def get_dataset_properties( self, - table: Union[SnowflakeTable, SnowflakeView], + table: Union[SnowflakeTable, SnowflakeView, SnowflakeStream], schema_name: str, db_name: str, ) -> DatasetProperties: custom_properties = {} if isinstance(table, SnowflakeTable): - if table.clustering_key: - custom_properties["CLUSTERING_KEY"] = table.clustering_key - - if table.is_hybrid: - custom_properties["IS_HYBRID"] = "true" - - if table.is_dynamic: - custom_properties["IS_DYNAMIC"] = "true" - - if table.is_iceberg: - custom_properties["IS_ICEBERG"] = "true" + custom_properties.update( + { + k: v + for k, v in { + "CLUSTERING_KEY": table.clustering_key, + "IS_HYBRID": "true" if table.is_hybrid else None, + "IS_DYNAMIC": "true" if table.is_dynamic else None, + "IS_ICEBERG": "true" if table.is_iceberg else None, + }.items() + if v + } + ) if isinstance(table, SnowflakeView) and table.is_secure: custom_properties["IS_SECURE"] = "true" + elif isinstance(table, SnowflakeStream): + custom_properties.update( + { + k: v + for k, v in { + "SOURCE_TYPE": table.source_type, + "TYPE": table.type, + "STALE": table.stale, + "MODE": table.mode, + "INVALID_REASON": table.invalid_reason, + "OWNER_ROLE_TYPE": table.owner_role_type, + "TABLE_NAME": table.table_name, + "BASE_TABLES": table.base_tables, + "STALE_AFTER": table.stale_after.isoformat() + if table.stale_after + else None, + }.items() + if v + } + ) + return DatasetProperties( name=table.name, created=( @@ -909,7 +984,9 @@ def gen_tag_workunits(self, tag: SnowflakeTag) -> Iterable[MetadataWorkUnit]: ).as_workunit() def gen_column_tags_as_structured_properties( - self, dataset_urn: str, table: Union[SnowflakeTable, SnowflakeView] + self, + dataset_urn: str, + table: Union[SnowflakeTable, SnowflakeView, SnowflakeStream], ) -> Iterable[MetadataWorkUnit]: for column_name in table.column_tags: schema_field_urn = SchemaFieldUrn(dataset_urn, column_name).urn() @@ -922,7 +999,7 @@ def gen_column_tags_as_structured_properties( def gen_schema_metadata( self, - table: Union[SnowflakeTable, SnowflakeView], + table: Union[SnowflakeTable, SnowflakeView, SnowflakeStream], schema_name: str, db_name: str, ) -> SchemaMetadata: @@ -1214,3 +1291,158 @@ def _external_tables_ddl_lineage( "External table ddl lineage extraction failed", exc=e, ) + + def fetch_streams_for_schema( + self, snowflake_schema: SnowflakeSchema, db_name: str, schema_name: str + ) -> List[SnowflakeStream]: + try: + streams: List[SnowflakeStream] = [] + for stream in self.get_streams_for_schema(schema_name, db_name): + stream_identifier = self.identifiers.get_dataset_identifier( + stream.name, schema_name, db_name + ) + + self.report.report_entity_scanned(stream_identifier, "stream") + + if not self.filters.is_dataset_pattern_allowed( + stream_identifier, SnowflakeObjectDomain.STREAM + ): + self.report.report_dropped(stream_identifier) + else: + streams.append(stream) + snowflake_schema.streams = [stream.name for stream in streams] + return streams + except Exception as e: + if isinstance(e, SnowflakePermissionError): + error_msg = f"Failed to get streams for schema {db_name}.{schema_name}. Please check permissions." + raise SnowflakePermissionError(error_msg) from e.__cause__ + else: + self.structured_reporter.warning( + "Failed to get streams for schema", + f"{db_name}.{schema_name}", + exc=e, + ) + return [] + + def get_streams_for_schema( + self, schema_name: str, db_name: str + ) -> List[SnowflakeStream]: + streams = self.data_dictionary.get_streams_for_database(db_name) + + return streams.get(schema_name, []) + + def _process_stream( + self, + stream: SnowflakeStream, + snowflake_schema: SnowflakeSchema, + db_name: str, + ) -> Iterable[MetadataWorkUnit]: + schema_name = snowflake_schema.name + + try: + # Retrieve and register the schema without metadata to prevent columns from mapping upstream + stream.columns = self.get_columns_for_stream(stream.table_name) + yield from self.gen_dataset_workunits(stream, schema_name, db_name) + + if self.config.include_column_lineage: + with self.report.new_stage(f"*: {LINEAGE_EXTRACTION}"): + self.populate_stream_upstreams(stream, db_name, schema_name) + + except Exception as e: + self.structured_reporter.warning( + "Failed to get columns for stream:", stream.name, exc=e + ) + + def get_columns_for_stream( + self, + source_object: str, # Qualified name of source table/view + ) -> List[SnowflakeColumn]: + """ + Get column information for a stream by getting source object columns and adding metadata columns. + Stream includes all columns from source object plus metadata columns like: + - METADATA$ACTION + - METADATA$ISUPDATE + - METADATA$ROW_ID + """ + columns: List[SnowflakeColumn] = [] + + source_parts = split_qualified_name(source_object) + + source_db, source_schema, source_name = source_parts + + # Get columns from source object + source_columns = self.data_dictionary.get_columns_for_schema( + source_schema, source_db, itertools.chain([source_name]) + ).get(source_name, []) + + # Add all source columns + columns.extend(source_columns) + + # Add standard stream metadata columns + metadata_columns = [ + SnowflakeColumn( + name="METADATA$ACTION", + ordinal_position=len(columns) + 1, + is_nullable=False, + data_type="VARCHAR", + comment="Type of DML operation (INSERT/DELETE)", + character_maximum_length=10, + numeric_precision=None, + numeric_scale=None, + ), + SnowflakeColumn( + name="METADATA$ISUPDATE", + ordinal_position=len(columns) + 2, + is_nullable=False, + data_type="BOOLEAN", + comment="Whether row is from UPDATE operation", + character_maximum_length=None, + numeric_precision=None, + numeric_scale=None, + ), + SnowflakeColumn( + name="METADATA$ROW_ID", + ordinal_position=len(columns) + 3, + is_nullable=False, + data_type="NUMBER", + comment="Unique row identifier", + character_maximum_length=None, + numeric_precision=38, + numeric_scale=0, + ), + ] + + columns.extend(metadata_columns) + + return columns + + def populate_stream_upstreams( + self, stream: SnowflakeStream, db_name: str, schema_name: str + ) -> None: + """ + Populate Streams upstream tables + """ + self.report.num_streams_with_known_upstreams += 1 + if self.aggregator: + source_parts = split_qualified_name(stream.table_name) + source_db, source_schema, source_name = source_parts + + dataset_identifier = self.identifiers.get_dataset_identifier( + stream.name, schema_name, db_name + ) + dataset_urn = self.identifiers.gen_dataset_urn(dataset_identifier) + + upstream_identifier = self.identifiers.get_dataset_identifier( + source_name, source_schema, source_db + ) + upstream_urn = self.identifiers.gen_dataset_urn(upstream_identifier) + + logger.debug( + f"""upstream_urn: {upstream_urn}, downstream_urn: {dataset_urn}""" + ) + + self.aggregator.add_known_lineage_mapping( + upstream_urn=upstream_urn, + downstream_urn=dataset_urn, + lineage_type=DatasetLineageTypeClass.COPY, + ) diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_utils.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_utils.py index 030edfde4ca1da..1e95597061577e 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_utils.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_utils.py @@ -124,19 +124,20 @@ def is_dataset_pattern_allowed( SnowflakeObjectDomain.VIEW, SnowflakeObjectDomain.MATERIALIZED_VIEW, SnowflakeObjectDomain.ICEBERG_TABLE, + SnowflakeObjectDomain.STREAM, ): return False if _is_sys_table(dataset_name): return False - dataset_params = _split_qualified_name(dataset_name) + dataset_params = split_qualified_name(dataset_name) if len(dataset_params) != 3: self.structured_reporter.info( title="Unexpected dataset pattern", message=f"Found a {dataset_type} with an unexpected number of parts. Database and schema filtering will not work as expected, but table filtering will still work.", context=dataset_name, ) - # We fall-through here so table/view filtering still works. + # We fall-through here so table/view/stream filtering still works. if ( len(dataset_params) >= 1 @@ -169,6 +170,14 @@ def is_dataset_pattern_allowed( ): return False + if ( + dataset_type.lower() == SnowflakeObjectDomain.STREAM + and not self.filter_config.stream_pattern.allowed( + _cleanup_qualified_name(dataset_name, self.structured_reporter) + ) + ): + return False + return True @@ -183,17 +192,17 @@ def _is_sys_table(table_name: str) -> bool: return table_name.lower().startswith("sys$") -def _split_qualified_name(qualified_name: str) -> List[str]: +def split_qualified_name(qualified_name: str) -> List[str]: """ Split a qualified name into its constituent parts. - >>> _split_qualified_name("db.my_schema.my_table") + >>> split_qualified_name("db.my_schema.my_table") ['db', 'my_schema', 'my_table'] - >>> _split_qualified_name('"db"."my_schema"."my_table"') + >>> split_qualified_name('"db"."my_schema"."my_table"') ['db', 'my_schema', 'my_table'] - >>> _split_qualified_name('TEST_DB.TEST_SCHEMA."TABLE.WITH.DOTS"') + >>> split_qualified_name('TEST_DB.TEST_SCHEMA."TABLE.WITH.DOTS"') ['TEST_DB', 'TEST_SCHEMA', 'TABLE.WITH.DOTS'] - >>> _split_qualified_name('TEST_DB."SCHEMA.WITH.DOTS".MY_TABLE') + >>> split_qualified_name('TEST_DB."SCHEMA.WITH.DOTS".MY_TABLE') ['TEST_DB', 'SCHEMA.WITH.DOTS', 'MY_TABLE'] """ @@ -231,7 +240,7 @@ def _split_qualified_name(qualified_name: str) -> List[str]: def _cleanup_qualified_name( qualified_name: str, structured_reporter: SourceReport ) -> str: - name_parts = _split_qualified_name(qualified_name) + name_parts = split_qualified_name(qualified_name) if len(name_parts) != 3: if not _is_sys_table(qualified_name): structured_reporter.info( diff --git a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_v2.py b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_v2.py index a8666643ac62fc..daeb839e5f54da 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_v2.py +++ b/metadata-ingestion/src/datahub/ingestion/source/snowflake/snowflake_v2.py @@ -539,15 +539,27 @@ def get_workunits_internal(self) -> Iterable[MetadataWorkUnit]: for schema in db.schemas for table_name in schema.views ] + discovered_streams: List[str] = [ + self.identifiers.get_dataset_identifier(stream_name, schema.name, db.name) + for db in databases + for schema in db.schemas + for stream_name in schema.streams + ] - if len(discovered_tables) == 0 and len(discovered_views) == 0: + if ( + len(discovered_tables) == 0 + and len(discovered_views) == 0 + and len(discovered_streams) == 0 + ): self.structured_reporter.failure( GENERIC_PERMISSION_ERROR_KEY, - "No tables/views found. Please check permissions.", + "No tables/views/streams found. Please check permissions.", ) return - self.discovered_datasets = discovered_tables + discovered_views + self.discovered_datasets = ( + discovered_tables + discovered_views + discovered_streams + ) if self.config.use_queries_v2: with self.report.new_stage(f"*: {VIEW_PARSING}"): diff --git a/metadata-ingestion/tests/integration/snowflake/common.py b/metadata-ingestion/tests/integration/snowflake/common.py index 7a296a597468ec..9b9b6269ca6a3b 100644 --- a/metadata-ingestion/tests/integration/snowflake/common.py +++ b/metadata-ingestion/tests/integration/snowflake/common.py @@ -7,9 +7,11 @@ from datahub.configuration.time_window_config import BucketDuration from datahub.ingestion.source.snowflake import snowflake_query from datahub.ingestion.source.snowflake.snowflake_query import SnowflakeQuery +from datahub.utilities.prefix_batch_builder import PrefixGroup NUM_TABLES = 10 NUM_VIEWS = 2 +NUM_STREAMS = 1 NUM_COLS = 10 NUM_OPS = 10 NUM_USAGE = 0 @@ -175,6 +177,7 @@ def default_query_results( # noqa: C901 query, num_tables=NUM_TABLES, num_views=NUM_VIEWS, + num_streams=NUM_STREAMS, num_cols=NUM_COLS, num_ops=NUM_OPS, num_usages=NUM_USAGE, @@ -272,6 +275,27 @@ def default_query_results( # noqa: C901 for view_idx in range(1, num_views + 1) if is_secure(view_idx) ] + elif query == SnowflakeQuery.columns_for_schema( + "TEST_SCHEMA", + "TEST_DB", + [PrefixGroup(prefix="TABLE_1", names=[], exact_match=True)], + ): + return [ + { + "TABLE_CATALOG": "TEST_DB", + "TABLE_SCHEMA": "TEST_SCHEMA", + "TABLE_NAME": "TABLE_1", + "COLUMN_NAME": f"COL_{col_idx}", + "ORDINAL_POSITION": col_idx, + "IS_NULLABLE": "NO", + "DATA_TYPE": "TEXT" if col_idx > 1 else "NUMBER", + "COMMENT": "Comment for column", + "CHARACTER_MAXIMUM_LENGTH": 255 if col_idx > 1 else None, + "NUMERIC_PRECISION": None if col_idx > 1 else 38, + "NUMERIC_SCALE": None if col_idx > 1 else 0, + } + for col_idx in range(1, num_cols + 1) + ] elif query == SnowflakeQuery.columns_for_schema("TEST_SCHEMA", "TEST_DB"): return [ { @@ -293,6 +317,28 @@ def default_query_results( # noqa: C901 ) for col_idx in range(1, num_cols + 1) ] + elif query == SnowflakeQuery.streams_for_database("TEST_DB"): + # TODO: Add tests for stream pagination. + return [ + { + "created_on": datetime(2021, 6, 8, 0, 0, 0, 0, tzinfo=timezone.utc), + "name": f"STREAM_{stream_idx}", + "database_name": "TEST_DB", + "schema_name": "TEST_SCHEMA", + "owner": "ACCOUNTADMIN", + "comment": f"Comment for Stream {stream_idx}", + "table_name": f"TEST_DB.TEST_SCHEMA.TABLE_{stream_idx}", + "source_type": "Table", + "base_tables": f"TEST_DB.TEST_SCHEMA.TABLE_{stream_idx}", + "type": "DELTA", + "stale": "false", + "mode": "DEFAULT", + "stale_after": datetime(2021, 6, 22, 0, 0, 0, 0, tzinfo=timezone.utc), + "invalid_reason": None, + "owner_role_type": "ROLE", + } + for stream_idx in range(1, num_streams + 1) + ] elif query in ( SnowflakeQuery.use_database("TEST_DB"), SnowflakeQuery.show_primary_keys_for_schema("TEST_SCHEMA", "TEST_DB"), diff --git a/metadata-ingestion/tests/integration/snowflake/snowflake_golden.json b/metadata-ingestion/tests/integration/snowflake/snowflake_golden.json index 48ec46af069cef..4b3bd16deceeae 100644 --- a/metadata-ingestion/tests/integration/snowflake/snowflake_golden.json +++ b/metadata-ingestion/tests/integration/snowflake/snowflake_golden.json @@ -16,16 +16,16 @@ "description": "Comment for TEST_DB", "env": "PROD", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 } } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_08_20-16_18_24", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -40,8 +40,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -56,8 +56,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -74,8 +74,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -94,8 +94,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -110,8 +110,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -127,8 +127,24 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "container", + "entityUrn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -150,16 +166,16 @@ "description": "comment for TEST_DB.TEST_SCHEMA", "env": "PROD", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 } } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_08_20-16_18_24", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -174,8 +190,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -190,8 +206,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -208,8 +224,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -228,24 +244,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "container", - "entityUrn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", - "changeType": "UPSERT", - "aspectName": "container", - "aspect": { - "json": { - "container": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -265,8 +265,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -281,8 +281,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -329,7 +329,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -353,7 +353,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -377,7 +377,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -478,8 +478,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -498,17 +498,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_1", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -523,8 +523,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -541,8 +541,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -566,8 +566,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -582,8 +582,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -630,7 +630,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -654,7 +654,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -678,7 +678,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -779,8 +779,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -799,17 +799,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_2", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -824,8 +824,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -842,8 +842,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -867,8 +867,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -883,8 +883,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -931,7 +931,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -955,7 +955,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -979,7 +979,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1080,8 +1080,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1100,17 +1100,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_3", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1125,8 +1125,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1143,8 +1143,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1168,8 +1168,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1184,8 +1184,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1232,7 +1232,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1256,7 +1256,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1280,7 +1280,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1381,8 +1381,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1401,17 +1401,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_4", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1426,8 +1426,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1444,8 +1444,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1469,8 +1469,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1485,8 +1485,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1533,7 +1533,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1557,7 +1557,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1581,7 +1581,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1682,8 +1682,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1702,17 +1702,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_5", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1727,8 +1727,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1745,8 +1745,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1770,8 +1770,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1786,8 +1786,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -1834,7 +1834,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1858,7 +1858,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1882,7 +1882,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -1983,8 +1983,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2003,17 +2003,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_6", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2028,8 +2028,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2046,8 +2046,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2071,8 +2071,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2087,8 +2087,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2135,7 +2135,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2159,7 +2159,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2183,7 +2183,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2284,8 +2284,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2304,17 +2304,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_7", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2329,8 +2329,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2347,8 +2347,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2372,8 +2372,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2388,8 +2388,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2436,7 +2436,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2460,7 +2460,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2484,7 +2484,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2585,8 +2585,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2605,17 +2605,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_8", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2630,8 +2630,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2648,8 +2648,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2673,8 +2673,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2689,8 +2689,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2737,7 +2737,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2761,7 +2761,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2785,7 +2785,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -2886,8 +2886,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2906,17 +2906,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_9", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2931,8 +2931,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2949,8 +2949,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2974,8 +2974,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -2990,8 +2990,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3038,7 +3038,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -3062,7 +3062,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -3086,7 +3086,7 @@ } ], "auditStamp": { - "time": 1654621200000, + "time": 1615443388097, "actor": "urn:li:corpuser:datahub" } }, @@ -3187,8 +3187,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3207,17 +3207,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.TABLE_10", "description": "Comment for Table", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3232,8 +3232,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3250,8 +3250,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3275,8 +3275,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3292,8 +3292,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3308,8 +3308,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3479,8 +3479,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3499,17 +3499,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.VIEW_1", "description": "Comment for View", "created": { - "time": 1623090600000 + "time": 1623124800000 }, "lastModified": { - "time": 1623090600000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_12_16-15_30_20-649nax", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3524,8 +3524,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3542,8 +3542,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3561,7 +3561,7 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_10_06-17_59_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3585,8 +3585,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3602,8 +3602,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3619,8 +3619,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3636,8 +3636,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3652,8 +3652,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3816,8 +3816,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3834,17 +3834,17 @@ "qualifiedName": "TEST_DB.TEST_SCHEMA.VIEW_2", "description": "Comment for View", "created": { - "time": 1623103200000 + "time": 1623124800000 }, "lastModified": { - "time": 1623103200000 + "time": 1623124800000 }, "tags": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_12_18-10_16_09", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3859,8 +3859,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3877,8 +3877,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3903,33 +3903,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)", - "changeType": "UPSERT", - "aspectName": "browsePathsV2", - "aspect": { - "json": { - "path": [ - { - "id": "urn:li:container:5e359958be02ce647cd9ac196dbd4585", - "urn": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" - }, - { - "id": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", - "urn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" - } - ] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -3947,179 +3922,646 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2023_10_06-17_59_03", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetProfile", - "aspect": { - "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)", "changeType": "UPSERT", - "aspectName": "datasetProfile", + "aspectName": "browsePathsV2", "aspect": { "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 + "path": [ + { + "id": "urn:li:container:5e359958be02ce647cd9ac196dbd4585", + "urn": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" + }, + { + "id": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", + "urn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + ] } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", "changeType": "UPSERT", - "aspectName": "datasetProfile", + "aspectName": "status", "aspect": { "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 + "removed": false } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", "changeType": "UPSERT", - "aspectName": "datasetProfile", + "aspectName": "schemaMetadata", "aspect": { "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" + "schemaName": "test_db.test_schema.stream_1", + "platform": "urn:li:dataPlatform:snowflake", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetProfile", - "aspect": { - "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetProfile", - "aspect": { - "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" + "hash": "", + "platformSchema": { + "com.linkedin.schema.MySqlDDL": { + "tableSchema": "" + } }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetProfile", - "aspect": { - "json": { - "timestampMillis": 1654621200000, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" + "fields": [ + { + "fieldPath": "col_1", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_2", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_3", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_4", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_5", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_6", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_7", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_8", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_9", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_10", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$action", + "nullable": false, + "description": "Type of DML operation (INSERT/DELETE)", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(10)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$isupdate", + "nullable": false, + "description": "Whether row is from UPDATE operation", + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "BOOLEAN", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$row_id", + "nullable": false, + "description": "Unique row identifier", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": { + "SOURCE_TYPE": "Table", + "TYPE": "DELTA", + "STALE": "false", + "MODE": "DEFAULT", + "OWNER_ROLE_TYPE": "ROLE", + "TABLE_NAME": "TEST_DB.TEST_SCHEMA.TABLE_1", + "BASE_TABLES": "TEST_DB.TEST_SCHEMA.TABLE_1", + "STALE_AFTER": "2021-06-22T00:00:00+00:00" + }, + "externalUrl": "https://app.snowflake.com/ap-south-1.aws/abc12345/#/data/databases/TEST_DB/schemas/TEST_SCHEMA/view/STREAM_1/", + "name": "STREAM_1", + "qualifiedName": "TEST_DB.TEST_SCHEMA.STREAM_1", + "description": "Comment for Stream 1", + "created": { + "time": 1623110400000 + }, + "lastModified": { + "time": 1623110400000 + }, + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "json": { + "typeNames": [ + "Snowflake Stream" + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "test_db.test_schema.stream_1", + "platform": "urn:li:dataPlatform:snowflake", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.MySqlDDL": { + "tableSchema": "" + } + }, + "fields": [ + { + "fieldPath": "col_1", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_2", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_3", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_4", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_5", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_6", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_7", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_8", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_9", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_10", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$action", + "nullable": false, + "description": "Type of DML operation (INSERT/DELETE)", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(10)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$isupdate", + "nullable": false, + "description": "Whether row is from UPDATE operation", + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "BOOLEAN", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$row_id", + "nullable": false, + "description": "Unique row identifier", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": { + "SOURCE_TYPE": "Table", + "TYPE": "DELTA", + "STALE": "false", + "MODE": "DEFAULT", + "OWNER_ROLE_TYPE": "ROLE", + "TABLE_NAME": "TEST_DB.TEST_SCHEMA.TABLE_1", + "BASE_TABLES": "TEST_DB.TEST_SCHEMA.TABLE_1", + "STALE_AFTER": "2021-06-22T00:00:00+00:00" + }, + "externalUrl": "https://app.snowflake.com/ap-south-1.aws/abc12345/#/data/databases/TEST_DB/schemas/TEST_SCHEMA/view/STREAM_1/", + "name": "STREAM_1", + "qualifiedName": "TEST_DB.TEST_SCHEMA.STREAM_1", + "description": "Comment for Stream 1", + "created": { + "time": 1623110400000 }, - "rowCount": 10000, - "columnCount": 10, - "sizeInBytes": 1024 + "lastModified": { + "time": 1623110400000 + }, + "tags": [] } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "json": { + "typeNames": [ + "Snowflake Stream" + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:container:5e359958be02ce647cd9ac196dbd4585", + "urn": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" + }, + { + "id": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", + "urn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1738040516740, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -4130,19 +4572,19 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1738040516750, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -4153,19 +4595,19 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1738040516750, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -4176,194 +4618,175 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", "changeType": "UPSERT", - "aspectName": "upstreamLineage", + "aspectName": "datasetProfile", "aspect": { "json": { - "upstreams": [ - { - "auditStamp": { - "time": 1615443388097, - "actor": "urn:li:corpuser:_ingestion" - }, - "created": { - "time": 0, - "actor": "urn:li:corpuser:_ingestion" - }, - "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", - "type": "VIEW", - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - } - ], - "fineGrainedLineages": [ - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_1)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_2)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_3)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_4)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_5)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_6)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_7)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_8)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_9)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_10)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" - } - ] + "timestampMillis": 1738040516751, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "json": { + "timestampMillis": 1738040516751, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "datasetProfile", "aspect": { "json": { - "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_1\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", - "language": "SQL" + "timestampMillis": 1738040516752, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" }, - "source": "SYSTEM", - "created": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "json": { + "timestampMillis": 1738040516752, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" }, - "lastModified": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - } + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "json": { + "timestampMillis": 1738040516753, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "json": { + "timestampMillis": 1738040516754, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "json": { + "timestampMillis": 1738040516754, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "rowCount": 10000, + "columnCount": 10, + "sizeInBytes": 1024 + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -4378,216 +4801,160 @@ "time": 0, "actor": "urn:li:corpuser:_ingestion" }, - "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", - "type": "VIEW", - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", + "type": "COPY" } ], "fineGrainedLineages": [ { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_1)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_2)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_1)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_2)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_3)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_4)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_5)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_6)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_7)" ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + "confidenceScore": 1.0 }, { "upstreamType": "FIELD_SET", "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_10)" - ], - "confidenceScore": 0.9, - "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" - } - ] - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", - "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", - "aspect": { - "json": { - "platform": "urn:li:dataPlatform:snowflake" - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", - "changeType": "UPSERT", - "aspectName": "querySubjects", - "aspect": { - "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,other_db.other_schema.table_1,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_8)" + ], + "confidenceScore": 1.0 }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_9)" + ], + "confidenceScore": 1.0 }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),col_10)" + ], + "confidenceScore": 1.0 }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),metadata$action)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),metadata$action)" + ], + "confidenceScore": 1.0 }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),metadata$isupdate)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),metadata$isupdate)" + ], + "confidenceScore": 1.0 }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),metadata$row_id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD),metadata$row_id)" + ], + "confidenceScore": 1.0 } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -4766,13 +5133,116 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_1\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", + "changeType": "UPSERT", + "aspectName": "querySubjects", + "aspect": { + "json": { + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,other_db.other_schema.table_1,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:snowflake" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -4789,7 +5259,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" } ], "fineGrainedLineages": [ @@ -4800,10 +5270,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4812,10 +5282,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4824,10 +5294,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4836,10 +5306,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4848,10 +5318,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4860,10 +5330,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4872,10 +5342,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4884,10 +5354,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4896,10 +5366,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" }, { "upstreamType": "FIELD_SET", @@ -4908,33 +5378,17 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" + "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", - "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", - "aspect": { - "json": { - "platform": "urn:li:dataPlatform:snowflake" - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -4962,41 +5416,82 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9", + "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "querySubjects", + "aspect": { + "json": { + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_10)" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_2\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", - "language": "SQL" - }, - "source": "SYSTEM", - "created": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - }, - "lastModified": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - } + "platform": "urn:li:dataPlatform:snowflake" } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -5013,7 +5508,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" } ], "fineGrainedLineages": [ @@ -5024,10 +5519,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5036,10 +5531,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5048,10 +5543,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5060,10 +5555,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5072,10 +5567,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5084,10 +5579,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5096,10 +5591,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5108,10 +5603,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5120,10 +5615,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" }, { "upstreamType": "FIELD_SET", @@ -5132,17 +5627,45 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + "query": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_2\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -5154,9 +5677,6 @@ "aspect": { "json": { "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, { "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, @@ -5195,7 +5715,7 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -5211,66 +5731,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", - "changeType": "UPSERT", - "aspectName": "querySubjects", - "aspect": { - "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_6)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_7)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_8)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_9)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_10)" - } - ] - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -5287,7 +5754,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" } ], "fineGrainedLineages": [ @@ -5298,10 +5765,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5310,10 +5777,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5322,10 +5789,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5334,10 +5801,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5346,10 +5813,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5358,10 +5825,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5370,10 +5837,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5382,10 +5849,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5394,10 +5861,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" }, { "upstreamType": "FIELD_SET", @@ -5406,23 +5873,120 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" + "query": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_3\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "changeType": "UPSERT", + "aspectName": "querySubjects", + "aspect": { + "json": { + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:snowflake" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -5439,7 +6003,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" } ], "fineGrainedLineages": [ @@ -5450,10 +6014,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5462,10 +6026,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5474,10 +6038,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5486,10 +6050,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5498,10 +6062,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5510,10 +6074,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5522,10 +6086,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5534,10 +6098,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5546,10 +6110,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" }, { "upstreamType": "FIELD_SET", @@ -5558,17 +6122,17 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" + "query": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -5596,13 +6160,66 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", + "changeType": "UPSERT", + "aspectName": "querySubjects", + "aspect": { + "json": { + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_10)" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", "changeType": "UPSERT", "aspectName": "dataPlatformInstance", "aspect": { @@ -5612,13 +6229,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -5635,7 +6252,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" } ], "fineGrainedLineages": [ @@ -5646,10 +6263,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5658,10 +6275,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5670,10 +6287,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5682,10 +6299,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5694,10 +6311,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5706,10 +6323,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5718,10 +6335,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5730,10 +6347,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5742,10 +6359,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" }, { "upstreamType": "FIELD_SET", @@ -5754,23 +6371,51 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" + "query": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", + "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_5\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", "changeType": "UPSERT", "aspectName": "querySubjects", "aspect": { @@ -5780,44 +6425,44 @@ "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_9)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -5825,33 +6470,21 @@ "entityType": "query", "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_5\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", - "language": "SQL" - }, - "source": "SYSTEM", - "created": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - }, - "lastModified": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - } + "platform": "urn:li:dataPlatform:snowflake" } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -5868,7 +6501,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" } ], "fineGrainedLineages": [ @@ -5879,10 +6512,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5891,10 +6524,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5903,10 +6536,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5915,10 +6548,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5927,10 +6560,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5939,10 +6572,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5951,10 +6584,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5963,10 +6596,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5975,10 +6608,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" }, { "upstreamType": "FIELD_SET", @@ -5987,23 +6620,51 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" + "query": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", + "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_6\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", "changeType": "UPSERT", "aspectName": "querySubjects", "aspect": { @@ -6013,66 +6674,50 @@ "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_9)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", - "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", - "aspect": { - "json": { - "platform": "urn:li:dataPlatform:snowflake" - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", + "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", "changeType": "UPSERT", "aspectName": "dataPlatformInstance", "aspect": { @@ -6082,13 +6727,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -6105,7 +6750,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" } ], "fineGrainedLineages": [ @@ -6116,10 +6761,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6128,10 +6773,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6140,10 +6785,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6152,10 +6797,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6164,10 +6809,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6176,10 +6821,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6188,10 +6833,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6200,10 +6845,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6212,10 +6857,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" }, { "upstreamType": "FIELD_SET", @@ -6224,29 +6869,29 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" + "query": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", "changeType": "UPSERT", "aspectName": "queryProperties", "aspect": { "json": { "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_3\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_7\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", "language": "SQL" }, "source": "SYSTEM", @@ -6262,13 +6907,66 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", + "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", + "changeType": "UPSERT", + "aspectName": "querySubjects", + "aspect": { + "json": { + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_10)" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", "changeType": "UPSERT", "aspectName": "dataPlatformInstance", "aspect": { @@ -6278,13 +6976,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -6301,7 +6999,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" } ], "fineGrainedLineages": [ @@ -6312,10 +7010,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6324,10 +7022,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6336,10 +7034,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6348,10 +7046,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6360,10 +7058,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6372,10 +7070,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6384,10 +7082,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6396,10 +7094,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_8)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6408,10 +7106,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_9)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_9)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" }, { "upstreamType": "FIELD_SET", @@ -6420,23 +7118,51 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_10)" ], "confidenceScore": 1.0, - "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + "query": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_8\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1654473600000, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", "changeType": "UPSERT", "aspectName": "querySubjects", "aspect": { @@ -6446,50 +7172,66 @@ "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_9)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_3,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:snowflake" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", "changeType": "UPSERT", "aspectName": "upstreamLineage", "aspect": { @@ -6506,7 +7248,7 @@ }, "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "type": "TRANSFORMED", - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" } ], "fineGrainedLineages": [ @@ -6517,10 +7259,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_1)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_1)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6529,10 +7271,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_2)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_2)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6541,10 +7283,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_3)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_3)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6553,10 +7295,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_4)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_4)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6565,10 +7307,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_5)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_5)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6577,10 +7319,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_6)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_6)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6589,10 +7331,10 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_7)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_7)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" }, { "upstreamType": "FIELD_SET", @@ -6601,214 +7343,53 @@ ], "downstreamType": "FIELD", "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_8)" - ], - "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_9)" - ], - "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" - }, - { - "upstreamType": "FIELD_SET", - "upstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" - ], - "downstreamType": "FIELD", - "downstreams": [ - "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD),col_10)" + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_8)" ], "confidenceScore": 1.0, - "query": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37" - } - ] - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", - "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", - "aspect": { - "json": { - "platform": "urn:li:dataPlatform:snowflake" - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_9)" + ], + "confidenceScore": 1.0, + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_10)" + ], + "confidenceScore": 1.0, + "query": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4" + } + ] } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", + "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", "changeType": "UPSERT", "aspectName": "queryProperties", "aspect": { "json": { "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_6\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_9\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", "language": "SQL" }, "source": "SYSTEM", @@ -6824,58 +7405,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "query", - "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", - "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", - "aspect": { - "json": { - "platform": "urn:li:dataPlatform:snowflake" - } - }, - "systemMetadata": { - "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", - "lastRunId": "no-run-id-provided" - } -}, -{ - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", - "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", - "aspect": { - "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] - } - }, - "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", + "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", "changeType": "UPSERT", "aspectName": "querySubjects", "aspect": { @@ -6885,44 +7421,44 @@ "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_9)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -6938,93 +7474,270 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)", "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", + "aspectName": "upstreamLineage", "aspect": { "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] + "upstreams": [ + { + "auditStamp": { + "time": 1615443388097, + "actor": "urn:li:corpuser:_ingestion" + }, + "created": { + "time": 0, + "actor": "urn:li:corpuser:_ingestion" + }, + "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", + "type": "VIEW", + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_1)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_2)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_3)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_4)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_5)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_6)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_7)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_8)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_9)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_10)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29" + } + ] } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", "changeType": "UPSERT", "aspectName": "queryProperties", "aspect": { "json": { "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_8\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", + "value": "CREATE VIEW view_1 AS\nSELECT\n *\nFROM table_1", "language": "SQL" }, "source": "SYSTEM", "created": { - "time": 1654473600000, + "time": 0, "actor": "urn:li:corpuser:_ingestion" }, "lastModified": { - "time": 1654473600000, + "time": 1738040516852, "actor": "urn:li:corpuser:_ingestion" } } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", + "entityType": "query", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", "changeType": "UPSERT", - "aspectName": "datasetUsageStatistics", + "aspectName": "querySubjects", "aspect": { "json": { - "timestampMillis": 1654473600000, - "eventGranularity": { - "unit": "DAY", - "multiple": 1 - }, - "partitionSpec": { - "partition": "FULL_TABLE_SNAPSHOT", - "type": "FULL_TABLE" - }, - "uniqueUserCount": 0, - "totalSqlQueries": 0, - "topSqlQueries": [], - "userCounts": [], - "fieldCounts": [] + "subjects": [ + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + }, + { + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_1)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_2)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_3)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_4)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_5)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_6)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_7)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_8)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_9)" + }, + { + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_10)" + } + ] } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7032,163 +7745,278 @@ "entityType": "query", "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "statement": { - "value": "CREATE VIEW view_1 AS\nSELECT\n *\nFROM table_1", - "language": "SQL" - }, - "source": "SYSTEM", - "created": { - "time": 0, - "actor": "urn:li:corpuser:_ingestion" - }, - "lastModified": { - "time": 1710193011317, - "actor": "urn:li:corpuser:_ingestion" - } + "platform": "urn:li:dataPlatform:snowflake" } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)", "changeType": "UPSERT", - "aspectName": "querySubjects", + "aspectName": "upstreamLineage", "aspect": { "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, + "upstreams": [ { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)" - }, + "auditStamp": { + "time": 1615443388097, + "actor": "urn:li:corpuser:_ingestion" + }, + "created": { + "time": 0, + "actor": "urn:li:corpuser:_ingestion" + }, + "dataset": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", + "type": "VIEW", + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" + } + ], + "fineGrainedLineages": [ { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_1)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_1)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_2)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_2)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_3)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_3)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_4)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_4)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_5)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_5)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_6)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_6)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_7)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_7)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_8)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_8)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_9)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_9)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD),col_10)" + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_10)" + ], + "confidenceScore": 0.9, + "query": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "query", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", + "changeType": "UPSERT", + "aspectName": "queryProperties", + "aspect": { + "json": { + "statement": { + "value": "CREATE VIEW view_2 AS\nSELECT\n *\nFROM table_2", + "language": "SQL" + }, + "source": "SYSTEM", + "created": { + "time": 0, + "actor": "urn:li:corpuser:_ingestion" + }, + "lastModified": { + "time": 1738040516859, + "actor": "urn:li:corpuser:_ingestion" + } + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", "changeType": "UPSERT", "aspectName": "querySubjects", "aspect": { "json": { "subjects": [ { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" }, { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)" + "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_1)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_1)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_2)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_2)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_3)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_3)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_4)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_4)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_5)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_5)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_6)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_6)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_7)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_7)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_8)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_8)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_9)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_9)" }, { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD),col_10)" + "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_10)" } ] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7204,41 +8032,42 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_9\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", - "language": "SQL" + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 }, - "source": "SYSTEM", - "created": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" }, - "lastModified": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - } + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)", "changeType": "UPSERT", "aspectName": "datasetUsageStatistics", "aspect": { @@ -7260,77 +8089,66 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "platform": "urn:li:dataPlatform:snowflake" + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_22-10_26_30", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_1,PROD)", "changeType": "UPSERT", - "aspectName": "querySubjects", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_6)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_7)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_8)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_9)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD),col_10)" - } - ] + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7358,36 +8176,37 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_8,PROD)", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "statement": { - "value": "INSERT INTO TEST_DB.TEST_SCHEMA.TABLE_7\nSELECT\n *\nFROM TEST_DB.TEST_SCHEMA.TABLE_2", - "language": "SQL" + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 }, - "source": "SYSTEM", - "created": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" }, - "lastModified": { - "time": 1654473600000, - "actor": "urn:li:corpuser:_ingestion" - } + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7415,178 +8234,159 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_10,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetUsageStatistics", + "aspect": { + "json": { + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_4,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetUsageStatistics", + "aspect": { + "json": { + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_6,PROD)", "changeType": "UPSERT", - "aspectName": "queryProperties", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "statement": { - "value": "CREATE VIEW view_2 AS\nSELECT\n *\nFROM table_2", - "language": "SQL" + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 }, - "source": "SYSTEM", - "created": { - "time": 0, - "actor": "urn:li:corpuser:_ingestion" + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" }, - "lastModified": { - "time": 1710193011336, - "actor": "urn:li:corpuser:_ingestion" - } + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_11-14_36_03", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", "changeType": "UPSERT", - "aspectName": "querySubjects", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_6)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_7)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_8)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_9)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_7,PROD),col_10)" - } - ] + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)", "changeType": "UPSERT", - "aspectName": "querySubjects", + "aspectName": "datasetUsageStatistics", "aspect": { "json": { - "subjects": [ - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_6)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_10)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_7)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_9)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_2,PROD),col_8)" - }, - { - "entity": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_1)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_2)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_3)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_4)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_5)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_6)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_7)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_8)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_9)" - }, - { - "entity": "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD),col_10)" - } - ] + "timestampMillis": 1654473600000, + "eventGranularity": { + "unit": "DAY", + "multiple": 1 + }, + "partitionSpec": { + "partition": "FULL_TABLE_SNAPSHOT", + "type": "FULL_TABLE" + }, + "uniqueUserCount": 0, + "totalSqlQueries": 0, + "topSqlQueries": [], + "userCounts": [], + "fieldCounts": [] } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_07_09-14_45_18", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_5,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.table_9,PROD)", "changeType": "UPSERT", "aspectName": "datasetUsageStatistics", "aspect": { @@ -7608,8 +8408,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7620,7 +8420,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7631,8 +8431,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7643,7 +8443,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7654,8 +8454,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7666,7 +8466,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7677,8 +8477,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7689,7 +8489,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7700,8 +8500,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7712,7 +8512,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7723,8 +8523,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7735,7 +8535,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7746,8 +8546,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7758,7 +8558,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7769,8 +8569,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7781,7 +8581,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7792,8 +8592,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7804,7 +8604,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7815,8 +8615,8 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -7827,7 +8627,7 @@ "aspectName": "operation", "aspect": { "json": { - "timestampMillis": 1654621200000, + "timestampMillis": 1615443388097, "partitionSpec": { "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" @@ -7838,14 +8638,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "tag", - "entityUrn": "urn:li:tag:other_db.other_schema.my_other_tag:other", + "entityType": "query", + "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7854,14 +8654,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "tag", - "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_0:my_value_0", + "entityType": "query", + "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7870,14 +8670,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "tag", - "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_1:my_value_1", + "entityType": "query", + "entityUrn": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7886,14 +8686,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "tag", - "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_2:my_value_2", + "entityType": "query", + "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7902,14 +8702,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "tag", - "entityUrn": "urn:li:tag:test_db.test_schema.security:pii", + "entityType": "query", + "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7918,14 +8718,14 @@ } }, "systemMetadata": { - "lastObserved": 1654621200000, - "runId": "snowflake-2022_06_07-17_00_00", + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:973d404f0f5a9e2d5df165087f03a01fa182a04ffbcab14228c831070ade02c2", + "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7935,13 +8735,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:ac812b1b491a3d141f66050526c1ee2483b19083ad840ceced0ca39ace552e01", + "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7951,13 +8751,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", + "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7967,13 +8767,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:bfe6b2ec9f81445aae23bc757f90defb69480689f55d7e63c11f0da6a60fff12", + "entityUrn": "urn:li:query:d37a930ca6d2dd7100fd81bbf3d96a8cfe9f30e3469de363650d7e3146c3e4e8", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7983,13 +8783,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:a79e59b5f5248b9247f88eaecbe3a296f788634282edc9cdca80ba1bfb504f37", + "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -7999,13 +8799,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:1d69efa7115792a07468c8b3846a4c0b3ba8620c1f2263374c2efbb2e56e6200", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8015,13 +8815,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "query", - "entityUrn": "urn:li:query:84b52a9ad9d198587fbc4e210812011da567bd505381aa7ff437f243366873e9", + "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8031,13 +8831,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:62c3a7585398b147daace630104bf0827b366353152667718a84d22542f5aee4", + "entityType": "tag", + "entityUrn": "urn:li:tag:other_db.other_schema.my_other_tag:other", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8047,13 +8847,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_2%2CPROD%29", + "entityType": "tag", + "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_0:my_value_0", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8063,13 +8863,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:e093b2691b3cb33b6451367d1baa472eabe3b9a38fbd30152b12f22c35acc632", + "entityType": "tag", + "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_1:my_value_1", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8079,13 +8879,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:aec91b63e3ce03877b9d80dc77b915880fc2a5f8f3b5cdf66e9341830268776b", + "entityType": "tag", + "entityUrn": "urn:li:tag:test_db.test_schema.my_tag_2:my_value_2", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8095,13 +8895,13 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { - "entityType": "query", - "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", + "entityType": "tag", + "entityUrn": "urn:li:tag:test_db.test_schema.security:pii", "changeType": "UPSERT", "aspectName": "status", "aspect": { @@ -8111,7 +8911,7 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_03_01-16_29_41", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, @@ -8127,39 +8927,39 @@ }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_04_15-12_58_22", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "glossaryTerm", - "entityUrn": "urn:li:glossaryTerm:Email_Address", + "entityUrn": "urn:li:glossaryTerm:CloudRegion", "changeType": "UPSERT", "aspectName": "glossaryTermKey", "aspect": { "json": { - "name": "Email_Address" + "name": "CloudRegion" } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_04_15-12_58_22", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } }, { "entityType": "glossaryTerm", - "entityUrn": "urn:li:glossaryTerm:CloudRegion", + "entityUrn": "urn:li:glossaryTerm:Email_Address", "changeType": "UPSERT", "aspectName": "glossaryTermKey", "aspect": { "json": { - "name": "CloudRegion" + "name": "Email_Address" } }, "systemMetadata": { "lastObserved": 1615443388097, - "runId": "snowflake-2024_04_15-12_58_22", + "runId": "snowflake-2025_01_28-00_01_52-5vkne0", "lastRunId": "no-run-id-provided" } } diff --git a/metadata-ingestion/tests/integration/snowflake/snowflake_privatelink_golden.json b/metadata-ingestion/tests/integration/snowflake/snowflake_privatelink_golden.json index f22cbd122361dc..87eca14c7655eb 100644 --- a/metadata-ingestion/tests/integration/snowflake/snowflake_privatelink_golden.json +++ b/metadata-ingestion/tests/integration/snowflake/snowflake_privatelink_golden.json @@ -4101,6 +4101,22 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "dataset", "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.view_2,PROD)", @@ -4117,6 +4133,344 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "test_db.test_schema.stream_1", + "platform": "urn:li:dataPlatform:snowflake", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.MySqlDDL": { + "tableSchema": "" + } + }, + "fields": [ + { + "fieldPath": "col_1", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_2", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_3", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_4", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_5", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_6", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_7", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_8", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_9", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_10", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$action", + "nullable": false, + "description": "Type of DML operation (INSERT/DELETE)", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(10)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$isupdate", + "nullable": false, + "description": "Whether row is from UPDATE operation", + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "BOOLEAN", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$row_id", + "nullable": false, + "description": "Unique row identifier", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:eac598ee71ef1b5e24448d650c08aa5f" + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:snowflake", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:snowflake,instance1)" + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "PATCH", + "aspectName": "datasetProperties", + "aspect": { + "json": [ + { + "op": "add", + "path": "/name", + "value": "STREAM_1" + }, + { + "op": "add", + "path": "/description", + "value": "Comment for Stream 1" + }, + { + "op": "add", + "path": "/created", + "value": { + "time": 1623110400000 + } + }, + { + "op": "add", + "path": "/lastModified", + "value": { + "time": 1623110400000 + } + }, + { + "op": "add", + "path": "/qualifiedName", + "value": "TEST_DB.TEST_SCHEMA.STREAM_1" + }, + { + "op": "add", + "path": "/customProperties/SOURCE_TYPE", + "value": "Table" + }, + { + "op": "add", + "path": "/customProperties/TYPE", + "value": "DELTA" + }, + { + "op": "add", + "path": "/customProperties/STALE", + "value": "false" + }, + { + "op": "add", + "path": "/customProperties/MODE", + "value": "DEFAULT" + }, + { + "op": "add", + "path": "/customProperties/OWNER_ROLE_TYPE", + "value": "ROLE" + }, + { + "op": "add", + "path": "/customProperties/TABLE_NAME", + "value": "TEST_DB.TEST_SCHEMA.TABLE_1" + }, + { + "op": "add", + "path": "/customProperties/BASE_TABLES", + "value": "TEST_DB.TEST_SCHEMA.TABLE_1" + }, + { + "op": "add", + "path": "/customProperties/STALE_AFTER", + "value": "2021-06-22T00:00:00+00:00" + } + ] + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-ftc9zc", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "json": { + "typeNames": [ + "Snowflake Stream" + ] + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "query", "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Cinstance1.test_db.test_schema.view_1%2CPROD%29", @@ -4396,6 +4750,35 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,instance1.test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:snowflake,instance1)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:snowflake,instance1)" + }, + { + "id": "urn:li:container:900b1327253068cb1537b1b3c807ddab", + "urn": "urn:li:container:900b1327253068cb1537b1b3c807ddab" + }, + { + "id": "urn:li:container:eac598ee71ef1b5e24448d650c08aa5f", + "urn": "urn:li:container:eac598ee71ef1b5e24448d650c08aa5f" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1654621200000, + "runId": "snowflake-2022_06_07-17_00_00-foacth", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "query", "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Cinstance1.test_db.test_schema.view_2%2CPROD%29", diff --git a/metadata-ingestion/tests/integration/snowflake/snowflake_structured_properties_golden.json b/metadata-ingestion/tests/integration/snowflake/snowflake_structured_properties_golden.json index 3adedd59070396..559856e1f654b3 100644 --- a/metadata-ingestion/tests/integration/snowflake/snowflake_structured_properties_golden.json +++ b/metadata-ingestion/tests/integration/snowflake/snowflake_structured_properties_golden.json @@ -3729,6 +3729,22 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_16-14_38_38-5znjnn", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "dataset", "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_1,PROD)", @@ -3881,6 +3897,279 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "test_db.test_schema.stream_1", + "platform": "urn:li:dataPlatform:snowflake", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.MySqlDDL": { + "tableSchema": "" + } + }, + "fields": [ + { + "fieldPath": "col_1", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_2", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_3", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_4", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_5", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_6", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_7", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_8", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_9", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "col_10", + "nullable": false, + "description": "Comment for column", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(255)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$action", + "nullable": false, + "description": "Type of DML operation (INSERT/DELETE)", + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "VARCHAR(10)", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$isupdate", + "nullable": false, + "description": "Whether row is from UPDATE operation", + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "BOOLEAN", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "metadata$row_id", + "nullable": false, + "description": "Unique row identifier", + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "NUMBER(38,0)", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_16-14_38_38-5znjnn", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_16-14_38_38-5znjnn", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "json": { + "typeNames": [ + "Snowflake Stream" + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_16-14_38_38-5znjnn", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": { + "SOURCE_TYPE": "Table", + "TYPE": "DELTA", + "STALE": "false", + "MODE": "DEFAULT", + "OWNER_ROLE_TYPE": "ROLE", + "TABLE_NAME": "TEST_DB.TEST_SCHEMA.TABLE_1", + "BASE_TABLES": "TEST_DB.TEST_SCHEMA.TABLE_1", + "STALE_AFTER": "2021-06-22T00:00:00+00:00" + }, + "externalUrl": "https://app.snowflake.com/ap-south-1.aws/abc12345/#/data/databases/TEST_DB/schemas/TEST_SCHEMA/view/STREAM_1/", + "name": "STREAM_1", + "qualifiedName": "TEST_DB.TEST_SCHEMA.STREAM_1", + "description": "Comment for Stream 1", + "created": { + "time": 1623110400000 + }, + "lastModified": { + "time": 1623110400000 + }, + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_17-13_30_28-vz7bmd", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "query", "entityUrn": "urn:li:query:view_urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Asnowflake%2Ctest_db.test_schema.view_1%2CPROD%29", @@ -4008,6 +4297,31 @@ "lastRunId": "no-run-id-provided" } }, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.stream_1,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:container:5e359958be02ce647cd9ac196dbd4585", + "urn": "urn:li:container:5e359958be02ce647cd9ac196dbd4585" + }, + { + "id": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c", + "urn": "urn:li:container:94c696a054bab40b73e640a7f82e3b1c" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "snowflake-2025_01_16-14_38_38-5znjnn", + "lastRunId": "no-run-id-provided" + } +}, { "entityType": "dataset", "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:snowflake,test_db.test_schema.view_2,PROD)", diff --git a/metadata-ingestion/tests/integration/snowflake/test_snowflake.py b/metadata-ingestion/tests/integration/snowflake/test_snowflake.py index 340b771b76e310..33ba6d162cba2b 100644 --- a/metadata-ingestion/tests/integration/snowflake/test_snowflake.py +++ b/metadata-ingestion/tests/integration/snowflake/test_snowflake.py @@ -180,7 +180,8 @@ def test_snowflake_basic(pytestconfig, tmp_path, mock_time, mock_datahub_graph): cache_info = report.data_dictionary_cache.as_obj() assert cache_info["get_tables_for_database"]["misses"] == 1 assert cache_info["get_views_for_database"]["misses"] == 1 - assert cache_info["get_columns_for_schema"]["misses"] == 1 + # When streams query specific tables, the query will not be cached resulting in 2 cache misses + assert cache_info["get_columns_for_schema"]["misses"] == 2 assert cache_info["get_pk_constraints_for_schema"]["misses"] == 1 assert cache_info["get_fk_constraints_for_schema"]["misses"] == 1 diff --git a/metadata-ingestion/tests/integration/snowflake/test_snowflake_failures.py b/metadata-ingestion/tests/integration/snowflake/test_snowflake_failures.py index 4cb6cec4906efa..808734c13801ec 100644 --- a/metadata-ingestion/tests/integration/snowflake/test_snowflake_failures.py +++ b/metadata-ingestion/tests/integration/snowflake/test_snowflake_failures.py @@ -143,12 +143,16 @@ def test_snowflake_no_tables_causes_pipeline_failure( [SnowflakeQuery.tables_for_schema("TEST_SCHEMA", "TEST_DB")], [], ) - sf_cursor.execute.side_effect = query_permission_response_override( + no_views_fn = query_permission_response_override( no_tables_fn, [SnowflakeQuery.show_views_for_database("TEST_DB")], [], ) - + sf_cursor.execute.side_effect = query_permission_response_override( + no_views_fn, + [SnowflakeQuery.streams_for_database("TEST_DB")], + [], + ) pipeline = Pipeline(snowflake_pipeline_config) pipeline.run() assert "permission-error" in [ From 32b654ce20edaedf581983a87889297aa71ad374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez=20Villamor?= Date: Wed, 5 Feb 2025 11:27:48 +0100 Subject: [PATCH 02/13] feat(powerbi): Report to Dashboard lineage (#12451) --- .../ingestion/source/powerbi/config.py | 1 + .../ingestion/source/powerbi/powerbi.py | 31 +++- .../powerbi/rest_api_wrapper/data_classes.py | 8 +- .../powerbi/rest_api_wrapper/data_resolver.py | 47 ++---- .../powerbi/rest_api_wrapper/powerbi_api.py | 21 ++- .../golden_test_admin_access_not_allowed.json | 5 +- .../integration/powerbi/golden_test_cll.json | 5 +- .../powerbi/golden_test_container.json | 142 ++++++++++-------- .../golden_test_disabled_ownership.json | 5 +- .../powerbi/golden_test_endorsement.json | 5 +- .../powerbi/golden_test_ingest.json | 5 +- .../golden_test_ingest_patch_disabled.json | 5 +- .../powerbi/golden_test_lineage.json | 5 +- .../golden_test_lower_case_urn_ingest.json | 5 +- .../golden_test_platform_instance_ingest.json | 5 +- .../powerbi/golden_test_report.json | 14 +- .../golden_test_scan_all_workspaces.json | 5 +- ...lden_test_server_to_platform_instance.json | 5 +- .../mock_data/default_mock_response.json | 3 +- .../tests/integration/powerbi/test_powerbi.py | 4 +- 20 files changed, 188 insertions(+), 138 deletions(-) diff --git a/metadata-ingestion/src/datahub/ingestion/source/powerbi/config.py b/metadata-ingestion/src/datahub/ingestion/source/powerbi/config.py index 9692eca4176fad..83d3336644d001 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/powerbi/config.py +++ b/metadata-ingestion/src/datahub/ingestion/source/powerbi/config.py @@ -132,6 +132,7 @@ class Constant: ACTIVE = "Active" SQL_PARSING_FAILURE = "SQL Parsing Failure" M_QUERY_NULL = '"null"' + REPORT_WEB_URL = "reportWebUrl" @dataclass diff --git a/metadata-ingestion/src/datahub/ingestion/source/powerbi/powerbi.py b/metadata-ingestion/src/datahub/ingestion/source/powerbi/powerbi.py index 89184d37569ffc..4342be1448b299 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/powerbi/powerbi.py +++ b/metadata-ingestion/src/datahub/ingestion/source/powerbi/powerbi.py @@ -582,8 +582,11 @@ def tile_custom_properties(tile: powerbi_data_classes.Tile) -> dict: if tile.dataset is not None and tile.dataset.webUrl is not None: custom_properties[Constant.DATASET_WEB_URL] = tile.dataset.webUrl - if tile.report is not None and tile.report.id is not None: - custom_properties[Constant.REPORT_ID] = tile.report.id + if tile.report_id is not None: + custom_properties[Constant.REPORT_ID] = tile.report_id + + if tile.report is not None and tile.report.webUrl is not None: + custom_properties[Constant.REPORT_WEB_URL] = tile.report.webUrl return custom_properties @@ -1053,6 +1056,7 @@ def report_to_dashboard( report: powerbi_data_classes.Report, chart_mcps: List[MetadataChangeProposalWrapper], user_mcps: List[MetadataChangeProposalWrapper], + dashboard_edges: List[EdgeClass], ) -> List[MetadataChangeProposalWrapper]: """ Map PowerBi report to Datahub dashboard @@ -1074,6 +1078,7 @@ def report_to_dashboard( charts=chart_urn_list, lastModified=ChangeAuditStamps(), dashboardUrl=report.webUrl, + dashboards=dashboard_edges, ) info_mcp = self.new_mcp( @@ -1167,8 +1172,28 @@ def report_to_datahub_work_units( ds_mcps = self.to_datahub_dataset(report.dataset, workspace) chart_mcps = self.pages_to_chart(report.pages, workspace, ds_mcps) + # find all dashboards with a Tile referencing this report + downstream_dashboards_edges = [] + for d in workspace.dashboards.values(): + if any(t.report_id == report.id for t in d.tiles): + dashboard_urn = builder.make_dashboard_urn( + platform=self.__config.platform_name, + platform_instance=self.__config.platform_instance, + name=d.get_urn_part(), + ) + edge = EdgeClass( + destinationUrn=dashboard_urn, + sourceUrn=None, + created=None, + lastModified=None, + properties=None, + ) + downstream_dashboards_edges.append(edge) + # Let's convert report to datahub dashboard - report_mcps = self.report_to_dashboard(workspace, report, chart_mcps, user_mcps) + report_mcps = self.report_to_dashboard( + workspace, report, chart_mcps, user_mcps, downstream_dashboards_edges + ) # Now add MCPs in sequence mcps.extend(ds_mcps) diff --git a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_classes.py b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_classes.py index f3e968896b3c96..a5ee6e7bc60aaf 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_classes.py +++ b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_classes.py @@ -286,11 +286,15 @@ class CreatedFrom(Enum): id: str title: str embedUrl: str - dataset: Optional["PowerBIDataset"] dataset_id: Optional[str] - report: Optional[Report] + report_id: Optional[str] createdFrom: CreatedFrom + # In a first pass, `dataset_id` and/or `report_id` are filled in. + # In a subsequent pass, the objects are populated. + dataset: Optional["PowerBIDataset"] + report: Optional[Report] + def get_urn_part(self): return f"charts.{self.id}" diff --git a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_resolver.py b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_resolver.py index 927840c44bf0b0..d98f4abc296778 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_resolver.py +++ b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/data_resolver.py @@ -337,41 +337,6 @@ def get_tiles(self, workspace: Workspace, dashboard: Dashboard) -> List[Tile]: -tiles), there is no information available on pagination """ - - def new_dataset_or_report(tile_instance: Any) -> dict: - """ - Find out which is the data source for tile. It is either REPORT or DATASET - """ - report_fields = { - Constant.REPORT: ( - self.get_report( - workspace=workspace, - report_id=tile_instance.get(Constant.REPORT_ID), - ) - if tile_instance.get(Constant.REPORT_ID) is not None - else None - ), - Constant.CREATED_FROM: Tile.CreatedFrom.UNKNOWN, - } - - # reportId and datasetId are exclusive in tile_instance - # if datasetId is present that means tile is created from dataset - # if reportId is present that means tile is created from report - # if both i.e. reportId and datasetId are not present then tile is created from some visualization - if tile_instance.get(Constant.REPORT_ID) is not None: - report_fields[Constant.CREATED_FROM] = Tile.CreatedFrom.REPORT - elif tile_instance.get(Constant.DATASET_ID) is not None: - report_fields[Constant.CREATED_FROM] = Tile.CreatedFrom.DATASET - else: - report_fields[Constant.CREATED_FROM] = Tile.CreatedFrom.VISUALIZATION - - title: Optional[str] = tile_instance.get(Constant.TITLE) - _id: Optional[str] = tile_instance.get(Constant.ID) - created_from: Any = report_fields[Constant.CREATED_FROM] - logger.info(f"Tile {title}({_id}) is created from {created_from}") - - return report_fields - tile_list_endpoint: str = self.get_tiles_endpoint( workspace, dashboard_id=dashboard.id ) @@ -393,8 +358,18 @@ def new_dataset_or_report(tile_instance: Any) -> dict: title=instance.get(Constant.TITLE), embedUrl=instance.get(Constant.EMBED_URL), dataset_id=instance.get(Constant.DATASET_ID), + report_id=instance.get(Constant.REPORT_ID), dataset=None, - **new_dataset_or_report(instance), + report=None, + createdFrom=( + # In the past we considered that only one of the two report_id or dataset_id would be present + # but we have seen cases where both are present. If both are present, we prioritize the report. + Tile.CreatedFrom.REPORT + if instance.get(Constant.REPORT_ID) + else Tile.CreatedFrom.DATASET + if instance.get(Constant.DATASET_ID) + else Tile.CreatedFrom.VISUALIZATION + ), ) for instance in tile_dict if instance is not None diff --git a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py index 93d734652f0ff1..efc6ea5b30b335 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py +++ b/metadata-ingestion/src/datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py @@ -625,13 +625,26 @@ def fill_dashboards() -> None: dashboard.tiles = self._get_resolver().get_tiles( workspace, dashboard=dashboard ) - # set the dataset for tiles + # set the dataset and the report for tiles for tile in dashboard.tiles: + # In Power BI, dashboards, reports, and datasets are tightly scoped to the workspace they belong to. + # https://learn.microsoft.com/en-us/power-bi/collaborate-share/service-new-workspaces + if tile.report_id: + tile.report = workspace.reports.get(tile.report_id) + if tile.report is None: + self.reporter.info( + title="Missing Report Lineage For Tile", + message="A Report reference that failed to be resolved. Please ensure that 'extract_reports' is set to True in the configuration.", + context=f"workspace-name: {workspace.name}, tile-name: {tile.title}, report-id: {tile.report_id}", + ) + # However, semantic models (aka datasets) can be shared accross workspaces + # https://learn.microsoft.com/en-us/fabric/admin/portal-workspace#use-semantic-models-across-workspaces + # That's why the global 'dataset_registry' is required if tile.dataset_id: tile.dataset = self.dataset_registry.get(tile.dataset_id) if tile.dataset is None: self.reporter.info( - title="Missing Lineage For Tile", + title="Missing Dataset Lineage For Tile", message="A cross-workspace reference that failed to be resolved. Please ensure that no global workspace is being filtered out due to the workspace_id_pattern.", context=f"workspace-name: {workspace.name}, tile-name: {tile.title}, dataset-id: {tile.dataset_id}", ) @@ -653,10 +666,10 @@ def fill_dashboard_tags() -> None: for dashboard in workspace.dashboards.values(): dashboard.tags = workspace.dashboard_endorsements.get(dashboard.id, []) + # fill reports first since some dashboard may reference a report + fill_reports() if self.__config.extract_dashboards: fill_dashboards() - - fill_reports() fill_dashboard_tags() self._fill_independent_datasets(workspace=workspace) diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_admin_access_not_allowed.json b/metadata-ingestion/tests/integration/powerbi/golden_test_admin_access_not_allowed.json index 1394a140b0a245..6604883f8bd7ca 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_admin_access_not_allowed.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_admin_access_not_allowed.json @@ -39,8 +39,9 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", - "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445" + "createdFrom": "Report", + "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_cll.json b/metadata-ingestion/tests/integration/powerbi/golden_test_cll.json index 5881ad5de0bcb8..96413ffeebc940 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_cll.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_cll.json @@ -81,9 +81,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_container.json b/metadata-ingestion/tests/integration/powerbi/golden_test_container.json index 50058405a7aec5..87fb8e5a4f0d87 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_container.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_container.json @@ -92,14 +92,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "containerProperties", + "aspectName": "container", "aspect": { "json": { - "customProperties": { - "platform": "powerbi", - "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" - }, - "name": "library-dataset" + "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" } }, "systemMetadata": { @@ -112,10 +108,14 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "status", + "aspectName": "containerProperties", "aspect": { "json": { - "removed": false + "customProperties": { + "platform": "powerbi", + "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" + }, + "name": "library-dataset" } }, "systemMetadata": { @@ -128,10 +128,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", + "aspectName": "status", "aspect": { "json": { - "platform": "urn:li:dataPlatform:powerbi" + "removed": false } }, "systemMetadata": { @@ -144,12 +144,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "subTypes", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "typeNames": [ - "Semantic Model" - ] + "platform": "urn:li:dataPlatform:powerbi" } }, "systemMetadata": { @@ -162,10 +160,12 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "container", + "aspectName": "subTypes", "aspect": { "json": { - "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" + "typeNames": [ + "Semantic Model" + ] } }, "systemMetadata": { @@ -1004,14 +1004,10 @@ "entityType": "container", "entityUrn": "urn:li:container:977b804137a1d2bf897ff1bbf440a1cc", "changeType": "UPSERT", - "aspectName": "containerProperties", + "aspectName": "container", "aspect": { "json": { - "customProperties": { - "platform": "powerbi", - "dataset": "ba0130a1-5b03-40de-9535-b34e778ea6ed" - }, - "name": "hr_pbi_test" + "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" } }, "systemMetadata": { @@ -1024,10 +1020,14 @@ "entityType": "container", "entityUrn": "urn:li:container:977b804137a1d2bf897ff1bbf440a1cc", "changeType": "UPSERT", - "aspectName": "status", + "aspectName": "containerProperties", "aspect": { "json": { - "removed": false + "customProperties": { + "platform": "powerbi", + "dataset": "ba0130a1-5b03-40de-9535-b34e778ea6ed" + }, + "name": "hr_pbi_test" } }, "systemMetadata": { @@ -1040,10 +1040,10 @@ "entityType": "container", "entityUrn": "urn:li:container:977b804137a1d2bf897ff1bbf440a1cc", "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", + "aspectName": "status", "aspect": { "json": { - "platform": "urn:li:dataPlatform:powerbi" + "removed": false } }, "systemMetadata": { @@ -1056,12 +1056,10 @@ "entityType": "container", "entityUrn": "urn:li:container:977b804137a1d2bf897ff1bbf440a1cc", "changeType": "UPSERT", - "aspectName": "subTypes", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "typeNames": [ - "Semantic Model" - ] + "platform": "urn:li:dataPlatform:powerbi" } }, "systemMetadata": { @@ -1074,10 +1072,12 @@ "entityType": "container", "entityUrn": "urn:li:container:977b804137a1d2bf897ff1bbf440a1cc", "changeType": "UPSERT", - "aspectName": "container", + "aspectName": "subTypes", "aspect": { "json": { - "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" + "typeNames": [ + "Semantic Model" + ] } }, "systemMetadata": { @@ -1377,10 +1377,13 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715", + "reportWebUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715" }, + "externalUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715", "title": "test_tile", "description": "test_tile", "lastModified": { @@ -1867,14 +1870,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "containerProperties", + "aspectName": "container", "aspect": { "json": { - "customProperties": { - "platform": "powerbi", - "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" - }, - "name": "library-dataset" + "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" } }, "systemMetadata": { @@ -1887,10 +1886,14 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "status", + "aspectName": "containerProperties", "aspect": { "json": { - "removed": false + "customProperties": { + "platform": "powerbi", + "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" + }, + "name": "library-dataset" } }, "systemMetadata": { @@ -1903,10 +1906,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", + "aspectName": "status", "aspect": { "json": { - "platform": "urn:li:dataPlatform:powerbi" + "removed": false } }, "systemMetadata": { @@ -1919,12 +1922,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "subTypes", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "typeNames": [ - "Semantic Model" - ] + "platform": "urn:li:dataPlatform:powerbi" } }, "systemMetadata": { @@ -1937,10 +1938,12 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "container", + "aspectName": "subTypes", "aspect": { "json": { - "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" + "typeNames": [ + "Semantic Model" + ] } }, "systemMetadata": { @@ -2945,6 +2948,13 @@ "path": "/dashboardUrl", "value": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715" }, + { + "op": "add", + "path": "/dashboards/urn:li:dashboard:(powerbi,dashboards.7D668CAD-7FFC-4505-9215-655BCA5BEBAE)", + "value": { + "destinationUrn": "urn:li:dashboard:(powerbi,dashboards.7D668CAD-7FFC-4505-9215-655BCA5BEBAE)" + } + }, { "op": "add", "path": "/lastModified", @@ -3089,14 +3099,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "containerProperties", + "aspectName": "container", "aspect": { "json": { - "customProperties": { - "platform": "powerbi", - "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" - }, - "name": "library-dataset" + "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" } }, "systemMetadata": { @@ -3109,10 +3115,14 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "status", + "aspectName": "containerProperties", "aspect": { "json": { - "removed": false + "customProperties": { + "platform": "powerbi", + "dataset": "05169CD2-E713-41E6-9600-1D8066D95445" + }, + "name": "library-dataset" } }, "systemMetadata": { @@ -3125,10 +3135,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "dataPlatformInstance", + "aspectName": "status", "aspect": { "json": { - "platform": "urn:li:dataPlatform:powerbi" + "removed": false } }, "systemMetadata": { @@ -3141,12 +3151,10 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "subTypes", + "aspectName": "dataPlatformInstance", "aspect": { "json": { - "typeNames": [ - "Semantic Model" - ] + "platform": "urn:li:dataPlatform:powerbi" } }, "systemMetadata": { @@ -3159,10 +3167,12 @@ "entityType": "container", "entityUrn": "urn:li:container:6ac0662f0f2fc3a9196ac505da2182b2", "changeType": "UPSERT", - "aspectName": "container", + "aspectName": "subTypes", "aspect": { "json": { - "container": "urn:li:container:a4ed52f9abd3ff9cc34960c0c41f72e9" + "typeNames": [ + "Semantic Model" + ] } }, "systemMetadata": { diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_disabled_ownership.json b/metadata-ingestion/tests/integration/powerbi/golden_test_disabled_ownership.json index 099f75a190ca26..3cd79437ee528f 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_disabled_ownership.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_disabled_ownership.json @@ -410,9 +410,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_endorsement.json b/metadata-ingestion/tests/integration/powerbi/golden_test_endorsement.json index 07bb4f9aaad44c..a126a9bb67dbe1 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_endorsement.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_endorsement.json @@ -526,9 +526,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_ingest.json b/metadata-ingestion/tests/integration/powerbi/golden_test_ingest.json index 4bbd2e2b06542c..33c6f2c1e5e3c0 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_ingest.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_ingest.json @@ -432,9 +432,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_ingest_patch_disabled.json b/metadata-ingestion/tests/integration/powerbi/golden_test_ingest_patch_disabled.json index a943472f307e5c..f76c3ecfdecf03 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_ingest_patch_disabled.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_ingest_patch_disabled.json @@ -432,9 +432,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_lineage.json b/metadata-ingestion/tests/integration/powerbi/golden_test_lineage.json index df56bdc45db762..49da7c7eeb4dfd 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_lineage.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_lineage.json @@ -516,9 +516,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_lower_case_urn_ingest.json b/metadata-ingestion/tests/integration/powerbi/golden_test_lower_case_urn_ingest.json index 4c27dec3c67520..f96841a71e6c88 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_lower_case_urn_ingest.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_lower_case_urn_ingest.json @@ -173,9 +173,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_platform_instance_ingest.json b/metadata-ingestion/tests/integration/powerbi/golden_test_platform_instance_ingest.json index b2ec0f7a67a969..c4a4fc6cc24bd2 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_platform_instance_ingest.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_platform_instance_ingest.json @@ -718,9 +718,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_report.json b/metadata-ingestion/tests/integration/powerbi/golden_test_report.json index 1805272b84d486..8f0e9eab428979 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_report.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_report.json @@ -705,10 +705,13 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715", + "reportWebUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715" }, + "externalUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715", "title": "test_tile", "description": "test_tile", "lastModified": { @@ -1990,6 +1993,13 @@ "path": "/dashboardUrl", "value": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715" }, + { + "op": "add", + "path": "/dashboards/urn:li:dashboard:(powerbi,dashboards.7D668CAD-7FFC-4505-9215-655BCA5BEBAE)", + "value": { + "destinationUrn": "urn:li:dashboard:(powerbi,dashboards.7D668CAD-7FFC-4505-9215-655BCA5BEBAE)" + } + }, { "op": "add", "path": "/lastModified", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_scan_all_workspaces.json b/metadata-ingestion/tests/integration/powerbi/golden_test_scan_all_workspaces.json index bc0feef4a127d3..36afe746e94333 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_scan_all_workspaces.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_scan_all_workspaces.json @@ -25,9 +25,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/golden_test_server_to_platform_instance.json b/metadata-ingestion/tests/integration/powerbi/golden_test_server_to_platform_instance.json index bcf7b76285110a..ea4c39e56aaa99 100644 --- a/metadata-ingestion/tests/integration/powerbi/golden_test_server_to_platform_instance.json +++ b/metadata-ingestion/tests/integration/powerbi/golden_test_server_to_platform_instance.json @@ -516,9 +516,10 @@ "aspect": { "json": { "customProperties": { - "createdFrom": "Dataset", + "createdFrom": "Report", "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", - "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details" + "datasetWebUrl": "http://localhost/groups/64ED5CAD-7C10-4684-8180-826122881108/datasets/05169CD2-E713-41E6-9600-1D8066D95445/details", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, "title": "test_tile", "description": "test_tile", diff --git a/metadata-ingestion/tests/integration/powerbi/mock_data/default_mock_response.json b/metadata-ingestion/tests/integration/powerbi/mock_data/default_mock_response.json index 28972fbded9e82..a9fad07478d4cb 100644 --- a/metadata-ingestion/tests/integration/powerbi/mock_data/default_mock_response.json +++ b/metadata-ingestion/tests/integration/powerbi/mock_data/default_mock_response.json @@ -149,7 +149,8 @@ "id": "B8E293DC-0C83-4AA0-9BB9-0A8738DF24A0", "title": "test_tile", "embedUrl": "https://localhost/tiles/embed/1", - "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445" + "datasetId": "05169CD2-E713-41E6-9600-1D8066D95445", + "reportId": "5b218778-e7a5-4d73-8187-f10824047715" }, { "id": "23212598-23b5-4980-87cc-5fc0ecd84385", diff --git a/metadata-ingestion/tests/integration/powerbi/test_powerbi.py b/metadata-ingestion/tests/integration/powerbi/test_powerbi.py index 571c0092dcc8c1..2179e94af358b1 100644 --- a/metadata-ingestion/tests/integration/powerbi/test_powerbi.py +++ b/metadata-ingestion/tests/integration/powerbi/test_powerbi.py @@ -1440,12 +1440,12 @@ def test_powerbi_cross_workspace_reference_info_message( is_entry_present: bool = False # Printing INFO entries for entry in info_entries.values(): - if entry.title == "Missing Lineage For Tile": + if entry.title == "Missing Dataset Lineage For Tile": is_entry_present = True break assert is_entry_present, ( - 'Info message "Missing Lineage For Tile" should be present in reporter' + 'Info message "Missing Dataset Lineage For Tile" should be present in reporter' ) test_resources_dir = pytestconfig.rootpath / "tests/integration/powerbi" From 66bce0d9f1c13d115e7c9c1436e63e78fd0a720f Mon Sep 17 00:00:00 2001 From: david-leifker <114954101+david-leifker@users.noreply.github.com> Date: Wed, 5 Feb 2025 08:36:34 -0600 Subject: [PATCH 03/13] fix(no-rows-updated): fix no rows updated (#12530) --- .../metadata/entity/EntityServiceImpl.java | 12 +- .../entity/EbeanEntityServiceTest.java | 115 ++++++++++++++++-- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java index 2cefb40dbaa3c2..79894d603b5860 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java @@ -1031,7 +1031,17 @@ This condition is specifically for an older conditional write ingestAspectIfNotP if (!upsertResults.isEmpty()) { // commit upserts prior to retention or kafka send, if supported by impl if (txContext != null) { - txContext.commitAndContinue(); + try { + txContext.commitAndContinue(); + } catch (EntityNotFoundException e) { + if (e.getMessage() != null + && e.getMessage().contains("No rows updated")) { + log.debug("Ignoring no rows updated condition for metadata update", e); + MetricUtils.counter(EntityServiceImpl.class, "no_rows_updated").inc(); + return TransactionResult.rollback(); + } + throw e; + } } // Retention optimization and tx diff --git a/metadata-io/src/test/java/com/linkedin/metadata/entity/EbeanEntityServiceTest.java b/metadata-io/src/test/java/com/linkedin/metadata/entity/EbeanEntityServiceTest.java index 88f84ee94c8ee7..3620eb0c85f923 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/entity/EbeanEntityServiceTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/entity/EbeanEntityServiceTest.java @@ -3,8 +3,21 @@ import static com.linkedin.metadata.Constants.CORP_USER_ENTITY_NAME; import static com.linkedin.metadata.Constants.STATUS_ASPECT_NAME; import static com.linkedin.metadata.entity.ebean.EbeanAspectDao.TX_ISOLATION; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -41,6 +54,7 @@ import io.ebean.Database; import io.ebean.Transaction; import io.ebean.TxScope; +import jakarta.persistence.EntityNotFoundException; import java.net.URISyntaxException; import java.sql.Timestamp; import java.time.Instant; @@ -50,10 +64,11 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.apache.commons.lang3.tuple.Triple; -import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -112,14 +127,98 @@ public void setupTest() { null); } - /** - * Ideally, all tests would be in the base class, so they're reused between all implementations. - * When that's the case - test runner will ignore this class (and its base!) so we keep this dummy - * test to make sure this class will always be discovered. - */ @Test - public void obligatoryTest() throws AssertionError { - Assert.assertTrue(true); + public void testNoRowsUpdatedErrorHandling() throws Exception { + // Setup test data + Urn entityUrn = UrnUtils.getUrn("urn:li:corpuser:testUser"); + SystemMetadata systemMetadata = AspectGenerationUtils.createSystemMetadata(); + CorpUserInfo writeAspect = AspectGenerationUtils.createCorpUserInfo("email@test.com"); + String aspectName = PegasusUtils.getAspectNameFromSchema(writeAspect.schema()); + + // Create database and spy on aspectDao + Database server = EbeanTestUtils.createTestServer(EbeanEntityServiceTest.class.getSimpleName()); + EbeanAspectDao aspectDao = spy(new EbeanAspectDao(server, EbeanConfiguration.testDefault)); + + // Prevent actual saves + doNothing().when(aspectDao).saveAspect(any(), any(), anyBoolean()); + doReturn(0L) + .when(aspectDao) + .saveLatestAspect( + any(), + anyString(), + anyString(), + any(), + any(), + any(), + any(), + any(), + anyString(), + anyString(), + any(), + any(), + any(), + anyLong()); + + // Create spied transaction context that throws on commitAndContinue + AtomicReference capturedTxContext = new AtomicReference<>(); + AtomicReference> capturedResult = new AtomicReference<>(); + + doAnswer( + invocation -> { + Function> block = invocation.getArgument(0); + Integer maxTransactionRetry = invocation.getArgument(2); + + TransactionContext txContext = spy(TransactionContext.empty(maxTransactionRetry)); + capturedTxContext.set(txContext); + + doThrow(new EntityNotFoundException("No rows updated")) + .when(txContext) + .commitAndContinue(); + + TransactionResult result = block.apply(txContext); + capturedResult.set(result); + return result.getResults(); + }) + .when(aspectDao) + .runInTransactionWithRetry(any(), any(), anyInt()); + + // Create the service with our spied dao + PreProcessHooks preProcessHooks = new PreProcessHooks(); + preProcessHooks.setUiEnabled(false); + EntityServiceImpl entityService = + new EntityServiceImpl(aspectDao, _mockProducer, false, preProcessHooks, true); + + // Create the test batch + List items = + List.of( + ChangeItemImpl.builder() + .urn(entityUrn) + .aspectName(aspectName) + .recordTemplate(writeAspect) + .systemMetadata(systemMetadata) + .auditStamp(TEST_AUDIT_STAMP) + .build(TestOperationContexts.emptyActiveUsersAspectRetriever(null))); + + AspectsBatchImpl batch = + AspectsBatchImpl.builder() + .retrieverContext(opContext.getRetrieverContext()) + .items(items) + .build(); + + // Execute the test + List results = entityService.ingestAspects(opContext, batch, false, true); + + // Verify results + assertEquals(results.size(), 0, "Expected no results for rolled back transaction"); + + // Verify transaction behavior + verify(aspectDao).runInTransactionWithRetry(any(), eq(batch), anyInt()); + verify(capturedTxContext.get()).commitAndContinue(); + + // Verify the transaction result was a rollback + TransactionResult result = capturedResult.get(); + assertNotNull(result, "Expected a transaction result"); + assertFalse(result.isCommitOrRollback(), "Expected a rollback result"); } @Override From 1cb916550ef363da993ab201cd71e78f378ac08a Mon Sep 17 00:00:00 2001 From: Harshal Sheth Date: Wed, 5 Feb 2025 10:50:31 -0800 Subject: [PATCH 04/13] ci(smoke): report smoke test results to codecov (#12556) --- .github/workflows/docker-unified.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-unified.yml b/.github/workflows/docker-unified.yml index 704479d958bc12..dc2552b6ac9625 100644 --- a/.github/workflows/docker-unified.yml +++ b/.github/workflows/docker-unified.yml @@ -1274,6 +1274,11 @@ jobs: **/build/test-results/test/** **/junit.*.xml !**/binary/** + - name: Upload test results to Codecov + if: ${{ !cancelled() }} + uses: codecov/test-results-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} deploy_datahub_head: name: Deploy to Datahub HEAD runs-on: ubuntu-latest From 468112b11ce2e65b65c8c5436d97d4c58e4d3424 Mon Sep 17 00:00:00 2001 From: Pinaki Bhattacharjee Date: Thu, 6 Feb 2025 00:38:01 +0530 Subject: [PATCH 05/13] feat(UI): Confirmation before deleting Link (#12162) --- .../tabs/Documentation/components/LinkList.tsx | 16 +++++++++++++++- .../cypress/e2e/domains/nested_domains.js | 6 +++++- .../cypress/e2e/mutations/edit_documentation.js | 12 ++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/datahub-web-react/src/app/entity/shared/tabs/Documentation/components/LinkList.tsx b/datahub-web-react/src/app/entity/shared/tabs/Documentation/components/LinkList.tsx index 6eb680785599e1..bfc516a796c996 100644 --- a/datahub-web-react/src/app/entity/shared/tabs/Documentation/components/LinkList.tsx +++ b/datahub-web-react/src/app/entity/shared/tabs/Documentation/components/LinkList.tsx @@ -103,6 +103,20 @@ export const LinkList = ({ refetch }: LinkListProps) => { } }; + const onConfirmDelete = (link) => { + Modal.confirm({ + title: `Delete Link '${link?.description}'`, + content: `Are you sure you want to remove this Link?`, + onOk() { + handleDeleteLink(link); + }, + onCancel() {}, + okText: 'Yes', + maskClosable: true, + closable: true, + }); + }; + return entityData ? ( <> { - diff --git a/smoke-test/tests/cypress/cypress/e2e/domains/nested_domains.js b/smoke-test/tests/cypress/cypress/e2e/domains/nested_domains.js index 4d8499d91e2b94..af7135ce4b1b9b 100644 --- a/smoke-test/tests/cypress/cypress/e2e/domains/nested_domains.js +++ b/smoke-test/tests/cypress/cypress/e2e/domains/nested_domains.js @@ -77,7 +77,11 @@ const clearAndDelete = () => { cy.clickOptionWithTestId("description-editor-save-button"); cy.waitTextVisible("No documentation"); cy.mouseover(".ant-list-item-meta-content"); - cy.get('[aria-label="delete"]').click(); + cy.get('[aria-label="delete"]').click().wait(1000); + cy.get("button") + .contains("span", "Yes") + .should("be.visible") + .click({ force: true }); cy.waitTextVisible("Link Removed"); }; diff --git a/smoke-test/tests/cypress/cypress/e2e/mutations/edit_documentation.js b/smoke-test/tests/cypress/cypress/e2e/mutations/edit_documentation.js index 4d14683ac4b135..623d5078e77bca 100644 --- a/smoke-test/tests/cypress/cypress/e2e/mutations/edit_documentation.js +++ b/smoke-test/tests/cypress/cypress/e2e/mutations/edit_documentation.js @@ -35,7 +35,11 @@ describe("edit documentation and link to dataset", () => { ); cy.openEntityTab("Documentation"); cy.contains("Sample doc").trigger("mouseover", { force: true }); - cy.get('[data-icon="delete"]').click(); + cy.get('[data-icon="delete"]').click().wait(1000); + cy.get("button") + .contains("span", "Yes") + .should("be.visible") + .click({ force: true }); cy.waitTextVisible("Link Removed"); cy.clickOptionWithTestId("add-link-button").wait(1000); cy.enterTextInTestId("add-link-modal-url", wrong_url); @@ -69,7 +73,11 @@ describe("edit documentation and link to dataset", () => { cy.get("[data-testid='edit-documentation-button']").should("be.visible"); cy.get(`[href='${correct_url}']`).should("be.visible"); cy.contains("Sample doc").trigger("mouseover", { force: true }); - cy.get('[data-icon="delete"]').click(); + cy.get('[data-icon="delete"]').click().wait(1000); + cy.get("button") + .contains("span", "Yes") + .should("be.visible") + .click({ force: true }); cy.waitTextVisible("Link Removed"); }); From 5ed4b5bce93766fdc8726ed6739fcfe3f7d0fe93 Mon Sep 17 00:00:00 2001 From: Austin SeungJun Park <110667795+eagle-25@users.noreply.github.com> Date: Thu, 6 Feb 2025 04:19:44 +0900 Subject: [PATCH 06/13] feat(ingest/s3): ignore depth mismatched path (#12326) --- .../src/datahub/ingestion/source/s3/source.py | 19 +++-- .../tests/unit/data_lake/test_path_spec.py | 31 ++++++++ .../tests/unit/s3/test_s3_source.py | 73 +++++++++++++++---- 3 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 metadata-ingestion/tests/unit/data_lake/test_path_spec.py diff --git a/metadata-ingestion/src/datahub/ingestion/source/s3/source.py b/metadata-ingestion/src/datahub/ingestion/source/s3/source.py index b5bc08912ee946..b1554ad127b7ac 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/s3/source.py +++ b/metadata-ingestion/src/datahub/ingestion/source/s3/source.py @@ -866,8 +866,21 @@ def get_folder_info( Returns: List[Folder]: A list of Folder objects representing the partitions found. """ + + def _is_allowed_path(path_spec_: PathSpec, s3_uri: str) -> bool: + allowed = path_spec_.allowed(s3_uri) + if not allowed: + logger.debug(f"File {s3_uri} not allowed and skipping") + self.report.report_file_dropped(s3_uri) + return allowed + + s3_objects = ( + obj + for obj in bucket.objects.filter(Prefix=prefix).page_size(PAGE_SIZE) + if _is_allowed_path(path_spec, f"s3://{obj.bucket_name}/{obj.key}") + ) + partitions: List[Folder] = [] - s3_objects = bucket.objects.filter(Prefix=prefix).page_size(PAGE_SIZE) grouped_s3_objects_by_dirname = groupby_unsorted( s3_objects, key=lambda obj: obj.key.rsplit("/", 1)[0], @@ -878,10 +891,6 @@ def get_folder_info( modification_time = None for item in group: - file_path = self.create_s3_path(item.bucket_name, item.key) - if not path_spec.allowed(file_path): - logger.debug(f"File {file_path} not allowed and skipping") - continue file_size += item.size if creation_time is None or item.last_modified < creation_time: creation_time = item.last_modified diff --git a/metadata-ingestion/tests/unit/data_lake/test_path_spec.py b/metadata-ingestion/tests/unit/data_lake/test_path_spec.py new file mode 100644 index 00000000000000..305f4b72f5329d --- /dev/null +++ b/metadata-ingestion/tests/unit/data_lake/test_path_spec.py @@ -0,0 +1,31 @@ +import pytest + +from datahub.ingestion.source.data_lake_common.path_spec import PathSpec + + +@pytest.mark.parametrize( + "include, s3_uri, expected", + [ + ( + "s3://bucket/{table}/{partition0}/*.csv", + "s3://bucket/table/p1/test.csv", + True, + ), + ( + "s3://bucket/{table}/{partition0}/*.csv", + "s3://bucket/table/p1/p2/test.csv", + False, + ), + ], +) +def test_allowed_ignores_depth_mismatch( + include: str, s3_uri: str, expected: bool +) -> None: + # arrange + path_spec = PathSpec( + include=include, + table_name="{table}", + ) + + # act, assert + assert path_spec.allowed(s3_uri) == expected diff --git a/metadata-ingestion/tests/unit/s3/test_s3_source.py b/metadata-ingestion/tests/unit/s3/test_s3_source.py index 902987213e122f..e91874dcb42368 100644 --- a/metadata-ingestion/tests/unit/s3/test_s3_source.py +++ b/metadata-ingestion/tests/unit/s3/test_s3_source.py @@ -1,6 +1,6 @@ from datetime import datetime from typing import List, Tuple -from unittest.mock import Mock +from unittest.mock import Mock, call import pytest @@ -12,6 +12,18 @@ from datahub.ingestion.source.s3.source import S3Source, partitioned_folder_comparator +def _get_s3_source(path_spec_: PathSpec) -> S3Source: + return S3Source.create( + config_dict={ + "path_spec": { + "include": path_spec_.include, + "table_name": path_spec_.table_name, + }, + }, + ctx=PipelineContext(run_id="test-s3"), + ) + + def test_partition_comparator_numeric_folder_name(): folder1 = "3" folder2 = "12" @@ -249,18 +261,6 @@ def test_get_folder_info(): """ Test S3Source.get_folder_info returns the latest file in each folder """ - - def _get_s3_source(path_spec_: PathSpec) -> S3Source: - return S3Source.create( - config_dict={ - "path_spec": { - "include": path_spec_.include, - "table_name": path_spec_.table_name, - }, - }, - ctx=PipelineContext(run_id="test-s3"), - ) - # arrange path_spec = PathSpec( include="s3://my-bucket/{table}/{partition0}/*.csv", @@ -303,3 +303,50 @@ def _get_s3_source(path_spec_: PathSpec) -> S3Source: assert len(res) == 2 assert res[0].sample_file == "s3://my-bucket/my-folder/dir1/0002.csv" assert res[1].sample_file == "s3://my-bucket/my-folder/dir2/0001.csv" + + +def test_get_folder_info_ignores_disallowed_path( + caplog: pytest.LogCaptureFixture, +) -> None: + """ + Test S3Source.get_folder_info skips disallowed files and logs a message + """ + # arrange + path_spec = Mock( + spec=PathSpec, + include="s3://my-bucket/{table}/{partition0}/*.csv", + table_name="{table}", + ) + path_spec.allowed = Mock(return_value=False) + + bucket = Mock() + bucket.objects.filter().page_size = Mock( + return_value=[ + Mock( + bucket_name="my-bucket", + key="my-folder/ignore/this/path/0001.csv", + creation_time=datetime(2025, 1, 1, 1), + last_modified=datetime(2025, 1, 1, 1), + size=100, + ), + ] + ) + + s3_source = _get_s3_source(path_spec) + + # act + res = s3_source.get_folder_info(path_spec, bucket, prefix="/my-folder") + + # assert + expected_called_s3_uri = "s3://my-bucket/my-folder/ignore/this/path/0001.csv" + + assert path_spec.allowed.call_args_list == [call(expected_called_s3_uri)], ( + "File should be checked if it's allowed" + ) + assert f"File {expected_called_s3_uri} not allowed and skipping" in caplog.text, ( + "Dropped file should be logged" + ) + assert s3_source.get_report().filtered == [expected_called_s3_uri], ( + "Dropped file should be in the report.filtered" + ) + assert res == [], "Dropped file should not be in the result" From 8773ff5f1577df9917493718393a70aac1e49ecf Mon Sep 17 00:00:00 2001 From: Jay <159848059+jayacryl@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:20:44 -0500 Subject: [PATCH 07/13] feat(docs-site) adding case studies and updating banner (#12525) --- docs-website/adoptionStoriesIndexes.json | 23 ++++++++++++++++++ docs-website/docusaurus.config.js | 2 +- .../_components/CaseStudy/caseStudyContent.js | 20 +++++++++++---- .../adoption-stories-etsy.png | Bin 0 -> 136849 bytes .../adoption-stories-slack.png | Bin 0 -> 134202 bytes .../static/img/logos/companies/etsy.png | Bin 0 -> 35207 bytes .../static/img/logos/companies/slack.png | Bin 0 -> 72176 bytes 7 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 docs-website/static/img/adoption-stories/adoption-stories-etsy.png create mode 100644 docs-website/static/img/adoption-stories/adoption-stories-slack.png create mode 100644 docs-website/static/img/logos/companies/etsy.png create mode 100644 docs-website/static/img/logos/companies/slack.png diff --git a/docs-website/adoptionStoriesIndexes.json b/docs-website/adoptionStoriesIndexes.json index 618cd4bbb33342..ba0ca4a3ed58a7 100644 --- a/docs-website/adoptionStoriesIndexes.json +++ b/docs-website/adoptionStoriesIndexes.json @@ -70,6 +70,17 @@ "imageUrl": "/img/logos/companies/snap.png", "imageSize": "small" }, + { + "name": "Slack", + "slug": "slack", + "imageUrl": "/img/logos/companies/slack.png", + "imageSize": "large", + "link": "https://youtu.be/G5B0W03dvuU", + "linkType": "video", + "tagline": "Why Slack chose DataHub to solve lineage and discovery.", + "category": "B2B & B2C", + "description": "Slack adopted DataHub to track their entire data landscape, build lineage, and add rich context to metadata for search & discovery." + }, { "name": "Airtel", "slug": "airtel", @@ -161,6 +172,18 @@ "category": "Financial & Fintech", "description": "Discover how Checkout leverage DataHub for advanced data management and compliance, especially in managing sensitive data types." }, + { + "name": "Etsy", + "slug": "etsy", + "imageUrl": "/img/logos/companies/etsy.png", + "imageSize": "medium", + "link": "https://youtu.be/kLe_xfTR_rM", + "linkType": "video", + "tagline": "Why Etsy used DataHub to solve their Data Discovery needs.", + "category": "E-Commerce", + "platform": "cloud", + "description": "Etsy leverages DataHub to solve their data discovery needs, enabling their data teams to find, understand, and trust their data." + }, { "name": "MYOB", "slug": "myob", diff --git a/docs-website/docusaurus.config.js b/docs-website/docusaurus.config.js index 686c28fa3d1b93..4349c9b0bc44a2 100644 --- a/docs-website/docusaurus.config.js +++ b/docs-website/docusaurus.config.js @@ -77,7 +77,7 @@ module.exports = { announcementBar: { id: "announcement-3", content: - '

Learn about DataHub 1.0 launching at our 5th birthday party!

Register →
', + '

Learn about DataHub 1.0

Watch Now →
', backgroundColor: "#111", textColor: "#ffffff", isCloseable: false, diff --git a/docs-website/src/pages/_components/CaseStudy/caseStudyContent.js b/docs-website/src/pages/_components/CaseStudy/caseStudyContent.js index 4bb1b769b288aa..1aebfab12ece40 100644 --- a/docs-website/src/pages/_components/CaseStudy/caseStudyContent.js +++ b/docs-website/src/pages/_components/CaseStudy/caseStudyContent.js @@ -50,14 +50,14 @@ const caseStudyData = [ link: "https://www.youtube.com/watch?v=YoxTg8tQSwg", }, { - title: "Reliable Data Products", + title: "Powering Discovery in Slack's data ecosystem", description: - "How Miro leverages DataHub Cloud to deliver reliable data products.", + "Learn why DataHub was the obvious choice for Slack to solve their lineage and discovery needs.", tag: "Technology", backgroundImage: - "https://miro.com/blog/wp-content/uploads/2024/08/header-diagramming-s4-02.png", - image: "/img/logos/companies/miro.png", - link: "https://miro.com/careers/life-at-miro/tech/data-products-reliability-the-power-of-metadata/", + "https://i.pcmag.com/imagery/reviews/07td46ju7p6lLVb0QGwc5VF-19.fit_lim.size_1050x.png", + image: "/img/logos/companies/slack.png", + link: "https://datahubproject.io/adoption-stories/#slack", }, { title: "Working with Petabyte Scale Healthcare Data", @@ -89,6 +89,16 @@ const caseStudyData = [ image: "/img/logos/companies/zynga.png", link: "https://datahubproject.io/adoption-stories/#zynga", }, + { + title: "Reliable Data Products", + description: + "How Miro leverages DataHub Cloud to deliver reliable data products.", + tag: "Technology", + backgroundImage: + "https://miro.com/blog/wp-content/uploads/2024/08/header-diagramming-s4-02.png", + image: "/img/logos/companies/miro.png", + link: "https://miro.com/careers/life-at-miro/tech/data-products-reliability-the-power-of-metadata/", + }, { title: "And many more...", description: diff --git a/docs-website/static/img/adoption-stories/adoption-stories-etsy.png b/docs-website/static/img/adoption-stories/adoption-stories-etsy.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4985695ad118d284e337f9b2c06278efe73b86 GIT binary patch literal 136849 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 z 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%0Dbq{ zYCAG;5JAWPL7K?0SqZ#%KgWYV9r40fv2SyJzAg5x8kH+N^cm2j*QU4ZJIY;T3i+ik z2{jJ(W-mik{hf=6y)V6dvQ}7%lRe_j+vxG^E&M*-)EV4~*^vFGzv^*;^_{o_KwVsT zD`WeXH?ikZ#aNeZ>StWm?3fXFVGfT524B$f{bE;SIDuJ=w9zzldME#RT)k)H#$MiI z)gcQl$;I{aEvlEIbu&VdbbC^p74{301a#km4)nfOK(%m7_>Q(i^Ut5TcO4y_7@H zPE*6t(ozg*R4e|gSI7QJ`t+r1l638{%WO;`u$7%mugIz*4~su1UnhHtry5rZCVt6W zJaL`+<}nVz3a|TxZSQmLogr@BhoYBN^cwG)@PxaA+q$?y@=!L&d6KEg_$xTd&7|#a z+3Fuq3Afn{iPMvT;+h&J-UzriH$#%yBzd2@$YY(Npt?MJn}JiUcgNyt@x%QTr}WPi z3?vvBQ6mX8Lp53$l#4^6Hvpoyb;t!aWmsmHcIcK=m>kHq$hax7|C#r?$8c*DaWlO^`&Pv? ztv-ML`q}MQbE+~XQRA#x8Fir}`WCJ)J{6nE!K_SbI17Ew zuM@s8bo@Q<@)uO`{VL=u3rP{;>7P1cyYS;nORRVAOSQn$NfdPhPB|sEg53aMvM29h z#VQGJONMx^xpd%hfM?d>wKwxJfG8XU_gKT%_r|Tlj!B|rxZ^HW_C z$MG+Ge$Odj5#bhpYPz{A_qK)bXgQufU5-dOIv4q4D@!@~>tR!-Q0#WJe`00jNf%B} z@$QAUvDqb3Yq!P19hsOq-ngb{z;O^h9l?bHQU}g>eB>Wm9EKS*yt~SgY*@_72r&{| zzW>CLDALsr1TG0F&$o^X9RPfHb$O{B3sfTV;ioFT^RGZ2HwDZ)PX6S58^amft1yb2 zh4D~HxJIjn?#wf+l-rhOIM1M$2&qGX|~c2pgk89v$W504%OjHQajWg(-7jk{vwsM@2NW2E^i zXt=O4^yO!cryKVLKDQy)!{WPrY?*k}_Jk;x`YYa5LUG(Zyh-T@y4osJ%VgE~!ig-Q9vkl)!Vv8q76b&tH)_}isF&o+`Yf{5~uK2Kka(||9L zo&zbCeuhg9Zo$w&7J6J_)e;CLkAqM68820K`>xX_N5I{`t!^@VgazSvpbuQwsDt*3 zv4N*CiljCK64x_RW<{kpE0L3ktT-lRNVb(loI@lWS$LvsJV2jfs4e#BicqDL_5z8mmhkyE#WO9f6Ksp3Q(`0d@0hp90kjW(PnSE`(9){pn3%|RPaiyU>x19B zK7A~EeY>9Nqik#K*ApHfe*Cy=F5cSGYmb#N3|b-Pb%#Si#q=cevYi*T4bc9PZR>qx zvI=qLW!@DEuL>b**N0)`;W8x+LQ*_uj~>SjuA~s2MAk7rZttT7UFp!X=<~W+bh7w@ zu1Lvx;_k-Te6jIZd(ijV zIDBy4qdy{y4T2SW94?5QY+6=0gXw#Us4TuDhDWsgdALKd%y;9QIS<8ck`1masEH9$ z<(k4&G4^}_YqqGMeP#xZa_lNZ+NH4Jpe82j$3{q)X47ZBlEr?`3olP{slWCbj1tXn zT>TQiK2d#+r!bEOkoLe}el)8|rRm_#^Qxr*zvFAqjEPUCPU27XB~bbcIepRs2va#! zK;L=B9(9DE4P%P4fMZ<@N7no%ywTMH-K$3BqT==i27TI=n78>)#p(S&dZ_otnF2@ zru6DAM5ICc=+niK=YA-@6@{lIs=+Y-%rxdLB9un*P0?wu@T^dHkUsA$aCbMG)UO0! z)4D{A)?>bt#XezjwEU}FJgB|EwfVg<;R*g)*B*@Ui_Pp&1oonxN{j&^GTMJ~3g0Kz zH;AJdx`Woe*AJ8YJpMVEb<4@v%x0S~{poJtbDr0>kKJq=K>R)4w6s|1nll%t_Y^jD zk$#nBAWi(jAV(>aM;_@+eNA{dRs9q_yMzXyV;g4Y6p}S^))?iJ({s}Z{}D%p zm*oJDPr^0}Xy)gy5q;jh_ZW{pBlGE25lJLu_C`nFx9cToidelu-P3Qel~aYk37Sd= zMzVj{aSOg&G|4y_RNo}+Ww@|E9e;!fIY6W`VEJLkt>GC7jCK|}cR)$vu2rs@68o-h z8?ny(9XS|#A?4g$9ukZ;tTi{4V`mdD(SinKP}u<0ly#4oskwZ@ju&It>eRG(HwnE+ z6}$iBI+d{)buQUcYHa#K82({(WyQb#*x`8Bq6wJyx#1sC!auU0zLp6;(V`aHO2s); zmMGczGVFk?K-FD#%TVC+QB?oEAvVEFApCWX@jR!X5;woJXVbFJ6{X2` z_Le~5-fnWCotvuErf=;@Uu^fKi(0apl|FX^b;i${i z2hVTOK98P94d(k%OZt|th$NS>0UfLvCXVw*sL?w4G-C%ETI>y zRf!og;My=-9bO{vxqDRg)uUt=l@S{!<>M@;XNa#%y<<3bEn{D0HmU#Irk%1Bm6^&UJDvoBMAq)!E`$sgDaVuZlR!04Qb8=4(mLKQ!n@YF8Mt5Wk-5q{~gm znz>>&G}7Gy?;ZBZQlR;1(bP}khml9FpW4K)#!*OVVWPxfA|kEXt%;*{1qHXiek>!# z`CIMQ0umWsS;71>0(w$Y_uNVjuUycgCIQ&O7#{XNs$Q@vb)hhP7fHwM_k=<4V&bz8 zc5^@i(u&lW2E5a+ztdiRH2_eBUq#nNnE$wb>R#oKl~d4SbpD`@2z@qxg~OZj;05at z+u9OnJ7mI@EuZXOVDCYbCug$a?wuC0Bg=^M{cI(`1!CHNcO+&diqNt@iW_*_AgM2M zQHcmCCmts3cyzW{u*=x_OmmC6S$2n7o-i(+LmBDIA$ubo^6*JlR=9M57-1x@IrEY4 zZWw>MnDbK;Qy7!S>2o27sR7^G)H>0Xw~}jE@0Du6u=I$OV%+a9)5Rl>X#{9wT&h1G zQs6&oUCGstU-P9d_h&_LFs1m2NlV)m*;|$Aq?Kju30=5N5$7Ezdhaf_1!!3n#Ymko zAci+5ZH5iSS7Muf%va zzI(k`zYjUzYHkV-`rER)HqIp)7AY`2>*RF`OdF@I=o{oAJdIAJ)UzGJd;=aq zLP^@BvW~yXrB!VUu;adL?OCXqA35ZEcWd*YS?^=Rb?3~96*gI+Ez@}ahdWR2+K9us ztXFhO_~mFceXE&q7}z>EQB##9IJ;0w@~WzK6cQXHS3u|Ct{dLNxBJn<6v<0*Ccd)p zP0sp@sXLoB85QhLFe^n9 z_iBE4v-oDqDiDJ=UuctC=l^zc3hn;da>G$IXO4oGv01jPY2MNGyTuIA+ur7TA)++1 zrG^F*6U8<%XhY7{-~uN$q7cZwtl+kW#rx#a(>l2Qcz^S2H~5rKi31R90iRv^(K=w; z+-90ovMDeL7ua;}20zDwW`#_tbbs4(rdf}M;r3*w70LUq1CJuP4+ z#M_uewr%`4A8-DI(F+VDQqT)~U)cFFfaArWQ-WyW-)> zDhnIwFGqT^`Mkbfc|B<8U>wAvvCVakm*3AmDTJ`+24t^QoFinV!Wdco80RF}U3jy+ zD!JcIvoJEdmeUswOZ1Q6{WW+}MO!%lw{*fVjr2V{`10cY?PvZ^5tjzD18p)oMSjng zKQ*BQQBuo62|uC~o~;(M%wH+3m)!Z^8mHS>!`}Z=exT>(hS)N2=33!H{a4^n7uGTs zswo0ft~?983H$}f6sXwjy#JG!fXGOHpFaw7v>oP6@uYoko7z#@ zAPIKoG>$5>PDFpb!JW6UN2c((6y7;2I*=ybV(H!>iAgJy3sw<6XAClS4IT__-UFqP zoADy5jdHBCp1m71>$X$w@)%H~vo`+|HUCNGceM7W2TOOMzn&kD*M$;(;qCuyA~I}O zb=gl%eRutHyiDKPK_UJ7qDz}%UmyJ!|72jc5HQg9sqVF4R0vQJAVZv2SKvH?jwCT- zYU~yQ63^sag9UkT`@8&67PPh9)QK{cJlu%1=c?3QvOxztNyjB05y9>6xeeI~)YxXF zXTZ@eN9DDaLj91QZPqHF(w4YTt!J{saL(SSsPNh?6$LOvs<&i8d=3K?CWjxD^G&}+ zx(?fw*n+Vd7H`o$=rr8i*fc5?Xwr0lMSTCAmC22WEe-`vu#_>PfR1IV<-yUGEy=5L znY%&GnFi+};aZpIw=ejk#vTq4Ddb=B`yC0>_mejYvq?N@UpH92uW5$n0lu0ipmrk$ z^qqq~F;fOLc$c;vsa7d+m(F1OSvwBkUtL1p!Z`4d0yaCcwNA{ZX+am0^1BToB2d!D z0?yHZ_7!H_Sg=h=pXxZ!GL3fQdoj#o5fc+usFg~Ivp}$eNfy1{B-gqwQgyCc80hz={X7h7hC$)l`h=mB$71l3GVtT3WK4j;kR+ff@x>Z@-T! z%bb#4+}%zSb1w=w!SMOMa=8g!>L9e-=CKVrHfDMF5jgj}z4lHA3=Y~tf_+adGW2K}oZ$KhOhYj57C*-|y2+m@ zq-FFl>u|3HVQ`@_o1rGP08=DxMe+-k|TB;=WS+<>foL|trSX6(rs_psLq#bx@u}#l=Eb_+ChSui7Vqa+tqm-hMIk? zFCQU!g`gPdS2Z*!IGRp(ch~zKZ<1O`|8v)Rc}}X(WPIh+@x#jr6CRX@~ zp6!hC6|;|OF7&lx@Vgk9cVgw^JCSVbu%AmMApa*vB~+%ePC5Dm@btdDiRp&Z{+7Xo z5*B2!pnamQz#uanw?%-2m1tE4SHMHD&2?%PsZmSQpruF7iDDH=vYpmBMbsFBqSIx` zsFzkDl;`X!%reU>f8d()*me`b&d+G^Uqm|LG+Zn<=7Vqbm=4pR>@v7AY*TX?bWoq|qxIV-e=z$rjSzl{-GkT3S&vA+LpoX6XZ_5C0KA)~ znPUm|7HW=uQkY-F2`keH$U}Wh6gaztrC>tuq-bdlIokc!q zZX=N%9Ee);C0GSQU|fle%b~0m%prRzYbfOS!{z&zp!K(B0LD{%Ojg7>ovupq7(^@Q z3@>A=d1n>G{UF@1!Fjc01FdL+QBXKwYS+5@)mw%qm%C;ci86O=w&-nO->aM-s!uEy z6DmrJgyaRU%zuwH@`9gTIbAuFM*N}gDgBQMlx;*%%}Od8sLZd3=8Vlg(X$*#88sSR zN~du@h!o*fzofziDMk#m@lvt(k6XPL?HTgYRly*9*vvDD8d`j{xoc*HZqzUfmf4Ht zd4LNr?9?M`c7!!7P%C0Z75I9Dg2UH|?_`c6FU}m!1yw5_hTQ#(?9jdY3rX$fOaUmr zIuGu*j+5@7yEG*wRRDnP6LDoQZTeUv{f`-sr#xq!(wilu4nR^y<|D8bwsn5k6R&M1 z@bpr|o7XgK3$z?M1W$1)Ajgr63|2u66VHfDa7&M*Uvi*+Ar06??k(O8bf!|o%zVX14V&BE7{cw(`f0eJ$Qo}wu)$;T+HW?qAKCq4dnFBDxsoX{ zd8R*;eZse|sb&9YX7KUn{lV~eHJI|K2+iE*LxISLYdOb1Z&gGxlD-fpaA2LXb30%J z_R9bGc@I+Z;EsO2b8cLz061;ls^x8a_%imVLs)#w?gx zqzDS;GZ-2CV;{K0L8V?nlt$KH6=@=$sAOjufF3@o7_~$0L*A( zyEmzV!CW5x_oQDi+cWC@J|3xXAXfz~!B8~d*5~giImi7dY=7wtoBXkz{~9&PYB|iO zz|8Vy`RZ1V2MzyvMCLBxNaI7z#_-GR?j7}L<(b^~*9!XpwfcivltKG15#XXKbCt2E zq?0SVFXWyM1;dsZ0hfx&aeLsFtXm8XRAHtp|DYCn;&q0sII^_e7vsgllV47yWdxzt zd}r%snxhNC?5d@;SazI#PNlX(`3A5Nz$AMbx)(n1%*&&PH@%680051NXqIIj4oBe) zmgv?W`)f{W0>eNL@}LizK0^M4U{S>_KTR6LocciB@WscH=bLZhanK_%bh){ofo{E5 zF6e*V$>n9&`g%VQ$I!KPaO?W*ZdnOk18^0k?@kUh_6wkjHA6vZ66y4}=D@R+FY$9` zdWL(&;ADqNDs$<_gT^xGli;I>s}xGHUTAO>mIoG;&A1s957vMqu-3@fnoSM^a<3-57Q!zVDgvI0`R8b~ei&J^1b769g50p`ZdO$Bmw5j+P(`i(yMcp3L46C# zsp{fBR3t>vnT@ttn#VGP=$i-M-iVu8{Vr|LHTzsBM*S?6b3-cy^Hj$WQNQ{ zkSgAP41jfD*pmbw6uwZBzeGwIQ#n)l^tAh8Li+ibC*NJZ~gQHsNMUvHs3qMlTxCFSAO-y!I}uJ1H(eqka(B zuC4v%Jf}Y6v))fHjAmg!!0ICwZ3FqdJ;*!Ym#q>P?Qb@H$;Q z3Y`*Kmz}c+@{eWyp8Q!yymhL$lRM0qB%G<<0!mPW-;Ox51Lj1YA z9gyxkRYS1p&}i^55U@!J;m}B!ED3OAa##=Fbo0Uk$bzC1H(M|<0_ zUNrIRf5a$zcm?;i3wlpK6IQ}k+dL)xfM&SFM4_dYYUg=@{BB68nOIqcs)xDigp45S!FixhFp)_^L$ zgw-{zbw`s8!T(;wFwkGGCw$N`Oy{dwcp&MBH}*}1Bw}g7;Px2S81Gmw=4*J(19r>s zgfe2-2#t{l)x56mY~PL&9M@Q6t2wpkO$dg#3*`yC7DH-)0KhvD0&5b0*O7B;n$a@9 z;;*dR#bC`I2h`=I(u){|7G4jjJp8}mn>Iu;W5fc)=6562Mxbg-m;+V0UA`cfp@KPt zzc&APgx8tW-=1VU!NAyGS;wd!&6NTW7tTM1!gM5(DXN{}O}+h{4Y?88eQ*v(1smGI zYJuAK_wDj=?b}-j#gt8AAj7X6{?)pC_cc3tiqj|u*d0H9efP>~gAIGeKXbUgPi888 zTx`Bj_E5esq0DJ|2QU92ia%%7&Ox(#OHStneqU)PjHc;!GJbSL!XClmC$m98D(MwhOXxN=zL8&FP!L z1_!&lm1$q;AO3t7Q?IADkltNN^&K`X9O8AAP$F8m_VV~$2TdgA`}FTV88ryTR;?HF z{y&s1)R}%XWCo5FTYjg6fTMEbqXeLRFGeh15*Mxk!XQ1>e-4Yf`oL(^W2VJP&Ez{J zvTM+c)d>VrQtgIArf6)Vzn->!`u+QnW=ld9p<3^!F%(U#ZmQB-sk}l3V*i#AUl4=z1?EfMwy$P?dQf%0qXaq72*et@%8(8bF~|t{j&8 z($vLi3uRh-@WkRIff)QpHL6eU$MEt|6b{}`7avBO_#ce|f0QKkTWw+(*-4Jt6m+73 zb{4{q;z+tNux;b3#J-V46Zy&U8G{u+t^^YBq>Cz9?|yX|SbEe;XW+{G+efN2H#RSq z?VVJ~nEZna)^-8I;~(x~FJlX@?(xeZ)HVljtEUn9pqaM<$YloVw_^TYeNb90h7LpFoFe+b2fe5f@m-LI zs2igH#u?y2YKE-+SwxzkGB!%Icf_<}hZ0by-`+N^eh&mT$*K;{Xjq>Pf9H3~mR>xx z0&Wkc0ofmt0(dkL0cNsYV`oMf(X_2bptbK5ipv|ICvyzCeXBD&Xx}i|(&dO+&5iTD{vd7wHgR=LX`7^%$>ZTAXrnC;I!;JhEK7X% zrECtzvhA&oqvn9q zK$f4-O0A8)#1*l`4@l-w!!i4a_pXip=BtjJCJb^%6=_!{xOV8)9=(I@h^Ql1vwNh< zeY{l#Al=Fo-jB4OMY6obD8l8t_UzM?iD_`D|$GyzwE?$?dk))pzctG zT;9v>s7*Z*TY$MeC3OdK2sRmO0=@wR#Rou-0rZ+tME(M+9M-`;(~kBEmk!o?Bsw;^ zb9U4HpDZmnX)z{Ue%E66GZt_F$vwd4}E{R4cFR&E5OWVVz4@v0Vu4R%*` z6WJq8=T*|n%=hAm#Rh~JTsjxD^HsmmgS zvsAo`9s^V{Y00BG7TVahH9rfO1l@hA4359OSltKFh7@IH7YgWH;`ap{9ZOeAANzBR z?c(d*x|g!{OrWy&~@7m*`hj#`hZz z%OGpt+D1#*vF~v!z?1ovXxM>Hb_8&0J1)IHU+-J#N!-IpP!T0X)SKwNSN2ZFXurc( zs;i1?to4@sE#{oTL>hK*yBHlEfnmGitH6e4;uEmMrh&!Xp(w&+N16hcBs^u_lls3H9IT!jE);8T7uOyoW zrLH_0-+Ps1>(Nr-(U11a!^QG@`cX%R>oFUB0Fl9j#7f3?gY$FF+&5VgwpT8m!$YOz z$!#);%YC3u7s#cKs~^qre7j#8llw8vCQ2yfz6n5+QQS|h3W)vodjBQCLZBwpe{B4Z z2W0Ap_T2`#MByU>q-XJ8kJrCecJY;Tg#~C}-pOVu0x$%O2lkDj3ugyIZI5~y2fpqG zsq>(fUs-}tg{-^)%`ryD!AlY_I+k@8M&MI9OF!^4u5VtlX+o@6k(eqZA2yk5wm}rP zHhZlzta16rJr?eXT~k+<8RT3PP}`i-=yNX>>68vZ3ug)EhTXIVqiGh=Q9J552AzAM zVX_Nz%)7pEJw*$Baz_0te{KsJ4`UqQ&6AkSlcB?$q?m;@kLW?OJ=f=T4N?}tG^vFI8 z2C=AY#Mdb>P6*x@r(*t^q}(FWT$S%k3AQMgM9PGn1vuv%PK3gpT&Ctj)fn06u(+$e%-0R77p&ge394Fo-4+!M$lkINGu;AkL*g30 ze5cs)6y%WrP$z(sckgp10e&7+8wTqAB&Xs8L(oGbn z8H6u#+D>LQ=^tK4E1?KAwsl%R5he&bs;7PUT4)qbgJQT=W7$d+g}Twyixy8hPy3^H z#xOB3)PME>k#IX8LsfN2`TBy_jB#(r*!idhP=Es_o&R-l{LA>SzJ#^`)gG|uKz6cz zCa>b|)t-W*oO*-}H((v;shTHwOW6c{*C7SiLRawGQ=+1GTg6+-woGd$cfhR^WCNt| zXwmqhk1h6E4_hxS1E+0&(_uLF2cfC2`m(qQ#T4YlkgE^AETG|Ya${R3udcC#(>l35 zs*$!pK=>!ZKA=L2l#_hS2fxzk{pKMsG!U8xoOS=}QTSgsX+e%6(FRBw;O)`T&uUN1 zt7E>j5F<}QfF8{3=qa7p{Y6sm;YUCiDX79sW2KNM%k0#}Vkukkys5-Rc$9N3Lymad z9^;9Ab=s*&aZ*8Wb0^T;d*XUBb&dHsmau#mG@V|v^TKL6Hrcs9 z+|YXz#+BQlmEfOR#K!LK4soy}8q#v4}*phKIF(8 zxBso0H@OB%s)JzkkMqEJSbXOwxopIQMZw5E{@>>e7JY9PecTr-8$UI@oo`*O+6ZpD z2fgmW&wC{%@EBU$^RrmNi*>H|>)B;@A|7E~C#=XKSMSQFAbW~2(kv?uS3EYv|Ae5=^%HQ}zIA&^!lf_?c>@N^<|n*Fz(j2! z(6Kt?qqy60^FO-CgOGGHudTt2!;ntX2Te2_cM$Y{s{rQblz$+A+%<$!9bnViK4>s} zamA2W?9d34jP#q@Ds9d52)#-#E= zqf`SQlxBFw>*k;A0E4tyN_7-olZJ>?ku?l21*%{;nPs(gUJ%Tc==KhrJv4ags&Wug zVSZ5K>AB(lo|^wR-dpFWgOI?d?=Z0bJuo)8^Z?!auN7u3Nnv;B|5FXu*Y=lnW(jE&T4D%Z zl8f54s+~9nF0|O0N0`al*~au>RggM~ zY*9l!&Req0s#$TL=X@i3W8X29wJxw+Su#DLkJ3+5EC@}k8opE}Q>j+J_-vJ0(PvXQ zz#TrFL#s-iMzCeP;pxoj|T1$+dg0Uv>xdqG9J{3~=r3*iH) zW}157ohty|x%-(XBd{HY*uo&EgaEdTzSLlKXlc}2NjYYN`9y5_v#Q*s+E4sA2leA# zcR2k!v6taLEGGMi-cHafb%u=Em#Qjagj@JT39pJU8XkVDN%N0o^Bq#;S?O!KB8FOt zy<|dw)X&k4rmoB^+^wCg#UGIrIu`YLrrrAS8-nRE=CGfq-9SUfgoZvaPr;EpGQS;w zqCKVdtuF~gzPpbLFr@ASx-IGdh7r^vwqCTas3dNmq{qap&pIwjphh%nRA#-!u|@;5 z$0#@q4vc@!_2NFB;vo!h*fAWHRY@WMt|I+di?mrc`Tq4R(TwP@*v&I@`(ud<_@imyW9te-SyA= z6T^}#-TgC+4Tv__+UZ#>o*8zmeZBz<%{k`A+0OR2WPUr^k~2GJ&;w49_ngT8es-^< zK2ah>+XzotskWxbOAg0zC!$4M5+^8^CCUTDTIU0D95h=OyC>|Ss0^KuV8w`z$noha zBD#$UaCzi(9D-Kb?L(kt>mM>3;x_J>h$~Zi^pM`}p)p5}w*1V%u4<$Hoj5c$_r=ns zgv83g2rY&f%#|iE78V!X@X2h$xj)70jg;>xCieSUTOKXaH1IMN)=FRa3LT}|)p^0)z4eLdh2 zx@-lsVrYW_;T;TExvuNUx$eT3#HN1l5VVpXLqgJ)@>6XF9`!pQ^rRudmXFE$eifkQ zR;|2pvLyUnQ8E{F_1EMe96MEOMY(1rPm;H|rxrNvs9x6XDpp zmFu(KS|f^)^a@ch0YN6cu0-zZGt^a`&vw&hh22GBi|qlybPvVkzU?&U3dgO;UQVMK zeS|+-kY*O*gdmSH7YpoZ#%@=m4&=)(J-W5vI<}+R` ztLh=_wc2>^k?kuO#4Ua=uLhXccPy(Ms8yT-%qpoLQ|*2KJ~ZC(FrTbvP%L(AgLZ;m zpY)J3qJT=(!ObPuMlN7150x3n=bV|2iN zVskwAzJ;b34v4U%fY^&Wz%OZ1M)>k|lSDQcl}$57sI%#o&eo4LdYykW>9r-;B<3_a zQkj!@kO)GNVYpLv4!X%-5K6ucm0s5tSs1hE)6Mo)VI|TP|{Gm(J#2z%WM+% zm4%vd&^r4MhHV^3eb+Xh1YEl3u`fpFxbFWTej?geGdNotG{9P6#dO* z3xAx1%Ri5izZP4-o*X;W_lb+fAOus!$SW=JuQa1xxR+ub={W*lbx zA!`gehmVA8BDtW;2|@MWkmVxb;6s0P_j>h>rzj67a#?8J=EY~Az?cyg0=3viTe;P6#{;8LV4LpsvAcm=akJ6fGZPGD61lHIX^2 zY}$Kq3)YHMj^1J#1wKZy&-<$Sib$;P+hJrubp2F^qz`dlJ-ci+eU0=p(L~?HrfQNn zD1d$RoYY!B=CB5BJcmho341%7w@(~CW_Ym!S%l=bT5`FZ#=gxME188h%_~~K;E;L{ z9CX6l@w&d{)}-<2pWB~55BIUJWNI!e#4x{TUdkmMSOa#6G9!RrB2YX7N0;J#Yf9rC zqjtbw3`}YS^nW&{ywTHr{GrZZGsGIZV9<=*Fyp)kxzUNeb93~7OeD24&uT-NHqs`` zRj+!VC6D|;YesXW$FP|Snmtusi#Mulb-ExXWyTWK$pyy+f3 zeiD?cZM=jCACm@V_MTh#xr_(i0ehbFW%pdH-JZds!}i8) zHG4~!U{nCwZWilgm!KAE*9AFcfIk6-2LF@2WEoWz1Vm3|n1Q?E(_Y_hkuV-0BlcK` zREWWPUXG|8c*vf6U^wfYY}`gm#Oo8SwGf<=tGs{7(=}cyRTMZz)mEqo#g}qVmDEhs zfmZAA7Eyz5z7j&)_6|gWuI8}H6zZseOVes(DZh7g%Q5)4cHKOGVg=%R+q2FbCW z@i=oze`c+k$}}8I14dl2$w8E%4<=5}9~)-N%8M4Eyv!nZB+r>KgMB&PG~E@Kc|ZgW zkUo^KAgTV`i@V>{nbf8!liP2X=nv>DKgrH_-CeK5&y3dPh}ZZJAO3~4{+lx~BcO6z znDDON2=H=D=|~yujneCtA_7DgkHn@WFa(k;#N@10(f86~F7vZIsl*N~#43Zi1yn+D z=NuSMv!L5-QBSb;_Dn;wH+ zN<7lOe4Nu;rPN|S-UI}&sVTNbP@G`D{dlOzqt)ydm9fn(!kqyXf(9^wXI*xz_;rul z?BoBC7wPHU%pHGS-8aoB*K8PM26%}7EEqcfMkcU0#Ha=PHR@-L?H~X)?MXUsIirZ^ z$c1QvV)<;zk!7Wwg=)=F^vI>5DvpuR>ov2-Y?Y)!xw%^_cWThK#{@KzCa$s!3u?() z(1&!G0m|&%`>ZH{pRiH3*E(nZW}xPs5Dpn4T4IGrvc9^UNaoo1M z=G2m_zWLhw*@^1*<`mC9pFL5N3Bx9y?`=cZX$}Z_i0SdsZ5D5SVhXH<3slDd!gN0| z`vLUk_lV4WE6lRKilFV$SB^)KuWHjfHuN-ZI6jW^GtUvuBvTyMIS3*ZxH+PW!V`N5 z^}ca3CT@}l$$qk~uacd;Vyrvx*3rd!2-Kw@YMnW@9ateA@Dum_ba zix-8d6CprzUq}=2^dD#XFXD6W)cnun?lzEdcHi$b+2Q$|9i_Y-_7hDoX-p}LqJ>DU z{WX>**-tE$n2x!@k`;ji2j&bac8`IAu>v!NXj5v9k+6(mb261HyWNNTSZdkuYOoy$ zt^H1lfdxngf}{!#WIW&QSCZ-ITr^b6(=vJRdfpCM|G?M(84q_kaJJL^KQUqdZd$%* zu?C5uUx%Uzg$l(mmT?iUJ!ZfV<^p_u=IjOoq?WHn;)CoXdoGPh+Pr8EsaqiH%`adn z{}uNRfX8Dhy(>?9) ze^CLz7<{$Ic(ikams$Oru0v}D!NbTtEOjL^YkMlmLmV#cj~+{$Rxpeob(lolnWc+l zT`igbZz-1cz{3R4E1QyhzjjoBRc3dtxkoh)CZpW5{lYJZA}>&T=7F?}|ND!8pZ%E8 zC{_oHOgf?=;svdIgiVnyMw(5{b%kuFs}2jLSS?<-U-qan+lbIGP^>vWvUz8{NkW9{ z`{u0mKR1m?6?oF;fR<)cA?;lxgw!yKa}T6l&O;ilAX@ z&cuv@4&r*@nE_pWaDb=4V6$8DFU1OQ#rz+Lfv(&h){`Y(AF6BqZhSi~*J$SX#>x}* zOR~@VqnXb5Zxz#=RpFpbMlyp3MrS-PykjsUF*PK6G8;6KlTK1Wxy&{BA3sCi z1rKGMA?j#fiK?Ezj{ZVs5uu9(WR#wp(rcTGYWBa`C; zPep|sl4qQpwTG_}oSJ0qCHgzG6w~oFxx@%zt*p8g9MBgh!f#*I;1yjM4suGX6pgj? z)(F9DY_of(*kL*7_YM_*&bF5<^EpW|)V^EYCAB-Q7YMYaYLuG95=$8}p zMPP+Z?)>+0P1UiXsqoE{FJ~GF(_hzjXxo*B$FI<^*)Zj6OhM0_tB5UNF%Z%kbXGa2 zEj726$v5D)0un`d_I-gmlA(&-!s`4b{yuA z)F>&AUUwd}t_2j0Qcdehy+dz9fnmLmOc{Ic;rK&`IsV4tATborLx~Q7W5;IqZHr zXIDMK#O}1VqA?+&T?nwa`-K9>;NR4>dw2%0t`iZ-)J_$|f##4hJG&LeI>RU~g1X^w z5@4mOI4Ekn$=G`oq#gXK@-(t$U=1U+yU;zB}mW;3s!BT ze+!Q-tS8|(uIqA^WE2*AfjVMGYRv)0V#Wr%wE=DSeVAS!aEAW}r168y(qINY?$1{+ z?X?H2`|PBshiIaED%}=9UsgsnIAI8`f90zhkb(IRz-e%a5fa#PQsU5p zU_uou_BmF5;eh;}>6JvR{eT_DnG=v=&8dAN))}JkyEa}Xrcxbz&_NzPbv)#oTlb#? zzu-e?l-Q4Uay6wt7FKva0}zF`oc$l!Q8Fd_l^*sa=wJSU&)d4L#E&O${^s=`*8j|b zKSN{wc{g5ao)I#Tge(NPhUR|OT}J(|bR2U~YCU+6{Oj$Ym5-25phjzT_|n-+g!PggQgst6 z*m`CGEr2oo`{hEp=!EYs;Xb{MrfZ-)3%?!A0p;bHzn1bymmmM<6%;q3D9FglwK{n# z9IgRA;CHlyIXx0p}j0{B@`in%$DkGmqmzRJm7E0tTJYcYmlD2sDa2=+>y6oq2+6Bp!>FdzHx zY+y&RTZ@kFausm$OiSP>Nk1byV|oHxR$bw?pb;KMiRlGd#jJF`%8z%jkx_GXN>Y3~o-ByqiC2_M!!BEYxk-X85VmDqLy8{1-xH=*AXtmfk}( z>9ARz<{v+1N6DuIZ19f%CHMk60C3=OgrsyZgfDGIIOa5AJT(^TqdHkHC8zkNpyD|Q!uP?O0DUHJ-%s*UTQeWZR>2(zLE z3zvfZ=w35nThKRVa$)DvGOo@h`d?1|&l9LrJ?w<9Rhc8(T+(PbR8N1?o6Ww|fKNh; z1i^e*fZ0(dlK(4*mfP5c;OB3OJ&Gp zl-MB({xj#{g8uQfQrPMq*D~(3m~)z@MX~04CXDHNg%bCY1CuP`YWt&$CSN zRjRGBbfvkW?RmnqtQ7-8I7%>VnmKfP?a?4FYvqG-wLhl%z!UI z3a*}X6Cl#~{fr(z7PJUJ_fcACU{5<5nlWt1J^>hKs;Kf&4sAsH;`vz*%7f4_y@Asi zfb^dPh{OmMnq+T`j2(>94*^0S!m`toVsOPPW*G^F)@3vj{yRAV1vVuBdIP#V450W> z(uaUAl7}TO^t9kA^)L>U%}$O33^)NzK#*5+7iaS+4K?VLXH_b{PGsKV7!f3cGq|GP z2|&{YM70x-UX2G&(k{}6_=SsNp?J)seamyMD!O0U)GrsRw~%*ouChh;p4Nc!PZN5A z^%JFQT#H1{$98_47!8b7ak&e225W}jGRN>P0)e1F1GEJkN&i>B_A2n}aMYObyQ~>I zrq7-Yl>Pj>T;yUmb-K2c!qY;SGiNqr-GQ?%wAPK>zR8z-sMALa57~#bNg_0=J(Pl% z?3@Ymgu#og(1UWaiF(tAu<~O9nN@ty35`!Ohs?2g?i%0u>tMcmX^ZQhW*ISPi_y<> z+ysEtL9JFA1mjv1{cQu8EIOfaB0(i6Z1iNPg&(V* zuW((ze25&u2~x1?>Pl+sjm%x0RGJLz6H%~-Z(`l(&u2TK6XeL1l7ur}bb}FJ|CjNb9)-4u5(K6K%g&IjA&579XWeT;YrT9C21U_U&N?h$j0!)M9 zW$88>4H{-Kf+jB1gWyF7;3>3;MUwqCC`+OY){g!`yKl79vBef|8Z+V7U#jo9g8NW(6BtVN;O z2rtgUfEk<6Zi1JRBN%JoEu2;f#a*tG={-wNFXza*8t4SlSRyiE14fu-Vm?7w^HaXV zdO-o#+X$WVVtIv*+hz}kj3nbq&N7`1FV#^+BQC`I3JQWf2hnmY?E&T6eI0tAuJ?D& z50t2YI|b|42=;q#s9(GCA4}I*6*pAp_~i=T+RH~_;v!&ZW^&AHg4F6jARxldq-Y}p zNyIB#p8B#otxOmV$P0=7>i6;3$+$P>4X*hRz_M+JhrL0a+g9yfy%y4?pcwQa_O(So zqAP%u#`_pM(s6*-59AL2cf9|>yYB5V;2$o_RTJVDcieQEnW!X_VV%xJw40;Ng~i_g zEm*@|TM^ylvV!~(uK9FY>w*j83^^rkZEl13GY=0HAGR${Ad%Km8$_%6;bXJxSnXIX zj1~BT{~~NaM>yzyzk7r!6eLJK7tQp7(he)N&~<34Wc%1KW`0}+!EBxiY$a{=iI9tz zMib#Cc-C7o20|!p`~zS#*8kY>|2kBl&mnTNys&!}F(`lCKdy~FI^`Z>(V~R=2ABI| z48@{GE-T)yrv6sXxyT{W>U^EBpIWA;JQIFw!-gsOAP@VE?40O%9r@gvx9m4Q=t;hj#`I2+GX}y-^$2K?PtNqcaq3p zdGz}|8HgyM%IIzAU5F9!BW)Ys-Iy)ov@)BW5lI?c7QgYWy_5+ZY;(5y#c{M&D}&D4 z_q_YssE?521KM_*U&*(a)5gV}BIttqFI-?}&;CiXXCe#wW zt;m|l^!)@p~j&oR{F+e^`sYHLmf(SZU z9CZ#6?IQ)vE8=~rB^PYuB`aC8M;P;UD$roiD!Uhbx;_mL1={Qk3#9 z%IEoL){QGUHQd!jWT9Ry>fu)=Y78*v^y42?ls`Cn`C?qkNk8ZPuM~-`rrNAbz7M_Q zT-9yTvJEecW@j1kWkjK>Mqrnjb3ryLS~NFC&d)VXo4DPt z=aH|wzM!hsSK1CUL1Tt+1ETe@a4~vZA1{`fZfMCP@EK;a+Qb7vhLuJk7Nmw-LIx|~ z0q5E;Y5EI}2VZ~guUUTo}$(RB;hmp`*?D?cvW2eOO4Jh`M05fuC! z34$0pe~BR6_pGR=B)q_SN38yk6)@08uV_YKP@R_;vFyf*Ry|LS!b4ip_ExeG8;SZ? z4_Mk+h|pyiCg zZ#Zjfn0yLKh((VZvpLhr6sFJd{53?4W$ zc>sSO(vyZJR4d(lCwEbt`y@}IJ}QgH-l=D7We}Y?2>$z1k)R`mz)@DG^y-{+8FkF} z4`zYcpzq?o@Q3RSF%<8geSWiIsrbB1BvanHbC|~*{`@0qu_sEC1XrRWOgEAA$u>1R z6+IB6h_`3(Bbyp})4M0PKp^LLndy*OAr(HRrTIp6@zZ8pt;)$zdDgE|6QXiorq7?Y zcyfz8U%&o<1!skv1}T^C=StCsRk~o2;U9#ENq<>OH267}^b5XUxNrVKQCv(+4D#Y; zF|l;!fy}l4>?a1DWW{fu0*lahBqh}_->(k^#((}wBk1P#v zf0J|nL1{FF%&SE3Z4*@%`SO5M0QoZsb9zbX^>>mKDODYC3^7sY@)T1=2?iSzhKl&5 zh?ZDZDqye_9QB&VT^RG%*G{IS>}`sc@05~G@s_Xz?m=F=N)5sG+C7%RW&Fj?J-yBIqBSP zZC-s2iEX*x)WzrmSFQ(&{mo6CB%W4Ja43+c%L49&?p!MdChAw?C^ zXK=e;lygNz)>y1Rk>j(7<%On})qZ)c!y;#eI`IgD0;<&|TK1%#lApvg1YOqkwKJtp z53$vyGZiBI(?!3j=~^!#Drg_KH)iKtQ>Tyl#bY&`&0zt=#lFs}8BT^RbRsmH+8t^`vjWKk^bF#j6zg!UGZni^buCXg|KljI- zn=F6P`ZStBwXU5r1})MbHzCE89!rLWS(~4uXM-#h0;UbZY#@!vc{;o$uzR5Y-0zYa zB{58O?!pc20X@0i1mmWkt+k|4IJz3zOj*{);Ybp>>(K=NY26^jUBVdkf^QU459Knh z!;o_wuIK$#&HcpRfE;db)${(is!w60q;EHdP3Py!`#OAGKYTZ9W-ULiDW%(Qc`ub$ z^-%nDxQj(HP&3#2SJAJnbfg~V0~5STQB*X1F7GN2^2fkD?|SuNoN_=M%Q*>+^tZc6bs%K z3KVzO;x0uCCB=$sa4l{vF2&tlf@_iBK}ygfAy{$$^1NSuWo6A;$z;x)Gw0sd-uJIH zvlCZn=U76t>ll~uh`u3uEG62+-^VxTwJ&WF!m`*T2okVEff-w$ubCQ~rR&T`da%-x#emMl#I1~h9UI0086k^$qmcvfb^%(P} z#Zhshsq&sjU3L5)uP`qs={ewcBFKxm9NgWok)vvMo9%P?oAR5%s?B|E7&RLHsc6Bj z2c5`SbY1Gdy4P zvzHxz;~S?~l%|@ODSaDG*y>KvCs`LQ9_6Hy$D%>v@1}l&>%64vZi8flKTBCMH#E)4 z@;6afk3fWebbR8>|I@9-3YnFe-d~_jVQ60d@GUDY8WzWLQMd%g z3cKEys(7esE)sFdWCJvQq--FFr7tC1?*=KaogOj4H$KmiJ9s&d0yfw^Cn*=W%sgU! zH-&k-^Y9)((+~_)`UG!`o={*q*Q$N!=jMv1+o;He9$Fvm|7J6xH^(Kfz`g*IV05WF@EdPeU)Kd`%c)?zZo5o3;SIfV3yrHzNnVeUN; zIJesr?vt9lpt>lVL-oQnHAC;Y&r9=xSvOGt#% zT4R~IsHIE}&&E4TuElMgp0l)$>XEs{vr!Ox?X%cL*nbDp(4a|q_4Bgr&9`@|>mGg9 z`jEsrZcUQRXVmZO9w4wBK=G<253_yfPuf2Jrz zWKwa{dk)f8!;qSVE=P=+JaLtAiOP2ejP41Kw$6-$=!>N>rM zuxxDP_51f*0B`L$xesOLLz6!xIb`@s%up*q+>{=4B!PTNat|Vuywf%HzwRb?T(y1Q zG2=*@#H#SOORBZ0qo~{U2KfMneAT_k3xK~^D66WVIl!2yimQh-woeUgDr7c)xN3Bx z5GDMq5$=zBl_1mv?00wKGGzYEEtp=YXZqmxaOl#L?gLbFa!5AV9~@z=eQgiY?KDAy zn>3D9@(E-`qBe1mj|lWCyu!+&AlN02NC=0wjp20V&3Mk~Q_4-y?>Ld&R86<~hMqVB zOAwTSVQyuy?cYeXWf^2wnPbP6#$QXBSz69O9l1A#7}!Y+TGu;^lzR#ZNeI;sSi!=% zSG(Rev(Np{X)ytr*SkG$4v{BQX-4n}OVFPW4likzuZz-BCThovi?~Y&N3S_XK6!-7 z;=DUby}OpZ*X#bat_Y7it$1v9Nk%%5dlx<+R27uS8; zs|nQLdeg!6L<2+^%7lM5(UDfL+^c!wFO1cb6pn#k-ApGa>gvC>x-A;nB)(|R_D^QT zo8T8*J?-RNP7xm+&>#OM71SN3kq}I6wGF; znqRp-TSb}Y!-C6T)@JzF-|_*%=4Z_Tke5yhh%hZ@H}OR;y##VY(G7a8K<2daNq#lX6Bxf{5>$14I)jh{`+$V01vDEI`CpqbXRb12-=7-K66>3k9W%dA9%z5SfkOY8Ifwso`=v2`=ZK95PkbEA8r zTRUu_U1$z@c;Ue=GDV#PL{uUo6Fc~@gRoXZ@0+vN;^$7VRjHl>xYfcfBz?Bj)5Y02 zzg*(s_7Q#%9`O-B#iiM*<=2$3qqeC_UzhKqa>^ZDfJCdA=G;pK442DCY=ik~ulMC( zjm3G_;$i`5{npR{O(}WyT&|}lbapuA-h}s^qhRjMhj%M?zcgz>I|~8G8)Z7dlq>~~ za2zQ+kdaoSRJj9HPDZS>HdGyd5~Dewnj0$cy^ZRGJ_W4mBvhg|SGbN+xKk`{vdu%h zMP@S7H3fPBwLx0;6U-JzDs{CS6m89^6B2U*sHIK{K5pMRxRm#O4KV)UjWIun^wa*1 z1L$yN$1QwhYo0V_sWVKm5s_SiVcaiE(L%oNe8=&_!ouxK7U#*RqiWT2SVf7B`Jr~z z%%83FpAsh&BHzyJ^%(_hiSadxD2HH{qC=wUZIJD|=^D>@a6%PawU9zOfO_PI&Z@Zf zRU0i!&h1M|OqCK8koeIJ?q!8aD>BwOU4PXk`VN%4XLP7;+p!E_@#|D{r{$Hb&E0-P z2nN=beS0_#IiB5D;)t9ix=EGIt&wQxDT!a#(j}wNfju5l(VoovG`-);QoEG$PGnM$arw@h%{L-J18;nahA!8$#a!{pQOl#0SIr$06`}4RqYCW-hE;@gb^W4?k z)3evvsx|Tm+7pK`C3@~Z_Z%IJEU?kH87Oc3+g8_2qX*5dbPk|A-oo-r=X=ENrZuT7 z;sc-Nfi;hhNHzUaYA<}@eM^ASfDHvjCe??<;ljmq+uoJ54Q^8T?Tpjwt>1SN`hrGh zR~g#jYer+tL2|+r&Xfd5*Qi;qjU!3hA}$9-FOI(bRk^luVQ^nvgH*bg-er{Z+*4c9 z7@wBDE@|0P^_i7u@9ogqDx)fYkk<#mhXDPng*W>;v|PW|TU#sMdGLT1(DxOqHz`*V zWH4yW?2H(eKGIR$B6Qdm__WYj}rZT z2PcPH<}_7S1?+~eHj4*5N>W}l%P4*pcCgv!;Bb0z7m97L5RT+m>9Aj1le9*Du|x)S z)5a(|9kG)rb;h{aT~B0BB}&^&yy59*Jyn-=2vPz;yn2dhhVeHc@_n?^SB!(E000 z0k9^Gz+tR9Ev#Ff%-Ml2E1Qf}O6G)0fckHAuK9RL@s+qyDM{Tx(Dl)oz=C=E_IK8q zf(J326271~y6q%wNv{J>wa;q4JJxHBwUKnSl}^V-n%835dND9j%{{z(7n3}R0FajW z^#qm2U-@(R60Q8nbqpN7=X6aGPMa|JZ{%1AIcN!P(jKwlcD4(m{<&IIItal^7i$Q-;CE6JgM zvr*;1#f|r3q*|~AI}0}4BH!L3O5k`B9+{R!=cB8GUpYggYV40@c^LwPRGe$%nK9KK zuN&y(Jzt~4`|@-bDq8CfnnY1mz8-K?D(2NxVuM|}H%mP$)<)9!aXlC0-Qd`gW_rYu zT7;7XydEvAU309~{s#o)iGN0U96c{OBX8{{=n=EbEqrIoqEG!ekini!Aa^7`m!Tk9 zb=>{>nj`xWxN+r`pFA~$&js(~u*rWtYVYOwliNnZ>*_cNE+}uRH}+IGG>@_;ruK6} zS7JFfTBGowdWhACpOgW2jR`D}Gnbf(PsUh^IIHr_$?+pW8(j<}allRFiM7DMCb?Hs z+DzP|tR`M^IDmV`1*BA-nqA8G>FCblm4xd$otgwju)S%SZCK@JAcVe98P@_j_``Q^ znX;T1(Jm`YW4g~$EA=_xUoc3f)*u8Sb48=1f&M`2dj*!&V2`Yh8L_LZSaH}_|Eyg5 zqG56P6%mLj;ni;dqahD&h;pJbGe36}qzi?ze~W{;4I``A1R3E%8a~~qF4v@73BnDX zIRU&<`?O(W5bVxEGbar9jUuee)>Gd|57o{BY_(ZJHGH#-!Q}=Gryc|Jp<#i+N-b)X z?tNFc86g3C1NVoSU3Z(^(X7G!K|@41Eu!?sdZMl53$2vGIFYx|tj z`}u17QO~1Pv12pSnky;v8aWXa#a|B-NXA}U2B=?kWA_uAB5X?W;2ScgNB$l8$NzR* zdO<`KB5e^q5An$zb@xWClN1-tnCHUu{uMQn*S~CsJGFoaBiNp}4>U}q50sijiMRW_ zUmwj%LNBQarE&s8aN}ujqS&CN34Hv@?e^Ve>cTBmykWT_fBtYoC0vT#DL+mu+?x70 z`g!Sz?~EO>VZWA*xz2((M_f})PyP$bVR53vTX`1uSV~)7%bg$soue!(ks5iE<211m z3(mK{U%m{k@o(-Zs~vRkxS`_Pq|yVhNht(1@fh*nkXeU~mk9d?-4Z1m01BRVa!>5m za6?&J>ADP{jdz#4kWcp#HT2zkpjN^M@kj)^#CbhDTEyQ*;EXY+IWSRabTkPTyu_X~ zH27u`O$mXUq2fwK`li!FW_;`Qq%UPZhm2kQB#&y8`?%QT@<)ebAGH4LhPYf7MqIEZ zfjGR)&YEMXE^xeGeR0Ix>&v>dkjRjSz5z9h1iC>hWtlGw!)6!0E|G2s=^R>XOs z6n~!gp&ETBgD#0rRPW-cx?3P=+JodRSEsj`sV}Tb#PgGKsVZfMkvM>lQ+UKF;eHKU ze_rsKBO)HvdZxC^J&lg{dkXc_c3sDQES1Mqc}k{pA4p2~^D$@7H1+D^IDGioWZHV= zC*@Rmp6{`M+Tcdx*4nF+n8QZ9lW>nqu62=}7n(l_Js?t75A$v<<&=4nr5ZOi$S5p$ zO@nXWvKt+0>UCq^X?AMfPYhQ$z97Bsy?DcZIC6@r%xhIkG2Cqo!5G*RYxtur_y`T@ zH~`^yOc~ZztEaje$G0u|OdY=!C*rkXs-?^p-v*cFcl%#Ablgr2b+1_U)ytMXFW>v! zi_IeB_ojTU(ia-SvJ*dCkES3awT`V&VZLKSZg+bvlP~XJaVJ)PTD{LNoYu{C zHRzU?5GXAI2RRX2yj}m29q)L9q&VDp+eOw0I7Sg45(Yc|PGNf7gU8{g4GwH7eot(~ z{BK(%CZ2b@P=Zv^u=8S3jL!P-xlG3gW&GdG^SxG(`}OPA&5N$m^JnSBAHIQnd*}wJbI%+ez2;oF-`@&<{U)6r_xtqo6l!kei04E-b-*4d zGH=#O)c7==tq}Naz1SERw@N)C&2!?f;FTT%-L4!B{C*SecW@hVN3Nmqx|g1jK1)Y4bc7#GVub-S$e1x;#Q| ztOF7*(DPkSx}!zvmJHcy#oC!b`*D(B6)%qLtSibKrO;ZBEP|jVls;7Lzr~H`@cHfE z@bhO+O(520MP>%>ApXOXXF}M@u0Qzri|7Kvx~~VTG_a;Hip*Ma^N@vd^3W@^$a}M$ z*A8}X`atu&{&Rkza_*R`7G+Uh=2E%-JB`YF`pTLYuV0A{hjSEs&fib^unHX&jHQF(v`8a(@N8Hyi|ixqqwG0`%o9K6T#kz~i06y^PCP@IWMl`J2YmAD zsiwwqcR!mp@iHQiA+z2%G;dMKarqaPd1W1gt>5YP^KelrD{Jb|$9o~hvutfd0~y(H zS-L!6kgKRwCTnXNFW20?CAwsRS`YBJX$BkNz2Q8&nF~B5DN%J2y!IFXS#tVLR6bzj2 zgVHD&WQdQiBoxv5;w3Z9^dexylIf9l~!p zEI7%O`WJu&g&p6WRrtP!UUflSLKH2s|0W4^CZO9U8vsE?D~DzsI{sVi8s+{P3o<7? zg-`Pz=%n4h))#++HI`lZN@54bs&da?$f$89ic#i$C|nPQTqC!RmmYmg<7yuLQw<$E z2&2nbvhfa2w3>NS->KMub#0|eOKXOsE9+(x$4b$_rh@K6|4leu2ltjRM9fx35_=Hx zErB_t`|;*1a|#W#WwAz$?C@!PBb;bB@{PSBO&n;p)>>PED>=auu=n!B=LP|w_#hd> z4j?!1@JwgLB5zp!4R1Jq03KaP>}g1PWhqARFF1O=uSqhI4if4_JQ(E^V?7S@k32>m z+SwLY(*<-@)XrMgIJ5ji=04^BmDKuom@j^ulA17K1g(1S;|;06UWl4dUh=!Ts;uajDZ|S)tl`*LQWpOPRf`$8IqoT- znj!^T%YEsOmodi{r}IfloBCj52DNX=?3ddq$MPR*^@qTenCW{1_m`NY0^@D|FFgLF zU$Hnb!CuQ^Q4D*}P9^)EVY~ z`wtN^%MPRne~Q=7j<_193Um$)l&jr z%hUlBCRSfmP&z`5bO7~IQ(dD>wz(3s(?wcKAeXo!_EviR=ch;cX5C9(uVbI3TCU5L z%7+e}`s5V9hAxJ(urd?XF138u148S_~i^n0xw~a&rY5m4Z5eJzrf@klNz*zoPLY3 zHL?+hAztE5TS=0W-9t36xXK_v>(e+Btb5l#VuYCQqD{)I+V>x(Enf1AWphAnqD%N| zp!vtA{H>`OPx|hbO|fX#JMZxu+9JuaSBY zx1lbO?k>q_qhNNxV#LXDYl^e6Y4%T zJE|ORmY$`4o7D{N4XRP3^HMDT;B4@E+MWcbG>`iO z-?SunS{J!ZUX!w55Z#T&-{Z$cVYDXEY|b?E@`o(l*|$ zRnhYhd2c^~66897PJzMRiS&X`&=B8Y+!T0~4%>W{;%DT%SH)VYZ}*7VEqxQj+;LgM z;=!%?jB8}t`s{3E>Nngp)s3bVzG4grrX!vg7`UJL@9%3 zyO(GHCzjhhQAxbc&<7!Bt@zbo#=pYiT&;iF%j{M3DoWD*6)DSl{!X!Y93RZtfy#eH zF~0oBMe(kqa6MZvV$a(u_iVT5_=OUntNUyX)AXyD5Y5uHtcLCa^jN6CBPQ+EcuO12RJ=gMkbbI#IeB6=pmre3B9R6c1O}PW@ID%D414l=2dF&ZN5~)UKy&bRoro>e z#qOS?;gt0fXlRK0Oh5oouYWlEbtyeXHrS_ND(o=W{qrwB8a}m~jukGqM-)LnkA+l~ z#lUl445#V%PQRX zdO%dDRlMQOvo*Pa^_4EL1^Pj-WTswjJ%i74djjH4iq?#Yv_@%ly6C@ahsL0qOyV;- zd<#y?^M)IP-#>zYxs|Z&!p9UbhRjZnx!osx+H0>fv;30$Fcad8QUb__926kkv z^`!r#Kc^E)xRa>Z|DyxHI@|c#wCuJ-nOdbH<Y?W!}_gZW&y;xHP9gN-#K<5^} zwdeJxwMbpO8<8aJ<1c^Ow9V#Dp~01pD!zO#S6z!w_aM#_J=$0~J5Uotx81zt2l(}qmefMDt;T_&459oO26pmclu?>JnW5>#wL(iy5Es z=u%LU0TM<#pGcZTMm88gSiyf+tAY@fSB<&7W}NRMWL~MdXZa>LNwY?xw+EOzhULv2&210tVU|YzUnzn_^tE`7 zPw(51nrL>5VEn)++Tjy53}2>n?wBp`B3(8&0pgpf_ykZwzu}4oo1exW1bfhE&EZK# z1xA=l+OokjERR?HPcV_`#P3vVxeZ2WbryZCYCeX@8JCA+15CTt=lVpCW!D-nGlAzY zZw-WJ)8K;?ov7GnWJ!jo#we_cHx}0|cwN*|QQ7)~<1fdY3lXG1{{9EO+~&;44_UDr zDCRXXg(9p{537&e&UT#`&1&9*KZk$OSYut`?7SMqq?B6UgqB%7u}yY&*@Jk5eV^_} z*2@t7wjiwx@6i%;<)+k4uZJi;w8}t-0S|gA*ZAJo1cOXiQKZ1Q46J5f&oM!oN2=7Dv2L=ETQH7xjw1t7MnIQ?3X}gHH-X1GHU){W!{swX^0Ze{uv$uEOk4( zWG>JfUfC-PC`&`_5*sFp5~~6Q1$=`0S8Zm}7h*;G`#TGo9O)T^46JtB%~`ob$dY7f zv~cuB@{b>P6HyAP`%7kBlF_@{DSs8%NiBh+E6OcAQ=2w0lu!~q1mg*x_RwKLXuxV? z4}Yy*Div83mF*NQ@D_`1pr-9L^xXeYzO*l=${JJQ=xqj4ipXTZnB*<&Uhkbp<^2~) z)O{6g6|sVjqqxL^L;tXJh1$^1tEoa@&%nJ zqLs_PHh(;@iWJc914>Qu?$g5(j+1>Du&7Rg<9W;tE|q$<>k|*IHnYe(OZVIt$Br|M z)Lw3iWLC#kYM}(@ub+UaPlllG`OH@Vwi~{Cqj^TA#!PhpdTWxQgEu(0%1qwjFEIX; zoiU;lHg`iVx{;Mavh^FrEDdOZf5P`DB@FJ4b2t+?4 z7Abq2_)E(smt}`Msj;~eWtmMW8F%Z&-q#lN2JA=q&ADfEd3Tw);o9Iv|{H5nJZ8g}qaHoHs|)O?%W zm&|?EKHiaX57Z686A4mW?vv#%dJB{a+^cpojgdX~Q1ncTShTgDF2&6XSmBTNfQ{yk zR70;R562q62i*t#YdGsJ{)y~S1LXOhp}CIqjMw`_a_g~b(DwZ=-a1yi3-*Ci^LCS8 z5|LgZg8Wy}pe*818=hW;u2z_~(~BdsjXkYAyucO4^bjfVJNGqejCtpN{iyC~Gji95JKND!RH&-FLD|vtFYY;#E&KKUdOax1X`Rd$l5zL-igTvFJa`Vx` z(F;=^8e41%4rUH0wyBkRMx^~HuKVsQnGVW4J^;;M&H`iX%F9+s$b@hfqD^a;zgmn| zPD872T8E_!_t{M=b95DY;7Pe2F}4NMf7sdGM5KmZ273^Zmq1~Lvm+KPbiqIgQQKprpOoA&D%`H4|i~n z&;$3yPoAG1iHqVu#z_QsS_=AW<44|+Pgs)F$X@uzi!k5N=xJUpgWj7 zbMjo0Xbg_$LnT z_DR7PVoeA#OICX#56G3c9<@;9E^pJynz{_FS=PDPK6}E*54q^FyO^6U*hLd->3n&m z{AK#e7J-jyws_#g%Ja5}0SO@9cZ~fZwtO;-fFY$gq#xRXTZL54st9*}wttMcKCA>@ z!e4KeMAeLuEeKh5Ug?t-uvKkD%u8*D2V_dN>@iE*SDq(9jPuW}F|oi$*dH(H^u$6oOV zAKHVb<81UFs`iQuR_eI=a;L8X1P)-#M7=D44>HNf(t3>yFsW(~@jI$0I%E&Mz*!SK zO-C9L6wBnkd470%lM>eql-PR)cKlsK-2y}nta*N5Sl7;d(%}IsT$Qk=6~X4=-7sbkUFl`E1?q|Wt%h~v4uO(T z$SB*H`KNy^%t1d3bK8uQ^5Rn0MCV)(e)t^kVl@|6%h!jR*N%96s$W&fRE=``$r*!k zb~?Syf7zz^!y)VKK1bE~RG!ZDarJ(!B?g@}|6a}pc7+b`^t+(+|^DqAFI zq2DF^^=gtFapaw_13t~*wX#cXo<3Ylh@Zo zlFeu938p8*C7m#FXGm|Q*ML$mb8lP7P`$K?|4z3!dKBsENkTNC!73vOoy#!Q-wG4% zQ1t}1{-0tbK@qRQvOhrH{Gh{j5_;rVQzjW?u|CZ`fl=Igg;J?#9U3{dc`g;AOUu|_ zUv#|=w+z!c(HnZRV^&uJ)gLl~Q8e+3@?HREYvNEFxu`}~gpRtI+e-VN@3GZ|GvdA0 zv{97F&_eD>0SDc$2ESAyi^FeXuG$@4aTTuQO+OiwtOBl-erD!8awN)K-O!SJulp&~ zkPrjF#>|;B6D1&!3twDd5p zY-qg4Pn@2}!!T|%Yqyv9?|wvu)y=3;Lo|M18KB^2Kub5Y<(&ut_X-0L5fxH^s?96) zUY1x9oI=6$xgu1w2B_O71eAKswrbgEZd{0)nr0NUgNl{9XZ)9jFKd$caQxm~j^Z%W zeUX6ucMeuS)^-b}N2H)NgR+_YR7SY=H9Ov{!7g{joC-cIEgs2vDzDVX#90i4KQ;P}^}GuBW_Y!520)e}KU^H&q-9lQrWT5+%`&!R*%U5{mU zd$u~Z{8H|s%n__S_OWhGPz~#{5r6EOPFbK1^i4}$dqh^s48BPgJUa}U2*Humx6g%D z0>`Sb`Mfn#P1xt|3dyU^7d7UXdUu%z8m3)pV1&Q}xp^HTHZ0U1h~Rn9DE1 zCm~%%f&Rj(M=*i-$owSeD^FVs$a;A^m$$Yi;7P!L=wd3;V7@27YX+qL03o5w47zl` z8O#|9HYJX$9qh?c3wpa-%M0nq`MEXdxYMuL?Waj=H7fhXct}V z+|8%cpC_oYSYw^1>_ieXOh8MdC)|umN^lEc=q(XF@vD*=uZN3n<@7`vjFK-H>kjwV zUtjXIi?(z~_U$opv8yRs(RtjdJPv?OTy--~22h;g)r&fq_eaF}kJUX^E$eKut9ONS zoaw#G6#ogYEdRYry2NcFllfRxEBM#|&A6+I_F}# zQFrw*WfsC)*DtVVztsZeipr5qx;cqcieKOfOaxRHc(V=M;5+kThg z-Qb=8YVdlNgSLZQ$`pbf_v7021vxwn&3o8ymz^vkwo8O$7B8jPv%PXFuxJFYsL<3i974H6n1yU(#!L9pwCXe;zPEtiBaUy!b;d8x(Qos zmf-h1v#ZhJPhhV+mw!bf0gB2Ao6QD@d1gosakZxgvm0z(x@xjK?+OOC|D*q-{CWL%!S(v(VIjZ^($uin3@d?Hvhb3C}(<@)AVhM~rgIrY@zu z>|C}w<#ySAZ!yZ%3*j*iG}m5MN!<^QP5LtpPx5~aj_POm`nic61Qv8`vVuwq%28Nc zHQIc_hYmBxP8v`C*$9SxCovSzmICE>a;gs1mKX67**xB-Du1e9S?W@8-$H+NS%tS2 zPf2=Y<9HZHzv1dzNQ=!nRBx!1yJ#!xq&k8h<*VQFg$s4fc5u!|$I#_>Bd_%@vD1_a z$_wMqP#oz*vz;VyU@i|;`7v2d++!Y8ye6upC`g^o(4joA<1(?kB?1zMXyg^&+T5}7 zvSmb)5^&#d`4A-7XE$OZ{Y zot8_qVq4b}Qm7rzZB(N*`v#vVaO8zW1VF>4#QHrrtfY>m+p!ekPN~^12?_>!6Z-wfZjb012v3*jbo7Ly}&~2iIKJjjU96hJ?20B zWi#(*4RNHNB|y$s$%iigPBpZ$Bx5fi$fOVvOv#YZM=jxrIZE27&mb8YtiEgf44QbOgt{ zr~{wwsP^Dq*9YI(cujQpP<$3t_Sdd10^Y}L&};~Um+ifgu6j^#``}4Ndx%LyoTEub zV6spnU$Nat?yu+d;T6M*bYXjQ#+g@>!#{_)nOR_}U8Y8kY{u+2#b&eqiA5$dCQ>8$ zf-Rz7S&jCppc=9{mHPdM;ZJ+qJ@EB!hu`OILSa8XVsZv!4pr#-mq1t@+_yr5&fDV+ z(~1BkrCVfgTr3N7^^h?olT+4>+u_|cyg5@^RFPTp`*Ttu7fmisVgwEiWH`yqtn6Tu ziAp3|<{|J>;E%R^@uXhI*!N(}?RSQWTC0uMk$F|+5SY8>;{^WhLh;_s4sL_fX*dCu z62MR+f9^==x=1lI=vT)wQ>`X;xq&YGLh6$s2^AOEJ4^91IUjBWBHI%r^V}8qWtK}W zKr`jTINaWgW(K0tY0-beR2i8w6kb)(bWGULyZ5|ur1&!AE@moc&d9#AK{nvtjZ*-;Ia(x$6M067Ydl5)wKy!eUHl;IS zAoaxF+CT#EIl<)Eqkauqr?2y>|Gw8n?l~%+Hg`*WccMCcr!wZ?8EooyJk^GVT!^n7 zQ|~zh7l`Q$wOZF(3mU7Wbi=EePQ^*I%&)#DVbfPuq)B*Xu@X(Vp{hzxf+X!&Hdi*h zx_}|02mW-hIMtj|B1(4~iW+dZzn>rR^VLOC3Fq(Uo%|AYFwy;=%dK z_zjrhGiNltC*PNzvrSr~P@)&N-3YQMP5%V+1;QFA>p;A`XH@j!nmW(k=M1Jgh-l=U z5jFCo!bW?tUau;)N4@!@*sR){bX zO-SzkXZsm=(s|KbWC&e*D^!a;Ypd?3H^Qmje_1M8t>Q zlfa!wNlp5$8*P39umKcBEuP?weti8StYxqI(SQ10+F_&J<-2HBuTatp@~UdSeYZ_u zq0MIo-YGF1b2gg9qfp@R`+g#+Z-K6mz{@Yf8P|j%k_lt5<@;kmRPz&zHeZsMmRfH1 zK=|}~>PBP#E= z4-J19##r^&efNiacqppCYvH6y?PO+*0o)07U|Ls5eHupz-@nk^v02Y<&*SEKqeE^ZQJ%-BN z^=po@)xfqY(b;^8r85}RUHAlQ`wwlAjBeS}IX|E1u*T&mDS)IvR{G)O*;`M%?LV&G zY<_KhdW^_O$b0umme5~~=wBI;lAgJtZN>AwiU$0L&x2_6VB{o2cjV`dXBSBHRCERZ z>RmgyH@iTVuEz4SbPOcHE4^JoU|MqB)6oA>6#wpo+{wg}N@i37?ZEQ{R?)pG>0oyH zNE{f@6F_fX^y6T=k8;NAprNR^UdqPQ6|E( z=Nq3WV_@9}KMFpwbOMeYhdZBaz~>hN6P(U*bvaqnMuz6Xei!6!iUN2IpPVuA4eBGv zr?4gz=$1J~g>cb%Y!cPT`0ud|pw2_bdm28ANJ;J09(I6p=YPO&7gA~l?&^gEHOyfj7Am)1zyH9 zawWBO3@gp{X2O2J>rhjK!EGFFID@b>luHqyqsxCJHZpLzqm+8J7{HLIQ-jNlhJCAKwgML z%NM0s4rxll5t!8!aDkfw-9~&dDTw2S%f{>PzB?#@t zz)Yyt%=au?Vn~3y#RAv*E%A#aF$;F}PhjJjX|NM7|M1E>0|kwFR51078yD~=QgN3Q--y_?&CZB1*(r3`QJ{Xw!V0}Z z+qOK9=Iej74a4O$S@X30*Z(}HDC*UDE)PX_x8q*>uf4*hA`MnCC`ecYCd(o^Zckx_ zJow{%eSHjg0pCWV;4Gr*I^z{ZvnY{oh0<+KR2mdeF#AN(ZH`qgj)GW@8Awu8xJN(p zDE}DfU=FI5G3Q`Qa<5WB#TwxDd_|zMxfCx~P|Y6G%!vsvsYCe}=Mgt&9m(BW1Jr-_ z?=r%+QT1QN42}4=IT24+(xK8AI1+`eI6^b9MCMosO&ee%Kk-2plA)hNcgXRD4(P-6 z^mMt_0zyPeboG&^LPSIzykd|xL0kHcq5`UfP|2JmI*JG%T195 zaphZ15loHyj*8}nQJQdnxhG-uQT)1!ia#{92bpWZV4wca;o1i{RTh&gOx`{YG=7O! z2*oZ7*Mq2)o5Or6{&S%_FMZDw-DTF}R4?ro!Ljynq;V)2Kubn5-1!tt$bw zIskHU13)lTBw|0^E-obUyI?-OfA@NZ;e#i4wiuAb;@8PUfbeUOV z`=wRn>y7!Z(3S$<8J|YD5t~}HwY-Rs&=PtF{jtP18S!TXm8o3!I{2I-UTYDXUr!UL zelm->_Fp^*jbAUD86T+YCxRWoWW`iMjAS(xp~zz+f6%Vc z;!xkaKkU+Sbufl{HJinYB%GHVr1Jen^}1w`pKb7Ayjev32$f(&@=3B`r^cJgJpUO1 zq`yUobi9v&3}y2{6=D;3mFx%)%PDTIdULKf>Qz=+sYUFnx%!uUB)dR8BmIBZQBl;{ zgGAzk<60%)-z|df_;=NzuvOX;@$PrDIv0W;q`4A9vyGUjO@k^q{!h&1E>3S+i^oXyr#{)>NgdaA^-K ztE-(IX}B7`o!!UXkDJ^`Q!T$>b-?)`ucSmf5EfiV0-1N8CFrVmVa z1t3w9pVPM-2PM2rkx7X{2Nn$DgRfFZ1V$_TW@D+PQK+|oIbxei9N3X+1craD-_}kE z`Dm}gsd6U^Sa>smLEnd=Vb{;apUwW_3n$GjyqV@V`{xF4RhJk^GDHq!MHT{|;%GO0 zxEUrxz2{HE(8k2SU}D}_pb;mj6@>JIgD`pwn`xBjK-Hm*BWkgIb7K}KUL9Jv9Li@i z9fy>kkv^9{-h!xI`-Tlt3=NJnfjK`U()1iT%c z2hz3}Yx2C9Q<1*O8N5V;9{=CShURz{wQ(8N(y6ueo9zyaEOwJ)%wO^Aq-eF@Po<({ z^nNt7M5I(#;Hb2PhY+xjzSHNlJgs8fmq*=7)H_v|>}0Vz<#@DSC^ZI2%rG>#lh*Mc zM}6}g;gb>#u#?w#mR^}zgjNnKs*S0tl*N_K|(9xSD-Yc zd%Pq!G__Yx7de(+bjX$g19kppuQY>;a<37#C-(ZZNYU=l+_A(SOa^;Z*?iMI!iA8? zH|st(f;W}>To#Ak&*vjaum3VaFgJd0@Q>ux4?yI-=dWHfYcGdjC!j7Cg$mkf|-O~Bn_xIOci+k=p=bqj3en01Vp0|(4ft=H^Q_in9>?S_* z_8BcE#WU5*`uel=Cd2DQmn%&Q-0niYb>oGU1kEqiK7XX*;ceig(u7ZV4YKg@HE>{3 zIJC3+8_g*%zm6z9=2l$rvggJg{4Z zc)s&~pu6?SJ-ru_4WREu*>L=MK%|HZjavL$dOFaavuZT77P2}j?RdN@+w;Hcuq=DJ zTIMV3xa)Tl_J8%B1i3N!^5{7#uYZxz<4sofQu4&rHLR@V>Cpc{@4@3~s{9r%LuW8i zv{A`$NR;3BH003WX;!At=WOy&`E))r^>iNNU+jIpGnS|S{+HW@%;P_Qi-)VHvyrmf z-IBR1)yrZ@E1LdyAJ57~I4Op%ucojeRKGy_j zo%(uxdZK@z>u48T+n%}dh@rKWeG&2@6n}08Yg^`FE(2&X;O%?m^t5e-EPJ|p$})Od zUWS!DT_4f7Mtam4Fy6MmY-BJ_(bk)ck31AEY|kd$U3ly7jW7aVWG@ z(i!wk8&aiCWW@|}qKN?1`fez3{F4o>r+U#F6-}?LA^zZrKtap?>#x(esZb>vwIL6RRc`x9E89w#? zOWE_khCh|x{;PayrQR!DNqUwrx5CRPI^8!sRQ}~(Zn(tg3Du;x0`~JAXc$Q~Q}4)3 z1KpC9umj@_PT*<*crxRU9=En28SA9s3s+k)cQaq@O&+<(NCidKq&!DeC(<0O}X9Z#R@zA1QT zJdP3C>RVUH7E92V@}lbP9wE7qUNueTBvkWg7eb#vo$S{Ko#A**Y> zx4xy1eyx|#V?wvTrC$HL7^+$y^46?ebE-m z#|k^d{;*ms3(XP+ocG3J+^SB5Xvs0?V7!;cD0{>Cd>Xex#8#cbXZAf=_DuWNR0+v* zrkkqE=oL2h7GuMTmp4LDf^G0eiVELbibL2sAcC>Y>fN+^*0kI#JuPT{!uM*$(b5O? z-S5h5`f*x##+26x@nw!JzvK$p@YLk@WMeK;>1On*q8_(oNmR6DTIP0|q}>4jWM-lH z^rFFoeq*^zJi}Jg{euNve%)@>PL-L5qo}-@40G|1iLfGvWs7#XT%cL|mKy`@19MAO z>Or9`(*38%#hES7!(oAoNM+lavr{T&#YIBLcT6PL(r*4j9rVz206pAo>pQVC+gAo7 zEn_?0S&J{m+|-a@5jyJzEfuSEcr)y&f1&Zl<9W=;Zus#(Pk-m~W1g0;-1)xdJ`Y9o zWyg;@t;5h^FxLzmR(FgCew=kyUw4$c-{Nnv$GvSsT-Vb!y_AOePApF*vfE{B9YcLb zUdR7PdXh=oDqUx>r@g|^eO8zC<-S{KQ+`L2fdfvG9p~MaTNX1iXs2_#Y!APi$jLh8d0GzrW8{ ziG@u2wXOQH{=`9sSMIh*`;A?w+Qlz*&u!zDG_1^8HNTL@1~RYhiy;TCVB!#welGTA zh=>gYV6s`0v8el$Z!2-P{P@ps!`O$fAH{GsQ!n}!0%Mk-ChXV*ny`$1`{r?IQ!(Lw zHkXn}qajN-703Wt4{h!N53<;JxY{wz`_TCFn|Grev?=^U)|**o^i5V=vWF^4Mga4) zinH$92Tk|JZ)$_|yd&t>@pxB#o^eydGS$1bV*ixj%=+4qq#`yr@WS${oj?(33*@Fg z#4ydVJF2+_ni%J7SjN9*n4<)qeqNW^XfoWweZ=LXguAiR$^9czTRStOa_TnSIH`Jn z6goLPqntk{^e{@}>gB;W|F_P8VU<1apm13C3C7+Uw7&RQ59&8Y`78;%Zie}aXY@4? zTt~vY<;1<>T!K`Twj8xKf{>4Ahz~)Vbt7o}e)$5*n*a~k=YrH{)GMuX+C6N#I7|65 ze3BssUFZ)Mz1MOI*jkunwUq9f(&^lMH!=lx8ViBfxZ%p_x~Yj@Y_{m#b3mQmCGweS zfL!Vcrhg3|a@S#M{ZaR@zWL8%-|c0}znG&BZZGp&{RARsS&pKtCN?ffa2N+>MECuq zx|$*N`#s_Hs<^w^s4#Y7@YEWat(ki9*LL@|To=5Wq?E6Bk31w}mfQ0!tc4a>A^D69 zryr7F!45ULGy7siC!tW^9(uE$xt5+Y*o=#`f)SF7zs1N(@-?u-5@rk|4UH3V zAxx~=;lL_p%hDB5(41=tDz5XG^HDzD=Fj5=S_GW2D!%e3GH;^NJ;9Lz@&_(Ry7h3E zhNcYr6BzrW&MPY)1B{u7d9OXFQYY%Y9(Wsng>Ihxo{TNvKZ#HIAgg1eD3P@MNDM`#c@xV1VKz85d!N=B*$jE7-l|?SDusc^Xz7b< z`m~k&=dT2>Mg7yjTGE@A1W$FQ?LOpi@bA^|7EC;O+VG9?vs%tS{wn*4Y?p0`Lnd@- zZ-Uscfg>^<^K2H^+wW(}xyW{neH-3nDDjA^Io%3TMtJp?h~^gm{?8*9sFSVHa$CN- zQ(U7#6|+@7{r&Q9htEV0nG8Wcna%LmcA#_`m#kup((Bwi3b8{e28$SZK09-@I=t#q zozw7>e+^x1&@fngTf_Gc2kV^DG^lvhlYH1tB|1xgy+tb9!0^mwEG`+41` z!+**~Gj&FCt&25H)j?!Nu$7(HlTd(p;_5s0U!Bj!VwZD+6ZKO(0UG5}b-G+g=Oa*o zv=#Ajz$iH~VaQG~PD2)t`~XIHUMIy!h9j**vULcg3XDZMKqPs zY!7@$J$V$FIOU478yR_}yb(&y{YBG2fFADNh%B|rx(PW}k7=9|75R?-!f2@*JyDOa$YfgN zf0_o5`#^w>Uf`*EhuL$H--VjDBpJoD?_4=)2fv&%MF@>OeA4?gMds?bLZxpS7mrdGT7|Qlcr5g+(A0hAC z>@ABFa7@vTPln_JM!0Rj`z-bnt!Tt)RV2QBF4kpJn*(K zk-ee8%{u2~zG%xidp@_F4Rs5Z0gW*Jx;Cjfgg5yH2NLPpCY&P-B#k((b^a8OMjaRS zEhqZE{Q>JQsq+9Ch91PdR({IK@xq;=9ThN5c)#TE7%o|_EJ!ow%JGY-W@2~&aRJ8v z#6*JM?~@=mDS#WiR>oYChf(V()bpaTMwE-A1x#jb#_`N0YKe`y;U(c}tU1%|gG%uB zm*|oKA&z+l>hEk#(u7BPk51dgW!cC3D^8^hT$r_}gr-F1rDU{6YLOVA#Y^$o(Af7B zraL4^;fFbcN`Ty@QMMe(QjYP5wJPQ&n*Y|vX^%Di4EygsNDr@WBS?P2G6?5m*OPnEof=h+V zV4kKJvQ5%xIVU0UGurZH+tr5_o;K+cPXiD?s1riTHj3)UH8zt*F!v`;;EITGhGfbs zX!?`&z0kg`YQ6hnRqLr*-d4czUqU4TU$PP9j>l^bhT~KmHXXlCU82}yt!?ZLp-)iw z3R{HDi9AAqxmfp-S%H!BXW)hb;sco*b=M~uZ$g6xaW;z>WpWI0OT=Xf5Ky?PdpgMc zAK2joq?I~m$k*fNrRW%xKr8@&iUxxR zD+xaNi|8x1mxc>7KiXxNCj`9SHG|@Z0r4+CVMz6V_>2F?I&$b$`1V2bvh58HDrfzH z(^8Y|-j_tLmOK;Rznhwr$hYV!lPz}S*F&_dug#5(pi#Dye_*C7%Eb?8?rtHka2hWD zb>l>Aa_(hqGSM(fXJivnuNc4!RPqIgH&LkOS(a1Q%gCG}#_W3m+$wVK=b~&5Uk_b- zc#yr|o{fnMqx((yIkuf`{f0ByETOtGH4aDdAV8f3R4!!@Sz$gFC}KR$9ZTw+nRmm8ccO*YzJHlc%5 zztiaDzO}VcgA!OcibwD-4Q;7>lA~X1sTb=AHaGphz z{Ird56<|*6L+L%VW?#8OA9En^c+qV^^~DVm+IoNdDb`7Eu|4cIiE2xInCyJ}n^Sw- z9&#?rI1$fCY0C#3qgHRT6R+s$A~Ix1<@LSq&)qd;cB@>EofoXLkjA*tV=UX2Bp>$FBxSb{)+khNqhIQ4_qLIY} zdsa8X>KkU3Kg0s+^)J9!g`rvSBvm|pBer>%<{mef`7XyIau?_M`4zgc z7a8qOQm!_n)+h^Um-#E%A|zy^KZ+b4;RvGgVz|H5Ohg;H%i+kvOX5FVZYsG~_zLk) zY1@j>nbICw@7DP|SP&}(0?O)Q_-c}7n=xEVpi+JTs)I1nDY+8C0*(5R2he6E|4 zAC<}|{YSZ7KRsp)8hXno1@sScRCuhJY-TC_(uRp!GS;`74}T_&Wx`-+|NVSz0Oj8FT8rF#MmD7A>KnKIfNmJiSTJabid$E9 zEUACjB`T(vH9%3^RIXOB=rZA-x7OVGC_{OX=DKby2tPYmW_M~9O zyrw5Mk99+NCl0#(UD&_l%G$P?`z;?(KoITIZvr-ajHiDK!A(%m_+cj2V%~d+nb5)W z8@?V`>Ct1-Wi=Q=2foZqkD!X_LJ93w+kbDfIn0ajWCzawDAq8i;S)m^=Dah&nVV*f z`GayD-@WQL$>jt0nb3j4N;S^gy}$LEdLR1muJ&Jz&M{2Emodw226U8~9jnx93;xu* z*>Vx;>o@nM?pyq8*_Uy1Q;0yZg>EP+9ivuVFiJ%h6=FZVOkaScdEHj;)|K{DKi2OKDqs*$nG zmHYCUM;|IbiBWn^OS6kPx$oD=0;qlAG>ido2&6_$6lmejocI^T5qc-aCJc7Sy5DTx zOw1CoRyR}ZN8P@uw^FZafrv!F$DkQPYKNbZU#yn-UW*Nz6m{?`5gEy zGX_VRL6@eC8t!oElgsHk88lu#pEH&O_r4mVbAfVvFV{HJiEzShY0^(o%sD+)X+^lH zr2xv(PR5f4V2^?>?jW)<+d!Jw7OieJr(erPVeqv*T^l>>hq zZwJuwZn)lFxN0@I&R-uX-benjW%02gZpeH72&#!OECompi~}wb{uKISMfgfNZEaHY zNi7#8W`1BwF3Nc`CHhDK)L1)c@Ze8@&mYD-qKo=0dRlIeXA7$%cN$}%^6ODUq1woqHcU~VUo#Fj&Kl2c! zqe{aM_%NS!rVGfF^UV1>z#ZHU`%7E2#a;b_iTd^d?|{VHv2{m=VEEURUYGH(o$Z`} zPlBuLQMhCMSM%B12cLDIZo&m@Yvo!*t(4RY?u*sZ!F&%UwPS#ecR-5=lV&LX9ezv? z8kKQTc{69#yk35-qOBqM3kHokGI8fNhYlxv)7Wyf?*u(HZy0U><_+ISzUVcXf;U_O zr~f6HB@d!XBYvWi{=`2T(rBnopFGdf0BMyl-ohL4FmgZT zIjkw2FK$M{60UnpP?7?DS0qdT9|D}twK%bTnuC*6g2~EGso?C;-QVGGnRmdjM;;_X zPZ8>-nap(mSrN*c0Z);=0D{9Z8z9qDBPnUd^KMlWb&WGy&Fv#YweztBneam$Z;Q25 z9&O?Hn3W5uI!u%%HqxE6D#$PB!YTB9X`RE#7m?OV{(F}8c&G3*9)nxs^MU^k(RuKF zSq>4KqW0>T*gi=>@rG$|b6(ZWrkjJ*6fwf2A=E$|$O@P!atuT01!$49{=Hr}9P7_b zL83-v2^_(j01LprT{fSOZZs*cbrL;LCh&XfcV9B#B9q|=YAAcHeBBU3Sn8c1vRSG8 zzf<*DkH`J}G{!6kIjb-2YG&QtM|%2tQeyATUF2+wUar2s+{xE=I3`lWJyrMooy=`n z&^HU_Ki)b>F=+~}iqBKocARrtS`W6g_ojJbWJNlzB(&ayw!a*MCLOzhMc7qXUEC$N zv^7Z93~Y)f1beyVL>N97?dpfdz;~M|JLK4{wBOV4Ro!?tv3BH z^53*^9bR}BtM=?+P+H<=hSAB&uCL-Ezr=^j1-%JSl=fx_TfqMN47X_{>hp{;S7x)*`7c8k z0RWn$bs^0T0vd`Sh5;k8uYfrW95SFqZ>#s~vC%p?`BttlIKyfs zVlq)Z=47?0%5yVvEN0I+RcccDr%1`VfDmReJs0VK1Jf%#x{4K0Ef*e6rY=Toe59V( z9dQJ?jpzq7QUx|lCy(y>agtKP$mZ|Vwfc)SKIyMXe>Mi%*06g<<1IV-pG69|J>WI^ zT+z0kE)IbX=a~2iL35qRXe%Vhib4bQ($UWgw<%T@;I8$OK?>2M;AY=v@FgV-pn>zN zzyUYTf#Fg^A5z-&L)|!9fZm8hwQC?Q7C9{tZ?yb-)_|Oc2~)qdIe>O5D}={*_jnJq zr7wVb?|8kK%`YZP}(JT$Jep%SUZEA_BY+G`u9s#en^la+|}F zd7|?<9O`K@gvmp4UJ*l5AYhHBElw6_eW6kW;N(dX*Mwri z4TBx^NM-VX;leJtGDQBn{EUh`4&zEOps--8%#{8@^`*JBX^vbpg&l2}a1y2&;3W&? zTATuAE^I@O>0V%9m?90XZaIL7h)dN=h@g86;lc}wUq8U)t5<6&|AfRlLnJPu59&cp zl`afZoQAfaMbEHSEyjxJ56aD6Y5&3)+;j{}-=ngF2G<2q)1DCxm*^a;5|8Un?sUi5 zOJ{u4S<89L2N0+ra57Q_8q93Mq%1~9p}gLQnsUwg%Tie6`E=>L8w~|c?b`?2pfDt+ z@^|i(FZN6nz|;H4yZXEUCrb{4>xH9h0IQW6?qjqX()M_oIFnYfsCBCq_LpHd|r)EVTB$N}!+pp;Y&a!A%~qQdFnO znqNoNd`h~pPdK$ZFcquUB&9O{FWeSMh|jOx9L#906JNhuP4nfH4w|$`R4wuVQ|V!n zy$P_175-$AGK89AygmjXlWEIBp8xVRW_-(YclT}(!B4Qtj1`jBC$EmTQD%n8v-4bH z$=9mtKNdivQjRS$9&ubnIr7NN(@uYuTF_r2jkWYjsnWMI-CQ2wU{zDeAb$34l>MrD z&kqDjmgIe(w{dLNT)9p7;)H+1xnA-Fm*?!2M{JyTNcWES!mE}5W~E)V_c3>$US&w} zpx7e#@$dzSl4O&Q2GuEaY1#4ARS?T5XATk?mLpR6%f`p2J__Grq~@6B+`CxW`NTGv zl@LbHRpb5==Qovo+_ZF}GFW`1dN&@S)~}qh z9?ty&l2^P@_A#1Ufc4J%j4FCqqr4DOE|s|1i0NW~h@i}ryLs`;PwCc1+j*qbAHmCo zT z749#)=wntSLQcQyt?a6@G~yWW@W3Tz2HErBI=8xh{z>wYD{O%}T#yMVeowHuPY%@J zvk%g&cJF>|OY#>%3u^mRCMZZD4p~Q}qJo_uM$NEX$a-~AVJ_r^xA9pjW5;{PdgH=z zg`3ZaiKZ9Wz!z&Y+H9wNl#dbU99-5wSHTZZ%Aqs9W?!QwmV6Q7QLp|ZFJtH*X~#*y z>le0bN1*yMVeN!jHweg3=~>g|ty4U_O!&?sh1;);bIw^XxlAwugQ@cxe{zmLnUImm zFC!D*LEDMrJ$`TgQpSRB;luB2PkK5dS}3b1chFR6*Gee-{9-~+)J%j3*qalk_J;|; z%^{i>Y{uxFp>H$(3!{gf%TUZ-UOX8@E0v@+I;?~^|#Qe3foTeh?0oR(byT5!+W z_WKRM`o?h(6d4JZQP5<4pR*m;eo^GoON=JIqL&q zNaL~g3vsUh!VZpz`|(_R-k}GpNG(5%3;)YVNIo?eTOF3Gb?LXJx1sU2khC0m02cxT znkL@B42O5LpSrJ;3~%z|GHyCmztk4wK<*v;|Mu!1*!`UtdVrSyq>ATu1FhfGocSD`NNGe;s}^WC=e=OEjb1+fP^u<%NLSa=~&l zi;UPn;qiIK{|bO@um63kZV`qBu*pPF$fS4ucfDnrXZIwFPGf?8J?c!6Vf94A%HHlY zJKrAfiSE!V6U5ZNkNyXDtjz~<@_FM0!f0B#)W0It6TxKaU4>qTUxGdS{hdExYumO5B|u#ICJ3#%M&k^;*3zObXiM}@ z6vaWp)&@`7xw>F(xFDD8vPSD*toq{xYi5 zquY#~pv?wK->kIkp8ypoPwcP+No#!=Sn8Z*$~4dpDZ*}<<>mi-y?nx|@Io*&i~mq$ zFMgQdlx^D7r(dnlWv?wHo5;@m1L#??L9RPt9`P5oa|x(< zt>RpM<=kSD`^4uKd_lS9c&>wqis*LUXrN7J=ugE4U(z<);jZyytm8jk4{C&nYjG(_ zkC$x9N;`7Keh!Sl2i$(ddmFtqKl8?_J4|b!FDh5YuI+MWjiP02&cUOvn)`S79vA)% z8BRu`y6kU$+dE5@baWOt!*rZ)#XQ~wNPmgZKbiYsXVBz^sKGO7?4VUzqFvXKIBBe4 zhY0w3Xm&qQ-Masm1*+2~sPvclomuSigP!?-lsp}cIf+hQg1r&6?U$z;zHeSh4nZfc zm{vVa8eIHh51@Na)qJbr1d@P3GXq2ptiC+gi2jF;L6);iyJCZOFGb(rAontCUuq{v za2m0ngkBufHL{|&%WS}gYX%#I-qCRV%3&KK@TDn>U(d@jhPX;zOP89(0o20^|C4*Q z2a(FCfB{vB;(xq>6a^Zwf3Hlxfg4LgkK5BTNCCWN&YqVXT~jI>xY23eW0A!&_bq&O z@Jpw-B`MVKsj|}I`#p_gSqVf{E@p`PUEnZ@@`OgH{K^h@js%JRK7bHa8?}k*7TMLb_2~em?MG0nw?_8~_ z!*X3FIU4<_Aw~_~N=?(>rR(j-|26AHHD6v2E%JTEwFquNU)IQiF<`44g4xeDbXR!m zck%|QgBDeE=yTq_;L1@^~Aq{|>bL8^jm+xK9g1{NN`%N+A7k^Z}ht_3E)5?RL zsF;^MJS?{VROHcfW9x(E-Gf1qlU9z`6=EBljE;Q=96H3yHPY)wM8ujEq7?!+%AeoX zhci1xtmyiRBfqrhI>XHm#le?AB)EB_@9gvX*vYSj*-n&@1w6e&A3D5zsUHmwSmOzk z#Pw*~t-st}b433VbP1;|vbAkNcy(0_h((Kd`A;vTuJJ_C0@K^U>6c&;22U|R4{V^u z|A-bazXhC_ z;3ShL>vc0v_lJuNEguI6>%^!$YZGeb8;zJ_>sQN(_k8YF3~Wp04lZM8 zlp%LI?=?Pp7EL)jOV#rtMLbrY1Grr;QX0(V28x`T&B4;q2HmToEnpTui%OD7hWJW8 zhhs@zru2k1x;qU~AoI);9k6A^^N{(wuk;cBX+Lq9{)uuQYQg+^jyo#O-37WnI`h=R z^vzol=G)E&saQn6{(Cg=Y3UF~E{!LzkZEo9@%dAs8=2E=Z`ZO?kd|(Yb+PfV7~k## zyM@7(UJ(PoO_7`>wbe^XB+(R+w#8(v)4CX5+a7AaG|u|u3D8^vtQCJ0wOTr+_w(J! zJl?qg4TJr+t8Izdo4+ORhpzJiXch1e(FTw#dC^Y(iYZGBm_UXx=iF#Q{~&Mux;9ZQ z&?N;2XGR^=I6m$En}Uxzho=lxVLmRGBklT}OdwnoDg0P7e32y*+h$j+TKnYQi!#f0 zi@Chu!m-5vKokZ@FXC;8f{#54zV7Wvq22yG=X|YT#K?hRvBooY+~@VcE{$fOf_U-- z`?O2IL|y(Vug@d^?sb0MR{8k96BI`+`h-1_OxNKqztFc>J4qRyY?-+R_~6188i!+9 zXNXw2MBNFXjhNPN(}>Wlh|oQn8)D)c_Fj`2<#kq9%E)Q0KO}l%z1a4gGk6qy8`bIG zJ16`~Q@EQ73%M6QMCw?x`!My@iDL)}6Y$j#6_Q9Aja^U`*BNz^CP_B2=h|Wa`%Ljq zvlw$^lYdd^w?gZlxCt7dX7wCHY`68|48|x!E@}0N6t!CoEGfh&GDtE%|GSzi&SL{8 zZv*D4K$$&zkh4AJ+OXnWZfZW_{S>2PH6C#NKGq_us;t-ki6*T>rSQz0%AIQl;OPv~ zQPQRFOp8EcGB+Aw4^|yLlv1qLi#~a<^&T{cIAljrON=r5pO851sq5;{L3J-TBf0lI zqP9rQKAS4ap&v}5qesVUiQ90#YWI>=Q!!Sxzj)oU9rn9R{P<+yc|M4;>0inb%IALb zWR#ot?CQ%OEoxS{ZA*_CC1Eo7q#dD)tb)1 z?x0p(C&C_g!AfR^5!;SD$k^2$I=J9Q6m-1(A4ekED)U}8cekb1wp~mcx*8iM-Bpk8;W8`{G2KjZM z2CbH`@71L}))2u}-{0-Lr}%>CdtuY>>SnZlSiE3-^D_{hXh*-8b#eAD6*?HV&QVx7 z{T^DNXci7X3VfyuB{2EiFXit27Y@@E!y)CB2Vg8xra_3MO4evyF@B)keL|}9O_{@O zY~}LY7y)I+JCORX_ke#qdOO*@o_cSFNZWE()wRCHeUuaoCF%q#K?}4$;j+F?q~f;A zpmirTc~2imv0NN5&X~p^6Y&GaozNt3$gf5m%%xA4+XR7AANVRb`S~l>emt7nVFDCf zvB8|P0x(_BDVG+u-m%u!g%^bF8BnH+0~w;Ds*=2GXV|P+#o(j5mR?zKFhfc_xfr9-A?nhuZ{Z37UU?-N9C)#Z#r}`)(0{ zOT0gbhL+^tw2NaEC7O~ZTYliAR|bpxt&`}hiI4h^PO3h12@{HG%g<$PR*4$`F+1k;eAQh>I%=-l;{sx z`LhCoIL7)=x-NHZJYvFC5!}z@0p7-io*ektn|&rK&hPt3RmyYkqdp%pT8i0&KSfQk zZcgiC&;d)9J)G(lw|;*5T5rR`{dG1v0D^6xMfgi;^BLi36ptz0a1Ez30Y1M>F@Uk_ zSvVYx5M-_r-Kkj}pNQ$NZg30~v-EYE=t(Y6MSs+-UJwRH-u4l;6lJagnp7z03H_~V zR>&&pgATa{tpekngi z#F|;m1n8vXsl5ms6W6KB@sOU}dI{qW!lZRqfN3KF{1GC{>w@Z+h>eyH=_&o$jdjOr zKBC6f29-w8p7t|Zjxc#+DubFoW3OMN{5*6u4#zlR^gV;n=UZ{0j_7uR)99UK)1va; z?l{CS=r;c_5LD+6!G0lO(?2c|M2%MvflU2jaM2iK(didOVs9?4n#I75iD$fN*;&T> zPzk7!2zT70q9Dfj924qDK-Ih)U1nVG!6)){A|=QTN6bM*P!5rn;pi`G^We14LEG`7ZpHV(&D(RnP~U=$wymX4)D zbomuQ%+a|Zq~`qm(ji|=V~%Z6CMpu1tnlo`D9sWUzL-@%OhAwy>?5e8=3G%18)*M z;94=$c=X!`+zro-syn>S0Ryr~tW=%)rKN?-aqw-u^1i{5om9?ncSUMAlp*+P=CVLMD9PaULTm zoHYXD_NpW|yP8HJ)>2+>vJ(}_t}65=cs?L-0itwAWBEt#lq};fK+$Y43(Z3^J%utU zy)iXrwVAR;+@!}xV09fjnKik2N^CkW z*Tyb^vffJGSw~U8s~0=UT22d&jCqbhGYt=pn;`#>fzy4DsPvBG0 zAV>Abb`p=|Kv!Z$P{9ex(aAUvb^Vf3E`T()M zU3YQ!WcJPI3MZ0Dq7|EdbkgMmmH_UE&k&eEx-}XqpvExxoHq<$_NuL@5)*v*SzHlD zGAOFJ4bUh~O&lqRP-6!!Z{53mnV>v{+ddoUMOiINuIF$f$E8X!<$vS>xP3fuWFtNs zI6@zA!nT4!3oaNT&<3%pYO^{;ymR5lF;}-( z>|+0N>&%y45vgw^hXeb<`)5OU6eXq%{WDr5(oyxMc zdcb{^ixoeYsNV?qGEk-+c2$C{%f&Skr=fH*F)=zF1gN2$=ueHrHjW9jSs2o#%d6;i zg28xEg(oT5Tdwfk?4<6b9j~%CJ~zJO-s5c%wU>A#aZ$pbubSR?vg}A8N}MoybNPOn zLJj1II4zqFlt+=XQetKMIs9minpbWaQ%0&(4o^sPr9V{yz{ls!d*oqTFSi@j$YjdvHZcS1MteXBOPe5*vF)sNYi zQ#}?w$KGZ*4ITTJP3)y5+Ase4RX5|a?ePsxQF3~9(W9o~GH=y;Z6{jegBtcU&s@ZD zld1*RzdTFb7ixEVn(uIM5bfgal{=pU`j-U!pg=1C)*SKp)*MZ-Nur`06Baj^&zzC= z>SNzc*noNKjtJ<~w~ecBfg)f-_lf$@r^ZW^bM1${syjZlk|q8-=y}H-V4hq|bcxQ| z;4&qhaQXBmgo!T=&bkdChWd(-j}}2_Z^WD?FQILbd>Ch(EntX<#lNU1c#H4dB~wf+ zO-tbgv1vdA++uY0YU^&Hu`D_J8^HI>9@l82PX^D}`M`a5GKE%s9#@O0$Me8Q(S;G>#k(YaYo%R8Z(+5I@CX-lTC_WisFeW#q2WudRj^(`L!>ALY3n)y`U z`%NBTp7UsB1Jy&j&tc5NXK{gfq}5(&R}*IKOW;NN`dAEgF_>%*3J228D%6LglZ+FQ1IlK#UN{oy0U8qd%1_41c7Y3t_QCK&zD#iO|!jn}{! zo2ikHSt#fFU$i+dfg@9_WPZnPYSGNw_XU}8x6O5BxEDtW|BnRm1jpB5zHYY1C4s>g z7ZfzE|I7Np3MrpnKDKrX4rMopJ-T?a(>60KvmD@JRJ(g2OAAEbI~BbW=IDkl-zlaD z0$um@X3<9~;6$`Jmk=F$)EPN&#K!cI z`r5?iUpRS7*$pR}%U}TK&w-p`$a*Ed9oswID1Z1O0H(qzdN*LwTcVr~=;7)|=vl^5419u9a$}ex5BHeel!7oGGxo5hjY?JmbM(YqwWf38X$P&3bAWtJ z+1Jg=(O~wnSB>QEZ=z7-OJp1J0cgC}I1;xlu|?`VXNLvbTt6>hRXx{_UI+XIRV1%O zWL?dWh=Y>JtBOOSym}yEr2J>ai#X4eLbkPFdEo*j9pARXzQTHN{?+=+&{ z1xsro@6B|Yzwk!iWY0Wbz(0X=XYYPhMNOCe@OUwe_sOqw*AChMG}V_^;c#6vq0s)V zsmr*_Wg~bxjwT|aqx}}m;y@l%^QRE-nYL0>@L1yN(d6NMVr^8&^y!eZjp6EJOZZu5 zH_U|DW?7TofK52MJsJ$>^gK$-MKk>5fI_!i6>SQwOc<`xdJI3+`st7(pkw9}bf*!} zD2mFE?nVoQ56DoWD-K*QLQz3NNVk@xsBK+36Y-VDdtTo2&P<@^mKNMGd|p^T5M0G9 zn#oK<1r7$eu(CE@SJ-a{Pu567;t00MfPkdt2}SzdwAB49xNHte+&6A%%c> zv?OAqPt)msZHgop5YZ<12^7FBOS)#@{P%V6_l=pKtE-vzENLx!g;*oI*B-(0VFaH< zz0Po>aFB&IhvnT=SjwRx`>OlWLElAAM&JYvpM z?Emi0RlNa}S(qAqdb1j<+}zb2N|d>Ov$!O6(YE@aDHL<`P+s^AFOf#&PJ_H?3~CUm zB|XDXh9)Klgu&5bKbL`zJEa=dV*7&4BfBG)hax z3{h_zg_3gQ@B2ZRYnpZs*!}YJj;f=9M`mUpA1Lc!9$q{P;To zR=IVn9I+Na%SS}>2S0)t=Rr7CYUTi|J1@7Y5-G@*g8uQZWSV&&qqgJ zX7Nx~%xEFEF?MTRr~$19bdH-BDZUraK58`%7SY@)*WnPgq+m()SIke&rrfkcFY^^> zI{8yLb%6%js6bh{i#!4P$<9d?ScVz6AjS~GO&0ACJ|w(uN7wQ=e7(Oia|JM)W&|kW z*k=sn%4Sc8NE3tc2WMoo2e~)i*>ys<4k*8S^vVh*H-=-_o3}C}m0b+Qmc6?pwrt)e z4}9qhF;+qm+#Id(xY7L;mQ{lmWNr@dmjE>GXlnT4EaGoiGihibw1Zm~V3E0_I{N70 zoL3Q!4L!JYlM=6lTbFoC8J|B zV{|DgAo$$x@A(@yfn7fLzR!7`^In$&2(Vh-Yii3qAlNtWVuUu}Wn4?IBzowDv@j&( zmw4nh(})qd>q9ewabwgjqIbM)6_7A5mY^21rIg=NE+${2_h};ti0;8qBGQnaV$Z+e zmG!I?iZ?j#PhI`+k?$)I zj5;QMdpaM{;V_6t9@UkTA)!N>zuuVl*B(LO&jcosYqW671#L^jB8)@FfW3RfRUJ$*O%pAq>=Yr^m zJ@{uhf4G2@_}HH5euq`ROh>DHYOz_K7^Ae(2l>dqOt`LI*`{AFITcc_Q>@CY~Zi@AcCgUXd@EIb&78e#dTt-W2wdccPRE@;am5+hPPL3&nK5?HKy5YL*_?Q|>0Pk%Et3?xtLBj?!*E0MW%(aHz z{~+i$=98R3r9jBqB`U;+jfWn;Qh!mWis1VD1*|s9*C3nyN*eI@g{$be*fZ? zuou$oHy$E%K?m|Qb-;N3aU$YNG#+MkpkbUHxT2$EdQEoP&u+y^5uuAtFt;WgsK4$l z01g~kh(HH}lW(hw-PA7YiBd&#CAQX6WoSzaLj){DmYHO8$GvueJHjj>24us0G+#Hte zD0tDtHLfq9?@oHd6?NsmKe%^VMZ^|HzRD}GMx8o435j=!c+r|Zh7qCm01+96Q~u#4 z(BxqL7_bl~Ws;;J_j9bqQd}!pmOfWSp67!JvPS5);}+khK0Ub<3tw9iC>^|K6hlgL za(d`R`>NCxy+h75je%zQiPN=8D}X;jmWR1m^))pq}~Xj3vIQ6vaX{rhaZF?2MK4uEB49Ed2e zTdN5*2hwpCGP2O4VWB|z*|3rObmn8lcLqz(n&tW#z7Q%WmqSec9KP9RzHY0aVJ19V zru=MI9Lnu=pgS(SFSglWi?$%as5e;A)}7DF;KAl8s^r+vI_)4474+^6>W>~K#Jz}1 z-m7S7L2$5$cy~LP+uVm`E^Ey~ZV>o{)ua4rfXCR1`)%em9~Wbg_M*0tk5*oHcb&IK zR>_U`V}=to)q{;`qN^SA`YLi(_L;PGu(%?am)cyxa* zk><5$iu=Ih@zmgfFqeon9AXymlxsF=(gHzd`0(YV`2`>Tw^@Vi?oA7VF5!9jxdE=5 zUwo=sF0qC{s@k+FOPAjFA0KI_GMew(*fitTlXzXbr%Eb>35x~O&xZob3aHG-+|QL; zBzlkMFAz8PGdicfhV8#+1{b_G4EM19l7QTjbvxJIO_s15Hl7Z}Iu+M)tf_kaiWE=l zNOLGxLAUk-p_f;M9%xlU_%B>nLnuIv+}6%nI{L$PDm^?Jo zO*L+E`}O&z=8tK`^#xG1NaO3+RGFEcscY*G1Kimk4Gmj*qU2aKYyLUimQDOyo=JL# zVn}G9{mY2+9zAMZ;6d5%4VYO+=X zJ`)!7Dj~fzw6nhvz(a)$2M-tg*KJQij;e>ikcu5GXYaPGq>G{>NCkB7$VY5^S5(2> zfS`SU(*gnH^u@x=0)W={G$bWfFvpJXGg5obDX<~C31;B72?pMDjTY@yrB=W6C;{O& zh!_#qe^R%biR^A-MF&=@i9i>whQ|x++t$msMu&{sua6o9zX_wc@9zCk#;G*ixniht z4ul*~MrAtZOo^-d&aUsXk8VrDGPFURep!*)jja_G;^Qujv@>g32{}=$&_g~k)amlr z4wCy9X-8a(I$mBsktErdcU>7yFChY#Rc(vajhbk;SrgK$Smcu+AAht%&YpaC@;}&I z+<##a$_t%jN$}qzxhDwe^9&$3agD2U$T8x*Y~A$G$zYyK{l1uhq|jQcmr`x;MO#D+ zfci&_0~|Mk0RFwvWlKmDdh~hS12Pi8hnDykIOTp$SqNG9Gs4$*)WpNGvG?voofLw^ zH;4GOoqzl48f{1g<@iag?w z>M5KPnl?7uFJ8&LtbIfI)8P<`R{-it@hT*hsvW3A4&y!|e2JG8(5 zH2nL0<(w=xeh*nlPIvzzIe>89?hp>HP-%lEpOyk7Y+XePvfigK$hQp9PHQg7 zcQ}Hf>*-xE^^;CroD)md2o~#+H)weEUvwuo~$ye1@yD<3~S6KE8+0 zh$77Ghjeh?EL|X0F=J4tdVEWyZClq(Fror?^^iA`ne2jv0LBT8vZ8oahvl;y`RKD0 z&htSKUCtXro2$094^iNnuBXGqr68{aEknS5WX=(4*HG7oA1DB?#?3dL z1E;^PGZ~r^qS1Rg>?q@Q4m!OUm{oStD`hn}SPKOR1`*>94|FT{e=lxMCug&GN1jqj zpe#-D0~64q%)sImS`@3@3;OKqSiJR+#iWhWtc1pbF~TB@9q5>-km_x=5@BE^Grt?@ z75pUgIBe(l2|Fa4k?luETT7vwJ#uX}@IG}_{bxz}f)WKF!jm@2)Xy~yF^0isezysx zsC|?gL~TMUs3ynVUcjr3c4+D5_nlk*YiJZA82#$E; z2w$h;?kBRO5P+Y?JfAXVOQ7Rnd%yq#xqX{oms5RtMj7YfpJ&)jWJ*oV50Z)SIjp)1cLJX)tx@-}v?liXkudEH;?jGD5uykn>Q zFuEC9h$WZdjmmYcA5Oc2qpCo_M(cjsdg!gSLn(dd_iF29&sS2rgzs%de~z+7C?+cP z6EPQmmRs@YSiP5HqpD_)P;bwDAx9iE0a2s7A6)b-ADay1YlfboP$z=z#!z}5NU z&ui{vWIVuzRqo0Hoa%q~7$7a`k@oto-3#k>tKA{X0+keDY$d1WuR_`6@NkVuaF zI#WlqW~-SI%s~i&0AyITniAmR?PN<245}8ea8SKis8srp=swqTD(hd$T2YN^_w(&IAkQ*H%yCK64L^Q;^OXenWw(9gvQ}Xf|o+2=B@B%ZZKyywTj07Mr zguQYpwND}5;WEmY_7K2IjVSJXa(UBCKtdrmST`j6C;F;`%u+KtLebsJuxa~EOw))c zYYz+uJz6lMx%&XxxDR|5A=PT(@;cwk-L&e4x-e`;y5l981M&~0p`#%1rl) z(6XaFzD=Tik}anlreZN5Y~VC;=Jk(*ztFi$LP+Z+#`=Wjfu^}Wo12@Lk=t*1V3t;k zRM5sV*x8;fRZggvA(%|2+FMRIvx_m`*@Y(L(WYu1I^S+74feSK6?WJ$6rK>anw&B9 zFSF5ETH7#gj^S&r@Uv&Rf1Bc|C{pABt`qn z<2)(HlJT0VhgXmIk1W~T1`KhcplpFDQ4oUpbhb~k8=m}iRd*A|0TM=35IqH@rdySj z$@DxKne7*cNs@=Rd-0%l zbPClqZq{_f;YsWv?+E-U;;2u~(pmCof~Wp80(XK$-ATJ~1meZ!Du0@?u>#?*N#Co5 z^abVUX#MysRY%?WZ8I-*f-7J7N0ll9Y`yK09J0zA-1OaFSM9kf9_CqTg-c7!JroZb z6h`O1dBcq0@=%S%aPIq^{;s&c)w$0eI*xtnOPMs=uy}fX> zBW>nDyEMOZPshWMgpt>w~_U|JKKNjS6f5tv%}R09Esw+d3+iL z->4B%)S4;YE!!3{%pEidMSh{;92$2h`K0kofj&BQRP*ooGBGiA%I`a`q`%^S!tFbZ zz|;Q*_?rE4(Dw>vd!dfKPtWiT6)p&z}U|KlLJ zw*fBJG;$rnRrbt660P}yKRW#{!8FXWh=(oD#t;jl%PXB%5%ZqNs@^fW%0%48`NTqz!bH8|>{9bq#lCedG zXtO_mH`zw(vSmM@gEs>CD&!7u`-Y{H|8$((sQ^3(JEEMQieb+JqLpm(n3B&<`7Phd zkn1aY<7}I_g$ZVgT%unukE7{+huSCa+B?G<6cVYRJFGmY%d;voU?4tt@*m&u`(U_| zX~pb+zB(T-b6D5@x7hAa*vh{fEm{CcVC-=4&QATC?H?-xOyQgqWm`!LNuFQ8G@ zItWkK2Eyl0=F(i{nV?S{0h5Ma#>~(1u5iw(lR~b?!*nZion57vnZ>$sxhZ5G5WLYd z7jg1a?9nECD&uH4eKw9yk-Dsy(KU=wkQ|zR-rmu-pQ_CsikQlv8+{$QZByMDAo=Ia zlO`NkUxK!{HtoouGweeWQalB?1LLXqTCmiwS^S40NAsLe4fJ!317?ojv2ps8t{p$I zVfb8KfQ;Ws(|JA#&6|6CAf$YBez;oM@zz5&CAzLa5#06wTIBl}O_wGPaPq(dJxh7X zJh2vbf0oW7bWGACswvp%bk@+Kcfy-Tfghl}Uli(q0^BN}dTbPa;|q@RhajeaA|&o- zEF2qEG_kq-iAxaX(6dzby~_M0(E$D%Q;b4C+Rl` zW+ra^rY`7hy$9M$wmy4^vf}iDPdF-8-x*wC&5up3+E++mVYqqsa))6MGj3=1S@7xM z;H)w=em~;N{Rg1+Bye{0=)$pDAsBFSf%1W;Xr-K3?=7%1>#H(sCj;?G!B@C@dTYH8 z$^0hRIT0Ru<66gu=X*3IfBq72u$R1`1qX&4!9f!|{idWNc4nRt0w-Ohy{Q8=a2L)OnL=4kI5i%Mq`&REQ!hL?Ger76AIcDLzBz4g=B zuk`d+Gq1gh6k46#&^905NqU~#E*Az&&b>o5j&{A7^xEyY@a*v0L5vV-Wb1MPz<_)K z#XQEv3~|6Gv66!PQUti?A8YI*9|J8Bfv6F$PQQO8tqeUOzj)ays&ih>4P(xNnw|f? z6OF283G6qf6M=HIH5upq#P}NBYzmq4O8+;?H2GDj(V-pGIc)=e7+2l+=4i+^7+=4a z$C6j<7G)lftTb#nxqt%?ZB+*m0su>ktQnQJn~#*A#ewlv*D7s?d)YQ5ahVu|r?kSXDn!vUUH$Ub`wn`*r|5rpX zBLybD-;Rv8XkO}?Kn)WjMR!`y?IpWK54eu3cFaYEZPic#s9ekH3Q0LpKHs9o+wa~23ZXm zfQQ04vXi0gDQmi#?ThR$eqH0GE6|~d`N$9ZFoKCoww51jKqVxR;JxRtBuIs~w8ga` zqWz1fj3Ii{$P=OYW$yY9OhWo-Yprs@(yI$_^AQ7P4Ns%P5+EA1kuSda@HN#qtNo%F zM~s9>9_nXsCKV+h#R?(WHEes&dc+;`G;Es|tmqEQxVHTqseYMfUJx2x6&;@j2aHX& zE;8|4`GBb!2W*m@S1CUh)`-1txiY5cZ$gPRbP(V}3B-*9sL{*B1YmV0dmG7%4%!^< z-_m4Inmc)iVgkD$UbF+Tb@na4y68x=^T1gMDb0iEoHl{Q8D#7yu$1VVe5d=a{MH9w z9aqvE0io}4Qb|{wsaxpkew7^)lpu=Y0_PNvxw|m{6M>Fm04tbP>)0Cg0 zCTM>?_R?g4h=QtLu!}2StDVIu<fj6x?n5Inb8RdWDwEJ1-#t*2+Asm1i-HqAJtw}1- zzOTG5u^~KmD$c;LEL79sFqfvMTVBgi_Vq{MmiD*!x@~-@=M~Q`XOLfn5$cl=k{$(n zKmycXzA1x6-R2eGqjj()jt5KssSBgB1hNgE*!^H}iV3;=T&XP3qQ77K{|ePCKa3IN zsd?EA%pROKB(IceNuZv-`hoAK#FIOy18P>{j4^KV3&x9Gx0NA zL=W6R3s*NQHRQ&&hcF}Ofrc)6nr(N(++03VhKaEWExUk%9VQ*Rc(uv}pXj$SvS^e~ zj7dVV`*-MS8qRCTp&afY*i0GM&tNzR7iakND>*>lF^J&o2CRsBZU_m8m6MZr6q10O zgN%(N^Xo>CK$2dG_5uwtmogV@#xpff)f568VyzDE7-c&RB6qcn=4>O?Lt_=So) zKiMROcHUvfKaG0Eh0kn`VR4}+zbtJ$q-<-3@YBRr=*cYk?3*?h-msjr-$LN4Yt zb*fJ{!9!(X%laZN%E^SpI|^d--VhT$2wxnse{5d2uQ&u5&j|z!=9j*vOxhI768!ec zQ(_SH(p3MWEvuCGi7M|$5gg(dI{`=7q=KMN(8N>oQeWZPzza3G;4{(+uSfFKuui!u z%HLsC(_O}WasX~R%>^_uJmN#g?-C=kq4HG>-_F-uE4W*FmDLpQDrfSP=6mcP6$4G3vE-0= zo1z%BIYIvqF@4?f+c&K1l^h0d5d;THRTcmxizTQOHylXG53~$I!^%H-@Y>wNNM;iU z4d~30LG@jvi8g zn-&$3Tyz$`f}w>zDTr-i;;WnS1vBpGHesmWcz*LbQmrHchsv8zmP7})YN3hAvU!}5 zQ=tAvOnn#eCGi9OW@CJQJrA!r|F8nwNc6nb1r9YS3IG3JhI5#e9X*LG*UVHFClvDHCKp>-#L6*SVvF*Q&Ec7}Y-QyL2<9=+C-k-a$bhKXvdoeUThUT-SMD*a&`67+YNS1dAr*?56 zrn<>b6j9T!0PR7gTsFT$68QdmsoWBqENQCxqhnF5`0fTBh)J>7St(|-kI;zhGzhyD z(!=ddz!bQH`0{M~wI4<5lAnfE8cOQ5wN@=D&g~tJW;i(jHt2N(Kb!OPz6Vun8VSh5 zAr$hkW=ex4KmATWh$&nn#u8Pzz2p6k^<+0y4hLSE0t%0GPZG*%_Awyv3>qs3D=f`6 zfl{jJi*L<0XvJyAKhLv0{p0Xy%u-tV(S#WDk>&;wFvY?HxwRZ^jjw}i>I!&jL574R zO@6ye%mJ|jntKDV(miahZ>^I+0q&trxfkoQ^eImnPUYi=!5cP^x69x%P^Ir%&${4r zsS<=yH?Ll5`T9y{ahHiNub8Js60+8B}czqM5Xe7%=V>UM& z6t7V!K75E8DnL~&YcVc;ug}=UP4?U6m#wAYMy4QY!)CWi_6KU?Cc)`BSO2w%>abK7fa_~cX_R^I-P**dM`>>g}YLSYOIooGQn!Z z1gg)XS%lgJFO~*(67ZyR%5m12L!)NdGf4-XN(3DoC=mV~)Coyy-rIi#)ePtX26hU%F2dtzAl@p@$(5Lm2-ayz;<5LmwB__2K z*BKlwt!(W}3Rx)K`UY0x`bzc@<9;q?@s$kq_6ph({o3R^kX2CrPik=V{$pe9}L4$#J6PNpopvwgw|Wjd%8V-9~gn3UT?=mrO-Zg+@@wfgDuB-B+q z-xjR;B2yZ`9RH{>S9}bvd363?oz4u*I(e?~=Cg!JXmg)n+q1DUX%l~{Q_{j`V_6FF zffvKED|T#%T8t?jpN9u{SR+l5wr6SLYg4z0W!Y(^UQKxk-D2f+yYcrSytB=!sHX6C^e4{r9qe@ z;xy<*p*uJg*o^iY;`-5nBYreGV;RhZX-)zR_TNJ=JJgfU$UNE6gL>2fcAs+IP8$fR znDjoDYq%k$%w~tEMUey6dETnBb37nZk7zU70X}3BmZuM+JH|LdR|iY4R0AG3Jk8x- zDJ|#kQbMPQBXCY7mgv`>r^=I$4^+#6@Ac(FEa6!1eBQ@RRQF#-T?Gh9R&4VHCr9DG zxMT-*h>q+kUnr34fV^3b39b=pK4RolmhPPe4%z4eAt9E!kM`6*3Aj`$SkaV&NnkaS z2<*PUHq9`GhVwixgz_?y%F;Uq=_*Vh+=VeCA2Vb;y`U=5;>-v4-nwh)tZZ@`NT0&I zIwD8om?3Csa0LRK{9jra=4H3WUpHO|>hCg+GK^;u=ub?D$=p?TJI{hD^%`%0U*lKH z6@a$()V`Snhak5SZ342F1Ze-QkPP<6Y{zR zF7`i?trmYOMl!*=>)2GQEu&ci2`vHlh z!=7Ks6`f8%o&uc?lPFPR8RM!WoLjjIVkF933|cbU_)ao=wX(X|^eUhK20Ja>>x$7} z3alt)P2P1J7f0_l*p>mA_N?VQ0PD0NFi=7u6m?n#rTz$itrbsYOt`nyUnD!1mg>F@ zxt3mp#Lsjnpe68zvMt+&2Bg>KbAQHe?pKj_PDU;Ek5Sr6*82ca8gE@`fL?PAGRfOM zANX=)i`x(UmGKcZx1#eYdV5$OUhmADhVXAX5exR2i!|hzq<1xcU}s9c9dMQ|!hgfj z?I5-__v~AxVMR9uQ?EK3hqM}!&5V~+DV>ZC; zG+{r`x;{G@0I>N&B}V9fO$`@$pf?-6-;_}|1RiH3d^e6#e7@u>0L^yfJjq2~e)Q_c z2+p1)%vx+)OEyRE`y4C~y87VUA_e#cu>I)z9F;Cs+BK^QL zmjp9-K!}=KJyKVT1RkrO?<_rr7;FSRi`KnFeS*NAKWEx*HrViT8h_hNk3OEXBHZ{__Fk7hosE%qU+2*ONhMZkLO>}y!=5Dep-i$J*zT4PeIuwW~AW)M&FZYGi zGe+TDW@V)esU7x0MtRiKqEfLhk8&9MXh75uK>L`I1Tdzp#I!U@1`Xqy#ZG-ciFj3G%c*Yvc>E)BhO6jCRcPy6L<@ zZYCs9;SGp>gNsS`nSKoaDG&o|Zo2+Z3{v)TS3^B& zKiOMonzZlr>%%ntVQ38PT4To5D0`lb)$NA2;@t06Jcaitwca)E74Fp?pb`SLv$UFx zLkJkkl{T6VM%jBl=D5nwp3r)H?#%!lR!_$p;HR3k(Pve9Nk8`|P8h%_@7F0-wm<#u zDSh~lp%rd$!*n=JH`<4(o=toe0vw&LdWf`NUpL#F*DEE=*s}(jWDU{FsEjYfc>Q`p zKvkkgQr$rOZU4ARZssnR zhVq;AR%JLd5DTD@s0KyY#a4>{yZVke5OHHCPC#SSJ^bMsATy zPd{CM$JlQi@sNch56fE68j1s2fNcNAE>wkb&-$&^Tt2q>(Bi@vCs(ETxedcfhxR{Zh<;N;AaSufMNjBhSb=U~Tss%-$5<43&X>-Tp! z2ALFA8>5T{o;qmWN|LR#;jKG)n2Y#H5R~&-*g5+mvceZ4k@4w_olt=S2+dqC$;Zlx zxWsCp-h1uEMnt%movK$uulVN|#_WvoC{#BcD@65tpwr)B)uceBJ!XiUO+z-y9uNtn zwgpLhjjfgEHiRs9QmXy#}!M`%9yFVRg2;N1%lMJ0(d6OsN)Sz&A z)i+^D4|J+JH>9SnzYy2O{xRCv%|qVRurA*D8V*MB@u1_C{)X4dOmoHS8VTNwbVykT zF8K8PPRp!lD(wD?@3Rpmk*UUQ3B%#AhSWQ!6kHG!HqD1@NnhFZ2tjy36}+sgt4=J6 z%mjt~U6?JJAHWK`0SbaRuo{s}Jdq+<(i;TV{uEoLvbzLFT-SRGi*uDDvJ}J@=Lw*V zK$uHoj4=H#zt$bfiyT9u$$8Pyq6a8K_xHKfLzuy0x$#-94DAUeHKjq%C=RrPXf*nF z*H<%ai420ts~U0u%8u;9)Yb^T!$vXV}{A~MiB z)s0#8HncKzePKu>Ne&JBUAowty2<|ySyjO)zJK(t$V}Ln1uANLQrrmwvIDmK1?zyP z=ol=lPyI``wEWlW(ktoN_at2Dz}k?BfvaPE!+(yZhNPNhjKOBc zjSxR!c7Q13(xl)F5BuCQpp&h@iWgsK^^oFgcnV2?=>)?BmTkvL;I6MOn_XzI90X-y zNUL?LM07u3NJa53SI79v2OCc2E;>tu$3^gU{+mNCI)cH+hV&pWO&S70v{H=v%m}UO z9Y%dH??+uJu$oH~>G0VZ;JZrF?-(gw`CgTuedtXpmjDqbS_*3a`N_I$J}C^eN+u!V zsA@?Ak_R|k;%}*@{s7f<@?43kcfwol7hjVb{u5AWty+(GgM6q6D`(9d@dT4w)7j}#LAXUN$g74=$DOw5hTc`}73^{KxO zyMpta6~FNxy%D9Vgb*YS*RHef6wT&uPIGw}#8dkxK}oP`{iY1RXWW+A-5@+T)?+ii zv4ql!1j;sX_#%7W2)#FFm0@i7X;Ee7v~enWWfJERbN z?(sU;|JKd3L3fJc+RBLc?#DXyg}h`?DZ*tXRz6nUtOQalxcTgfEc$(Q#is;(Nl!4w z5IjYoB=Wy~5Tr53ZPG4^gB=~p2@-B(GrU9>^x77Ts!hx~-*?B09`a`kjLG|={(Ym^ z*^~FP8lMY+)~b@_2Vg(26w7;51_*f}epJ^k1>2C8!!;+s)iFo1)@cY<$Y1rHwPIY( z+j3sFxrc)lOC4sGM>0FjRJ^48b>(tezz-qQ-f3eTzCA*|{Gn9&G<$hV7Cw_~`Lghn z{xQYT>B4>nN5TgwLd~T;&qX@!1Zycu$K54?e#MK8XmqjWc1`Z`Bd!ZPxLbOxete*e zo*=fxS2fD^IE~A-=|iaLCR_YHBUG?oLfUdCNenU!_?Lft`8qwO^z!6%>_-GrCI?Pd&C`Onk6!nA&Vl-V;nhxl+R#X7usjcmmY)k(3XeI zaNIe2n5Oym1)v0EuY|kX^vUirREN*tcY<_(;q$RPhvU~11q_-57v;v8<&ocYw59iZ z0+nODpTk-u>6D+J&+ytw|XV7jpQgE-oZRtd0VyOp(`juws`5jc&(wo$tYvy-U^&FOs z5VuPOP%1*mJRQ2~zNu|$WeW@&^Sv4dQU|wiv#=g+E7@!Tbu#PHid^oW&w1CeG_lfsvIBzc&Vpgov{k{qtawc=U zCwOUS%*JsSK0m~yl~<*Y^CKjMJuW16c$(!^*cV&wUDM(5=P`J1uiijRmn9kvLV-^& zwO+B6mt1wdQo%~uT9wn%_lT$GeV@N}ty>G$3n$8pE{6pUBBaCj#iF6A6FDJb)IeO| z6K#-4DHs(R%18%&0?Wki16wFoOqeEn=Yccn2PV0%*#?L^koaJ}Ea!#dr`oSJ=SurI zmJfjaNc)uxhoHmdL~6haIj9&^>T~Yo`17ooC-jObN}XF;$M4+q*1ThP+`S{XN)A-w zU&@8ao<0$gZGu?-x_>2N6Wq6OjZ&84rvttV8EFV1dWQSs<(}!^ZeWA_B%=^9^@}JL z!vD5F^s(I`B85I>f&vu5a099?8ma59&8o#jdpvB~@=JGx&3eT4Xgo~z67ddO=~xuT zdkT2yX|8Hx`Lh;yi4}rTw?6>6NA^hLG3i)T89`44Bu?}J zm*O?xsCM4T-ZNEMy(MHOWmTx$ZndrBGgQkI;wu(p_}ll`WkqR#Ac#YSKQ>;1gNUF< zV;$@MY5CIfF_nFMl7|0*3niak@95VHs+xEf$|l#__^L9rHHnkfAZtv8fgiX+DZGn{2t{__ZH5%El_ZTBkM=T0PB&)^XJS`mOrlbF#Z{PkFk}>4$6+v30f%|nA6|j1w!7V zyPxWufHV?^@60>al072?D*^dj7Qaq2 z#578ZvdC^+RFZD`dXlIlRB~&uLYFrOd7Pmq6m4U6obegyaA>l!wK`og0P|u7n~PaC z*1yTRClNdU1LHq5BP{Y)^aUmK#Em2ZXaiK|p(-aYF3TxnLly}}EthH`rpYU#o}h;! z7LkJXPesyyVoZ~KUAZj(F=!%yUIYd6LMol-IosvXNv&o+d~<*T-Mz%#BAl-p8dv$X zGeGu4KvMtg?Xe1XpIhQ#_pJD<0M)zJ-&AqVCtdJoQWEf+_~_UsTS{1UyJ;H)gmOIT zs+ai#%Q-t-Fh{L>e+HYR1a%E>?7T%?C}u2eC-pa-4$Qfnpm?Ny{?qW9{6U-3C)@P9 z?Og75rCA{7S0i5OjB1=whCob;JMgP%1`-D_1JERu{@#z<<})xtaq0#s3+ zpjI3YP}IqTE`bexRZ$_xtmvi>tmq-y#+3azoZVlX;H7fALsPbsS^_`=J@puY>9C2_ z{`wmAI$HfP)@c^Bl?BeedABer3XuA#ouGhKVS=jhHu-;z{}nF+e+PaE03!q^fi6_v zKoJMKLd+5OLf2ar+~7@53-^*6grA^(UsfVG2FN(}mHwqxa`9@m^vV}?zQId(?{D?l zy|tphJ{>)@qIdSDs}YYCM130hFwqmay)Le5JB2c=Iz;Wt$MyHbtnV~O{AhOeCHaEm zs?wDHdwz5(2??#@wdE-kpGBb%A6$A@-XBmg=)&9*8av-hZh?}QiaDk(J=K7#>Eny& zjmi$2WpU3j<)h4icNTs*$BTz9me>1xjog9-JnjYqjzWTsR6Ok^kXP01l%JX=^{V5L zCL9M=4sk3|$l2-uAef+w5D+#vh;P~Py}0QTYB z8n9F%KHc%7D_Uu7&Jx(u;dO8_wV<=B+h9*Tp_SrGT<4!{drZX{ zw*GhTLV=k!geHmTEzRLi1z{4dwsrz)6>1YZzc@h&A9-fsC_ADr@bgbMK)A|DQEf4V zx>Z7{W2@isX&ZBh9eC>nqaRVT#W>6yGt8kBb$>U$vC}Zcv%oRs&jiHp;RI*LhmSkF zgsm*hx1^L>7Nm}km+}-<0x&w3Uz%DZp(wE^q4v5x@fPuZ*!fAMg&!2r?y2&I^E99p zer^$_-fI=%DDyY2zJ^X$)E!tFL*zPi0~CHJ#LJT+T4wHQLpV2Ha?Zbo?q-FZ=+8cr4L&yfb!cn=5Ff#li>YrT>plf zrwDdrzqYVL4N&GElmojm_@9s4>O0<^^@-BvWPW)1QW+840_Gh*vFGesSBu#@DA;O%d?X z%*M`$NFWeAUD?_8!~L8>;=gwQRui06k_+D)Q>xae9d===gHNQ+Gn>EkR`^Rw;bHC| zs>Ipvc}y;_8rf0a-T2;YS|j|?FR(eOfW5$m^Y1W!V5=EC7*+eUDetWagVEQ(cchOD z6AJ@}M=%*>%5A>c{nx{7AxiA->Etz_l`P7dYGzKihuqvwaJ zW8L9*;~Q^_huAkAs!t`bg%g z@Ow7Dpe)la-s<`C)LNfc&z77Zx94q+T(8R2bV03dYmWpDzLQYRAB zPYW$!$$or`59}elVH_im`?>}RWYkU}AC5y(vSosqEHhd{7m~phFV5bVH^9yQt+FRVh9j*_%=|! zF;%NJkirtR;yL%

)v~gWG?Fn40WvyhhtVZ>pd}ud(vF8+(}-p$s0^9UpEj{ek(C z*UmI}s$#G1Gm!MJ69>6NO%ZX6Bl>S;`T=t#^_3g-{RW}QC#DY8c_Bzz%SYxx@JLte zQy|`;>|be84G2l6tzs$WBJK5L-SGx04iN|M_h3y5a2&jedd*WV^uB#Y0|#AADXtENBcLNt?DR8V>#z0H$)sGd zLp?r2NJmwbK{+U>nDJ;g_S6!PcuSA!ao%*N0Z)=9gnwrpKg7M4yPp;^$rLO1y6;y) z=O};t2i&&M8|P;x)-leTq>=( z$OS3l5aOU746uA+%<5w5T58#RklN4g>N0 z-1L!AUH!lsgcjVRK-d}9o`S>fsbJ)A;uNnOJyC>`n{ktVVOQ|`J2*?dyQ7a(>Aip` zzh>#_Qgk09upo03!w|6?!$$hvZ>O=f^a3ikuW))!xmT{KXL$1Z3WGySz=lQ?Jn*9V z?clW!cLUT^4u{cEuou2s7Pm((g$7HSbx=7~7#;H;no7~5=t*Pe=1mc$emQE1LmyrS~HV~|Awog;rTnF1!u7fw5#`6Dpivu+5g;zUa*s+9wEvZ?g%XV`j6Z=j?fq0w1j9!;(}Xeb z<%%zAqD7$Tv#*Px91G#tMRqE2r-}j*-BHL>&MHIBgbH-46;l*w?HvW#0`>=_aJzy; z4o8qX2E{Rl2&ByxVy#HdW<9EYrDd(NH)RhJxt;%w;~)1*xb(ZVgV zB3fv|!7LlYW*1n2F3Mr)ck0?#6bRF2X2)Q$+#!VlMHokr(=G>nd|#l}hzfFFW_%MS ztqC3EWbd;3Xry8?{&!uX?J=}NNfZW30_fygesTtFFwlvB5GlaTp1pRX_a-)XNX`=e z(#2VaJ<1;woTbD!*V?}=c!7fw&8cEiqODUf7iQBTk{g#+mmGugmmd)oU+$6P=y^n2 zhSE5z+e9>H)x3RS5QHhtYGayMd&fqLW0OlzJdDy3{u3ieMvtGiX2Spg002ovPDHLk FV1fz~H&6fo literal 0 HcmV?d00001 diff --git a/docs-website/static/img/adoption-stories/adoption-stories-slack.png b/docs-website/static/img/adoption-stories/adoption-stories-slack.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce397690faa6907127ddade418ca6056f27e97e GIT binary patch literal 134202 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

wc9*kp0`Ojo2oXY)p{1EV_bfEWfN94ob8 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

`|4}V)+1Fz29eXO7zM*cYHwCrYs`2n#C%80LlZn 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 a|7A2uDCU;_yFl{*_)(Nqm8p>W5cq$7K8l?H literal 0 HcmV?d00001 diff --git a/docs-website/static/img/logos/companies/etsy.png b/docs-website/static/img/logos/companies/etsy.png new file mode 100644 index 0000000000000000000000000000000000000000..e8474db4a4f4ec1b41d81a56dd3543bab2db3341 GIT binary patch literal 35207 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¨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�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 literal 0 HcmV?d00001 From 06bee0d7c04f3efc62b2d16c90c664691081efdf Mon Sep 17 00:00:00 2001 From: Jaesung Ryu Date: Thu, 6 Feb 2025 04:25:09 +0900 Subject: [PATCH 08/13] feat(ingest/mongodb) re-order aggregation logic (#12428) Co-authored-by: Kade Ryu --- .../src/datahub/ingestion/source/mongodb.py | 33 +- ...ongodb_mces_no_random_sampling_golden.json | 4567 +++++++++++++++++ .../tests/integration/mongodb/test_mongodb.py | 33 + 3 files changed, 4617 insertions(+), 16 deletions(-) create mode 100644 metadata-ingestion/tests/integration/mongodb/mongodb_mces_no_random_sampling_golden.json diff --git a/metadata-ingestion/src/datahub/ingestion/source/mongodb.py b/metadata-ingestion/src/datahub/ingestion/source/mongodb.py index 32e94bb9288f2c..d80f5f117bac25 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/mongodb.py +++ b/metadata-ingestion/src/datahub/ingestion/source/mongodb.py @@ -219,26 +219,27 @@ def construct_schema_pymongo( """ aggregations: List[Dict] = [] + + # The order of the aggregations impacts execution time. By setting the sample/limit aggregation first, + # the subsequent aggregations process a much smaller dataset, improving performance. + if sample_size: + if use_random_sampling: + aggregations.append({"$sample": {"size": sample_size}}) + else: + aggregations.append({"$limit": sample_size}) + if should_add_document_size_filter: doc_size_field = "temporary_doc_size_field" # create a temporary field to store the size of the document. filter on it and then remove it. - aggregations = [ - {"$addFields": {doc_size_field: {"$bsonSize": "$$ROOT"}}}, - {"$match": {doc_size_field: {"$lt": max_document_size}}}, - {"$project": {doc_size_field: 0}}, - ] - if use_random_sampling: - # get sample documents in collection - if sample_size: - aggregations.append({"$sample": {"size": sample_size}}) - documents = collection.aggregate( - aggregations, - allowDiskUse=True, + aggregations.extend( + [ + {"$addFields": {doc_size_field: {"$bsonSize": "$$ROOT"}}}, + {"$match": {doc_size_field: {"$lt": max_document_size}}}, + {"$project": {doc_size_field: 0}}, + ] ) - else: - if sample_size: - aggregations.append({"$limit": sample_size}) - documents = collection.aggregate(aggregations, allowDiskUse=True) + + documents = collection.aggregate(aggregations, allowDiskUse=True) return construct_schema(list(documents), delimiter) diff --git a/metadata-ingestion/tests/integration/mongodb/mongodb_mces_no_random_sampling_golden.json b/metadata-ingestion/tests/integration/mongodb/mongodb_mces_no_random_sampling_golden.json new file mode 100644 index 00000000000000..4606dfb6892123 --- /dev/null +++ b/metadata-ingestion/tests/integration/mongodb/mongodb_mces_no_random_sampling_golden.json @@ -0,0 +1,4567 @@ +[ +{ + "entityType": "container", + "entityUrn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "changeType": "UPSERT", + "aspectName": "containerProperties", + "aspect": { + "json": { + "customProperties": { + "platform": "mongodb", + "instance": "instance", + "env": "PROD", + "database": "mngdb" + }, + "name": "mngdb", + "env": "PROD" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "container", + "entityUrn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "container", + "entityUrn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:mongodb", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "container", + "entityUrn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "json": { + "typeNames": [ + "Database" + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "container", + "entityUrn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "emptyCollection", + "platform": "urn:li:dataPlatform:mongodb", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.Schemaless": {} + }, + "fields": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": {}, + "name": "emptyCollection", + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:mongodb", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + }, + { + "id": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "urn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "firstCollection", + "platform": "urn:li:dataPlatform:mongodb", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.Schemaless": {} + }, + "fields": [ + { + "fieldPath": "favoriteFood.ingredients.from", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.ingredients.name", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "_id", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.BytesType": {} + } + }, + "nativeDataType": "oid", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "age", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "float", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "canSwim", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "boolean", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.RecordType": {} + } + }, + "nativeDataType": "OBJECT", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.ingredients", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.ArrayType": {} + } + }, + "nativeDataType": "ARRAY", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.name", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "legs", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "integer", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "mixedType", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.UnionType": {} + } + }, + "nativeDataType": "mixed", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "name", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "seen", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "float", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "tags", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.ArrayType": {} + } + }, + "nativeDataType": "ARRAY", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "type", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.calories", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "integer", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.servings", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "float", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "emptyObject", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.RecordType": {} + } + }, + "nativeDataType": "OBJECT", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteColor", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.emptyObject", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.RecordType": {} + } + }, + "nativeDataType": "OBJECT", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "favoriteFood.ingredients.color", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "servings", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "integer", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "sometimesNull", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": {}, + "name": "firstCollection", + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:mongodb", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + }, + { + "id": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "urn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "largeCollection", + "platform": "urn:li:dataPlatform:mongodb", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.Schemaless": {} + }, + "fields": [ + { + "fieldPath": "_id", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.BytesType": {} + } + }, + "nativeDataType": "oid", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_205", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_214", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_220", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_224", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_233", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_239", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_241", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_242", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_247", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_266", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_269", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_271", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_272", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_276", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_277", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_281", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_286", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_295", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_315", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_322", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_326", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_333", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_337", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_345", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_349", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_351", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_354", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_358", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_362", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_366", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_368", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_376", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_381", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_387", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_388", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_389", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_391", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_395", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_400", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_404", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_406", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_410", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_411", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_418", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_429", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_430", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_436", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_438", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_445", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_447", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_450", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_455", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_456", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_467", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_479", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_481", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_495", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_204", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_208", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_209", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_212", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_213", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_216", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_218", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_219", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_225", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_229", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_232", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_234", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_235", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_236", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_240", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_244", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_248", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_249", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_255", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_262", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_264", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_273", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_274", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_279", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_292", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_298", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_299", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_301", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_311", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_313", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_314", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_319", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_320", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_327", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_329", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_338", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_339", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_340", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_341", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_342", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_343", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_344", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_347", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_348", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_350", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_355", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_356", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_359", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_360", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_370", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_371", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_375", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_377", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_380", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_382", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_383", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_384", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_398", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_399", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_405", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_407", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_415", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_419", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_428", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_432", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_435", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_437", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_440", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_443", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_448", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_457", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_460", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_461", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_465", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_466", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_471", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_472", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_473", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_475", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_477", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_484", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_490", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_492", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_494", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_496", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_497", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_201", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_203", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_206", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_211", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_215", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_217", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_222", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_226", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_227", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_237", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_238", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_243", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_245", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_251", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_252", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_253", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_254", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_256", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_258", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_263", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_265", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_284", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_285", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_287", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_289", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_291", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_293", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_296", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_302", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_306", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_308", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_316", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_318", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_331", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_332", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_334", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_335", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_357", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_363", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_364", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_374", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_378", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_379", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_386", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_392", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_393", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_401", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_409", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_412", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_414", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_416", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_417", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_420", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_421", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_422", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_427", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_439", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_441", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_444", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_446", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_454", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_463", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_478", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_482", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_486", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_487", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_489", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_491", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_493", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_498", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_499", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_210", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_223", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_228", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_230", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_250", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_260", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_267", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_270", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_294", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_297", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_303", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_305", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_309", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_310", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_312", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_317", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_323", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_324", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_330", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_346", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_352", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_353", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_361", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_365", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_367", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_385", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_394", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_397", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_402", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_403", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_408", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_423", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_431", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_433", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_434", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_442", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_452", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_453", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_459", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_468", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_470", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_476", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_483", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_488", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_202", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_221", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_231", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_259", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_268", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_275", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_278", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_283", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_290", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_300", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_304", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_307", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_321", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_328", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_336", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_369", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_372", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_390", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_396", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_413", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_449", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_451", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_458", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_462", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_464", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_474", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_200", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_207", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_246", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_257", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_261", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_280", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_325", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_424", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_425", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_469", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_480", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_288", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_282", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_426", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "field_485", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": { + "schema.downsampled": "True", + "schema.totalFields": "502" + }, + "name": "largeCollection", + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:mongodb", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + }, + { + "id": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "urn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "container", + "aspect": { + "json": { + "container": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "json": { + "schemaName": "secondCollection", + "platform": "urn:li:dataPlatform:mongodb", + "version": 0, + "created": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "lastModified": { + "time": 0, + "actor": "urn:li:corpuser:unknown" + }, + "hash": "", + "platformSchema": { + "com.linkedin.schema.Schemaless": {} + }, + "fields": [ + { + "fieldPath": "_id", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.BytesType": {} + } + }, + "nativeDataType": "oid", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "mixedType", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.UnionType": {} + } + }, + "nativeDataType": "mixed", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "name", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "rating", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "float", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "tasty", + "nullable": false, + "type": { + "type": { + "com.linkedin.schema.BooleanType": {} + } + }, + "nativeDataType": "boolean", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "nullableMixedType", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.UnionType": {} + } + }, + "nativeDataType": "mixed", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "varieties", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.ArrayType": {} + } + }, + "nativeDataType": "ARRAY", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "mixedType.fieldA", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.StringType": {} + } + }, + "nativeDataType": "string", + "recursive": false, + "isPartOfKey": false + }, + { + "fieldPath": "mixedType.fieldTwo", + "nullable": true, + "type": { + "type": { + "com.linkedin.schema.NumberType": {} + } + }, + "nativeDataType": "integer", + "recursive": false, + "isPartOfKey": false + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "json": { + "customProperties": {}, + "name": "secondCollection", + "tags": [] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "dataPlatformInstance", + "aspect": { + "json": { + "platform": "urn:li:dataPlatform:mongodb", + "instance": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "browsePathsV2", + "aspect": { + "json": { + "path": [ + { + "id": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)", + "urn": "urn:li:dataPlatformInstance:(urn:li:dataPlatform:mongodb,instance)" + }, + { + "id": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed", + "urn": "urn:li:container:f5ff6ace1ed73cb3fd4c73dc718c39ed" + } + ] + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.emptyCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.firstCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.largeCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +}, +{ + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:mongodb,instance.mngdb.secondCollection,PROD)", + "changeType": "UPSERT", + "aspectName": "status", + "aspect": { + "json": { + "removed": false + } + }, + "systemMetadata": { + "lastObserved": 1615443388097, + "runId": "mongodb-test-no-random-sampling", + "lastRunId": "no-run-id-provided" + } +} +] \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/mongodb/test_mongodb.py b/metadata-ingestion/tests/integration/mongodb/test_mongodb.py index 6dc8bb295ed455..60b71657465c2c 100644 --- a/metadata-ingestion/tests/integration/mongodb/test_mongodb.py +++ b/metadata-ingestion/tests/integration/mongodb/test_mongodb.py @@ -79,3 +79,36 @@ def test_mongodb_ingest(docker_compose_runner, pytestconfig, tmp_path, mock_time golden_path=test_resources_dir / "mongodb_mces_small_schema_size_golden.json", ) + + # Run the metadata ingestion pipeline. + pipeline = Pipeline.create( + { + "run_id": "mongodb-test-no-random-sampling", + "source": { + "type": "mongodb", + "config": { + "connect_uri": "mongodb://localhost:57017", + "username": "mongoadmin", + "password": "examplepass", + "useRandomSampling": False, + "platform_instance": "instance", + }, + }, + "sink": { + "type": "file", + "config": { + "filename": f"{tmp_path}/mongodb_mces_no_random_sampling.json", + }, + }, + } + ) + pipeline.run() + pipeline.raise_from_status() + + # Verify the output. + mce_helpers.check_golden_file( + pytestconfig, + output_path=tmp_path / "mongodb_mces_no_random_sampling.json", + golden_path=test_resources_dir + / "mongodb_mces_no_random_sampling_golden.json", + ) From 23a86fd47909874f8ae35de03a38f77a6bc5a232 Mon Sep 17 00:00:00 2001 From: remisalmon Date: Wed, 5 Feb 2025 12:28:08 -0700 Subject: [PATCH 09/13] docs(salesforce): add missing salesforce source to cli doc (#12550) --- docs/cli.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/cli.md b/docs/cli.md index 10f330a3ecfc6e..c9cd85fd0e8155 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -736,7 +736,7 @@ Please see our [Integrations page](https://datahubproject.io/integrations) if yo | [datahub-lineage-file](./generated/ingestion/sources/file-based-lineage.md) | _no additional dependencies_ | Lineage File source | | [datahub-business-glossary](./generated/ingestion/sources/business-glossary.md) | _no additional dependencies_ | Business Glossary File source | | [dbt](./generated/ingestion/sources/dbt.md) | _no additional dependencies_ | dbt source | -| [dremio](./generated/ingestion/sources/dremio.md) | `pip install 'acryl-datahub[dremio]'` | Dremio Source | +| [dremio](./generated/ingestion/sources/dremio.md) | `pip install 'acryl-datahub[dremio]'` | Dremio Source | | [druid](./generated/ingestion/sources/druid.md) | `pip install 'acryl-datahub[druid]'` | Druid Source | | [feast](./generated/ingestion/sources/feast.md) | `pip install 'acryl-datahub[feast]'` | Feast source (0.26.0) | | [glue](./generated/ingestion/sources/glue.md) | `pip install 'acryl-datahub[glue]'` | AWS Glue source | @@ -759,6 +759,7 @@ Please see our [Integrations page](https://datahubproject.io/integrations) if yo | [redash](./generated/ingestion/sources/redash.md) | `pip install 'acryl-datahub[redash]'` | Redash source | | [redshift](./generated/ingestion/sources/redshift.md) | `pip install 'acryl-datahub[redshift]'` | Redshift source | | [sagemaker](./generated/ingestion/sources/sagemaker.md) | `pip install 'acryl-datahub[sagemaker]'` | AWS SageMaker source | +| [salesforce](./generated/ingestion/sources/salesforce.md) | `pip install 'acryl-datahub[salesforce]'` | Salesforce source | | [snowflake](./generated/ingestion/sources/snowflake.md) | `pip install 'acryl-datahub[snowflake]'` | Snowflake source | | [sqlalchemy](./generated/ingestion/sources/sqlalchemy.md) | `pip install 'acryl-datahub[sqlalchemy]'` | Generic SQLAlchemy source | | [superset](./generated/ingestion/sources/superset.md) | `pip install 'acryl-datahub[superset]'` | Superset source | From 7f88710e02c1141df3df0826e128cfb3b285102e Mon Sep 17 00:00:00 2001 From: david-leifker <114954101+david-leifker@users.noreply.github.com> Date: Wed, 5 Feb 2025 17:26:05 -0600 Subject: [PATCH 10/13] feat(openapi): precondition exceptions return 412 (#12552) --- .../validation/AspectValidationException.java | 26 +- .../ValidationExceptionCollection.java | 39 ++- .../plugins/validation/ValidationSubType.java | 10 + .../ValidationExceptionCollectionTest.java | 223 ++++++++++++++++++ .../validation/ValidationException.java | 13 + .../metadata/entity/EntityServiceImpl.java | 3 +- .../GlobalControllerExceptionHandler.java | 36 ++- smoke-test/tests/openapi/v3/exceptions.json | 71 ++++++ 8 files changed, 384 insertions(+), 37 deletions(-) create mode 100644 entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationSubType.java create mode 100644 entity-registry/src/test/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollectionTest.java create mode 100644 smoke-test/tests/openapi/v3/exceptions.json diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/AspectValidationException.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/AspectValidationException.java index 938cb2d5f99e62..b3003de2322474 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/AspectValidationException.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/AspectValidationException.java @@ -18,7 +18,7 @@ public static AspectValidationException forItem(BatchItem item, String msg) { } public static AspectValidationException forItem(BatchItem item, String msg, Exception e) { - return new AspectValidationException(item, msg, SubType.VALIDATION, e); + return new AspectValidationException(item, msg, ValidationSubType.VALIDATION, e); } public static AspectValidationException forPrecondition(BatchItem item, String msg) { @@ -26,45 +26,39 @@ public static AspectValidationException forPrecondition(BatchItem item, String m } public static AspectValidationException forFilter(BatchItem item, String msg) { - return new AspectValidationException(item, msg, SubType.FILTER); + return new AspectValidationException(item, msg, ValidationSubType.FILTER); } public static AspectValidationException forPrecondition(BatchItem item, String msg, Exception e) { - return new AspectValidationException(item, msg, SubType.PRECONDITION, e); + return new AspectValidationException(item, msg, ValidationSubType.PRECONDITION, e); } @Nonnull BatchItem item; @Nonnull ChangeType changeType; @Nonnull Urn entityUrn; @Nonnull String aspectName; - @Nonnull SubType subType; + @Nonnull ValidationSubType subType; @Nullable String msg; - public AspectValidationException(@Nonnull BatchItem item, String msg, SubType subType) { + public AspectValidationException(@Nonnull BatchItem item, String msg, ValidationSubType subType) { this(item, msg, subType, null); } public AspectValidationException( - @Nonnull BatchItem item, @Nonnull String msg, @Nullable SubType subType, Exception e) { + @Nonnull BatchItem item, + @Nonnull String msg, + @Nullable ValidationSubType subType, + Exception e) { super(msg, e); this.item = item; this.changeType = item.getChangeType(); this.entityUrn = item.getUrn(); this.aspectName = item.getAspectName(); this.msg = msg; - this.subType = subType != null ? subType : SubType.VALIDATION; + this.subType = subType != null ? subType : ValidationSubType.VALIDATION; } public Pair getAspectGroup() { return Pair.of(entityUrn, aspectName); } - - public enum SubType { - // A validation exception is thrown - VALIDATION, - // A failed precondition is thrown if the header constraints are not met - PRECONDITION, - // Exclude from processing further - FILTER - } } diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollection.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollection.java index fc1fcb68029ce1..975d4292972245 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollection.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollection.java @@ -7,6 +7,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -15,17 +16,20 @@ public class ValidationExceptionCollection extends HashMap, Set> { - private final Set failedHashCodes; - private final Set filteredHashCodes; + private final Map> subTypeHashCodes; public ValidationExceptionCollection() { super(); - this.failedHashCodes = new HashSet<>(); - this.filteredHashCodes = new HashSet<>(); + this.subTypeHashCodes = new HashMap<>(); } public boolean hasFatalExceptions() { - return !failedHashCodes.isEmpty(); + return subTypeHashCodes.keySet().stream() + .anyMatch(subType -> !ValidationSubType.FILTER.equals(subType)); + } + + public Set getSubTypes() { + return subTypeHashCodes.keySet(); } public static ValidationExceptionCollection newCollection() { @@ -34,11 +38,9 @@ public static ValidationExceptionCollection newCollection() { public void addException(AspectValidationException exception) { super.computeIfAbsent(exception.getAspectGroup(), key -> new HashSet<>()).add(exception); - if (!AspectValidationException.SubType.FILTER.equals(exception.getSubType())) { - failedHashCodes.add(exception.getItem().hashCode()); - } else { - filteredHashCodes.add(exception.getItem().hashCode()); - } + subTypeHashCodes + .computeIfAbsent(exception.getSubType(), key -> new HashSet<>()) + .add(exception.getItem().hashCode()); } public void addException(BatchItem item, String message) { @@ -58,8 +60,7 @@ public Collection successful(Collection items) { } public Stream streamSuccessful(Stream items) { - return items.filter( - i -> !failedHashCodes.contains(i.hashCode()) && !filteredHashCodes.contains(i.hashCode())); + return items.filter(i -> isSuccessful(i.hashCode())); } public Collection exceptions(Collection items) { @@ -67,7 +68,19 @@ public Collection exceptions(Collection items) { } public Stream streamExceptions(Stream items) { - return items.filter(i -> failedHashCodes.contains(i.hashCode())); + return items.filter(i -> isException(i.hashCode())); + } + + private boolean isException(int hashCode) { + return subTypeHashCodes.keySet().stream() + .filter(subType -> !ValidationSubType.FILTER.equals(subType)) + .anyMatch(subType -> subTypeHashCodes.get(subType).contains(hashCode)); + } + + private boolean isSuccessful(int hashCode) { + return !isException(hashCode) + && (!subTypeHashCodes.containsKey(ValidationSubType.FILTER) + || !subTypeHashCodes.get(ValidationSubType.FILTER).contains(hashCode)); } @Override diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationSubType.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationSubType.java new file mode 100644 index 00000000000000..f533a342039abd --- /dev/null +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/plugins/validation/ValidationSubType.java @@ -0,0 +1,10 @@ +package com.linkedin.metadata.aspect.plugins.validation; + +public enum ValidationSubType { + // A validation exception is thrown + VALIDATION, + // A failed precondition is thrown if the header constraints are not met + PRECONDITION, + // Exclude from processing further + FILTER +} diff --git a/entity-registry/src/test/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollectionTest.java b/entity-registry/src/test/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollectionTest.java new file mode 100644 index 00000000000000..17373685f884c2 --- /dev/null +++ b/entity-registry/src/test/java/com/linkedin/metadata/aspect/plugins/validation/ValidationExceptionCollectionTest.java @@ -0,0 +1,223 @@ +package com.linkedin.metadata.aspect.plugins.validation; + +import static org.mockito.Mockito.*; +import static org.testng.Assert.*; + +import com.datahub.test.TestEntityProfile; +import com.linkedin.common.Status; +import com.linkedin.common.urn.Urn; +import com.linkedin.common.urn.UrnUtils; +import com.linkedin.data.schema.annotation.PathSpecBasedSchemaAnnotationVisitor; +import com.linkedin.metadata.aspect.batch.BatchItem; +import com.linkedin.metadata.models.registry.ConfigEntityRegistry; +import com.linkedin.metadata.models.registry.EntityRegistry; +import com.linkedin.test.metadata.aspect.batch.TestMCP; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +public class ValidationExceptionCollectionTest { + private final Urn TEST_URN = UrnUtils.getUrn("urn:li:chart:123"); + + private ValidationExceptionCollection collection; + private EntityRegistry testEntityRegistry; + + private static final String ERROR_MESSAGE = "Test error message"; + + @BeforeTest + public void disableAssert() { + PathSpecBasedSchemaAnnotationVisitor.class + .getClassLoader() + .setClassAssertionStatus(PathSpecBasedSchemaAnnotationVisitor.class.getName(), false); + } + + @BeforeMethod + public void setUp() { + collection = ValidationExceptionCollection.newCollection(); + testEntityRegistry = + new ConfigEntityRegistry( + TestEntityProfile.class + .getClassLoader() + .getResourceAsStream("test-entity-registry.yml")); + } + + @Test + public void testNewCollection() { + assertNotNull(collection); + assertTrue(collection.isEmpty()); + assertFalse(collection.hasFatalExceptions()); + assertEquals(collection.getSubTypes().size(), 0); + } + + @Test + public void testAddException() { + BatchItem testItem = + TestMCP.ofOneMCP(TEST_URN, new Status(), testEntityRegistry).stream().findFirst().get(); + AspectValidationException exception = + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null); + + collection.addException(exception); + + assertEquals(collection.size(), 1); + assertTrue(collection.containsKey(exception.getAspectGroup())); + assertTrue(collection.get(exception.getAspectGroup()).contains(exception)); + } + + @Test + public void testAddExceptionWithMessage() { + BatchItem testItem = + TestMCP.ofOneMCP(TEST_URN, new Status(), testEntityRegistry).stream().findFirst().get(); + collection.addException(testItem, ERROR_MESSAGE); + + assertEquals(collection.size(), 1); + assertTrue(collection.hasFatalExceptions()); + } + + @Test + public void testHasFatalExceptionsWithMultipleTypes() { + BatchItem testItem = + TestMCP.ofOneMCP(TEST_URN, new Status(), testEntityRegistry).stream().findFirst().get(); + + // Add FILTER exception + collection.addException( + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.FILTER, null)); + assertFalse(collection.hasFatalExceptions()); + + // Add VALIDATION exception + collection.addException( + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + assertTrue(collection.hasFatalExceptions()); + } + + @Test + public void testGetSubTypesWithAllTypes() { + BatchItem testItem = + TestMCP.ofOneMCP(TEST_URN, new Status(), testEntityRegistry).stream().findFirst().get(); + + collection.addException( + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.FILTER, null)); + collection.addException( + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + collection.addException( + new AspectValidationException( + testItem, ERROR_MESSAGE, ValidationSubType.PRECONDITION, null)); + + Set subTypes = collection.getSubTypes(); + assertEquals(subTypes.size(), 3); + assertTrue( + subTypes.containsAll( + Arrays.asList( + ValidationSubType.FILTER, + ValidationSubType.VALIDATION, + ValidationSubType.PRECONDITION))); + } + + @Test + public void testSuccessfulAndExceptionItems() { + BatchItem validationItem = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:111"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + BatchItem filterItem = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:222"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + BatchItem successItem = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:333"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + + collection.addException( + new AspectValidationException( + validationItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + collection.addException( + new AspectValidationException(filterItem, ERROR_MESSAGE, ValidationSubType.FILTER, null)); + + Collection items = Arrays.asList(validationItem, filterItem, successItem); + + // Test successful items + Collection successful = collection.successful(items); + assertEquals(successful.size(), 1); + assertTrue(successful.contains(successItem)); + + // Test exception items + Collection exceptions = collection.exceptions(items); + assertEquals(exceptions.size(), 1); + assertTrue(exceptions.contains(validationItem)); + assertFalse(exceptions.contains(filterItem)); // FILTER type should not be included + } + + @Test + public void testStreamOperations() { + BatchItem validationItem = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:111"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + BatchItem successItem = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:222"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + + collection.addException( + new AspectValidationException( + validationItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + + List items = Arrays.asList(validationItem, successItem); + + // Test streamSuccessful + List successful = collection.streamSuccessful(items.stream()).toList(); + assertEquals(successful.size(), 1); + assertTrue(successful.contains(successItem)); + + // Test streamExceptions + List exceptions = collection.streamExceptions(items.stream()).toList(); + assertEquals(exceptions.size(), 1); + assertTrue(exceptions.contains(validationItem)); + } + + @Test + public void testMultipleExceptionsForSameEntityDifferentAspects() { + BatchItem item1 = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:111"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + BatchItem item2 = + TestMCP.ofOneMCP(UrnUtils.getUrn("urn:li:chart:222"), new Status(), testEntityRegistry) + .stream() + .findFirst() + .get(); + + collection.addException( + new AspectValidationException(item1, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + collection.addException( + new AspectValidationException(item2, ERROR_MESSAGE, ValidationSubType.VALIDATION, null)); + + assertEquals(collection.size(), 2); + assertEquals(collection.getSubTypes().size(), 1); + } + + @Test + public void testToString() { + BatchItem testItem = + TestMCP.ofOneMCP(TEST_URN, new Status(), testEntityRegistry).stream().findFirst().get(); + AspectValidationException exception = + new AspectValidationException(testItem, ERROR_MESSAGE, ValidationSubType.VALIDATION, null); + + collection.addException(exception); + + String result = collection.toString(); + assertTrue(result.contains("ValidationExceptionCollection")); + assertTrue(result.contains("EntityAspect:")); + assertTrue(result.contains("urn:li:chart:123")); + } +} diff --git a/metadata-io/metadata-io-api/src/main/java/com/linkedin/metadata/entity/validation/ValidationException.java b/metadata-io/metadata-io-api/src/main/java/com/linkedin/metadata/entity/validation/ValidationException.java index 6a86a02a94449d..b5e95b87d2c44d 100644 --- a/metadata-io/metadata-io-api/src/main/java/com/linkedin/metadata/entity/validation/ValidationException.java +++ b/metadata-io/metadata-io-api/src/main/java/com/linkedin/metadata/entity/validation/ValidationException.java @@ -1,8 +1,21 @@ package com.linkedin.metadata.entity.validation; +import com.linkedin.metadata.aspect.plugins.validation.ValidationExceptionCollection; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import lombok.Getter; + /** Exception thrown when a metadata record cannot be validated against its schema. */ +@Getter public class ValidationException extends RuntimeException { + @Nullable private ValidationExceptionCollection validationExceptionCollection; + public ValidationException(final String message) { super(message); } + + public ValidationException(@Nonnull ValidationExceptionCollection validationExceptionCollection) { + this(validationExceptionCollection.toString()); + this.validationExceptionCollection = validationExceptionCollection; + } } diff --git a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java index 79894d603b5860..9ee4745e7fc15e 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityServiceImpl.java @@ -959,7 +959,8 @@ private IngestAspectsResult ingestAspectsToLocalDB( MetricUtils.counter( EntityServiceImpl.class, "batch_request_validation_exception") .inc(); - throw new ValidationException(collectMetrics(exceptions).toString()); + collectMetrics(exceptions); + throw new ValidationException(exceptions); } MetricUtils.counter( diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/config/GlobalControllerExceptionHandler.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/config/GlobalControllerExceptionHandler.java index 4809b483b74de1..1430faf2fd26b5 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/config/GlobalControllerExceptionHandler.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/config/GlobalControllerExceptionHandler.java @@ -1,6 +1,8 @@ package io.datahubproject.openapi.config; +import com.linkedin.metadata.aspect.plugins.validation.ValidationSubType; import com.linkedin.metadata.dao.throttle.APIThrottleException; +import com.linkedin.metadata.entity.validation.ValidationException; import io.datahubproject.metadata.exception.ActorAccessException; import io.datahubproject.openapi.exception.InvalidUrnException; import io.datahubproject.openapi.exception.UnauthorizedException; @@ -8,6 +10,8 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; import javax.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.ConversionNotSupportedException; @@ -32,7 +36,7 @@ public void init() { } public GlobalControllerExceptionHandler() { - setOrder(Ordered.HIGHEST_PRECEDENCE); + setOrder(Ordered.LOWEST_PRECEDENCE - 1); setWarnLogCategory(getClass().getName()); } @@ -72,21 +76,39 @@ public static ResponseEntity> actorAccessException(ActorAcce @Override protected void logException(Exception ex, HttpServletRequest request) { - log.error("Error while resolving request: " + request.getRequestURI(), ex); + log.error("Error while resolving request: {}", request.getRequestURI(), ex); } @Override protected void sendServerError( - Exception ex, HttpServletRequest request, HttpServletResponse response) throws IOException { - log.error("Error while resolving request: " + request.getRequestURI(), ex); + @Nullable Exception ex, HttpServletRequest request, HttpServletResponse response) + throws IOException { + log.error("Error while resolving request: {}", request.getRequestURI(), ex); request.setAttribute("jakarta.servlet.error.exception", ex); - response.sendError(500); + response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value()); + } + + @ExceptionHandler(ValidationException.class) + public ResponseEntity> handleValidationException( + ValidationException e, HttpServletRequest request) { + log.error("Validation exception occurred for request:{}", request.getRequestURI(), e); + if (e.getValidationExceptionCollection() != null + && e.getValidationExceptionCollection() + .getSubTypes() + .equals(Set.of(ValidationSubType.PRECONDITION))) { + return new ResponseEntity<>( + Map.of("error", "Validation Error", "message", e.getMessage()), + HttpStatus.PRECONDITION_FAILED); + } else { + return new ResponseEntity<>( + Map.of("error", "Validation Error", "message", e.getMessage()), HttpStatus.BAD_REQUEST); + } } @ExceptionHandler(Exception.class) public ResponseEntity> handleGenericException( Exception e, HttpServletRequest request) { - log.error("Unhandled exception occurred for request: " + request.getRequestURI(), e); + log.error("Unhandled exception occurred for request: {}", request.getRequestURI(), e); return new ResponseEntity<>( Map.of("error", "Internal server error occurred"), HttpStatus.INTERNAL_SERVER_ERROR); } @@ -96,7 +118,7 @@ public static ResponseEntity> handleNoHandlerFoundException( NoHandlerFoundException ex, HttpServletRequest request) { String message = String.format("No endpoint %s %s.", ex.getHttpMethod(), ex.getRequestURL()); - log.error("No handler found for request: " + request.getRequestURI()); + log.error("No handler found for request: {}", request.getRequestURI()); return new ResponseEntity<>(Map.of("error", message), HttpStatus.NOT_FOUND); } } diff --git a/smoke-test/tests/openapi/v3/exceptions.json b/smoke-test/tests/openapi/v3/exceptions.json new file mode 100644 index 00000000000000..6ac498cc08c7b0 --- /dev/null +++ b/smoke-test/tests/openapi/v3/exceptions.json @@ -0,0 +1,71 @@ +[ + { + "request": { + "url": "/openapi/v3/entity/dataset/urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Atest%2CpreconditionV3%2CPROD%29", + "description": "Remove test dataset", + "method": "delete" + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset", + "description": "Test Precondition Validation Entity", + "params": { + "async": "false" + }, + "json": [ + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,preconditionV3,PROD)", + "status": { + "value": { + "removed": false + }, + "headers": { + "If-Version-Match": "-10000" + } + } + } + ] + }, + "response": { + "status_codes": [ + 412 + ], + "exclude_regex_paths": [ + "root\\['message'\\]" + ], + "json": { + "error": "Validation Error" + } + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset/urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Atest%2CpreconditionV3%2CPROD%29/status", + "description": "Test Precondition Validation Aspect", + "params": { + "createIfNotExists": "false", + "async": "false" + }, + "json": { + "value": { + "removed": false + }, + "headers": { + "If-Version-Match": "-10000" + } + } + }, + "response": { + "status_codes": [ + 412 + ], + "exclude_regex_paths": [ + "root\\['message'\\]" + ], + "json": { + "error": "Validation Error" + } + } + } +] \ No newline at end of file From 0ed3d7f4a4ce63db1348ece71a4731f9e920f2eb Mon Sep 17 00:00:00 2001 From: david-leifker <114954101+david-leifker@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:07:33 -0600 Subject: [PATCH 11/13] feat(openapi): point in time parameter (elasticsearch only) (#12553) --- .../controller/GenericEntitiesController.java | 12 +- .../openapi/v3/OpenAPIV3Generator.java | 8 +- .../v3/controller/EntityController.java | 12 +- smoke-test/tests/openapi/v3/entities.json | 160 ++++++++++++++++++ 4 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 smoke-test/tests/openapi/v3/entities.json diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/controller/GenericEntitiesController.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/controller/GenericEntitiesController.java index d3c67355d0f85d..b5e6120ec08035 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/controller/GenericEntitiesController.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/controller/GenericEntitiesController.java @@ -57,6 +57,8 @@ import io.datahubproject.openapi.models.GenericEntityScrollResult; import io.datahubproject.openapi.util.RequestInputUtil; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.InvocationTargetException; @@ -212,8 +214,12 @@ public ResponseEntity getEntities( Boolean skipCache, @RequestParam(value = "includeSoftDelete", required = false, defaultValue = "false") Boolean includeSoftDelete, - @RequestParam(value = "pitKeepAlive", required = false, defaultValue = "5m") - String pitKeepALive) + @Parameter( + schema = @Schema(nullable = true), + description = + "Point In Time keep alive, accepts a time based string like \"5m\" for five minutes.") + @RequestParam(value = "pitKeepAlive", required = false, defaultValue = "5m") + String pitKeepAlive) throws URISyntaxException { EntitySpec entitySpec = entityRegistry.getEntitySpec(entityName); @@ -261,7 +267,7 @@ public ResponseEntity getEntities( null, sortCriteria, scrollId, - pitKeepALive, + pitKeepAlive != null && pitKeepAlive.isEmpty() ? null : pitKeepAlive, count); if (!AuthUtil.isAPIAuthorizedResult(opContext, result)) { diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java index 349672ef2dcecc..4a2293fd4c613c 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java @@ -360,6 +360,12 @@ private static PathItem buildListEntityPath(final EntitySpec entity) { .$ref( String.format( "#/components/parameters/%s", aspectParameterName + MODEL_VERSION)), + new Parameter() + .in(NAME_QUERY) + .name(NAME_PIT_KEEP_ALIVE) + .description( + "Point In Time keep alive, accepts a time based string like \"5m\" for five minutes.") + .schema(new Schema().type(TYPE_STRING)._default("5m")), new Parameter().$ref("#/components/parameters/PaginationCount" + MODEL_VERSION), new Parameter().$ref("#/components/parameters/ScrollId" + MODEL_VERSION), new Parameter().$ref("#/components/parameters/SortBy" + MODEL_VERSION), @@ -534,7 +540,7 @@ private static PathItem buildGenericListEntitiesPath() { .name(NAME_PIT_KEEP_ALIVE) .description( "Point In Time keep alive, accepts a time based string like \"5m\" for five minutes.") - .schema(new Schema().type(TYPE_STRING)._default("5m")), + .schema(new Schema().type(TYPE_STRING)._default("5m").nullable(true)), new Parameter().$ref("#/components/parameters/PaginationCount" + MODEL_VERSION), new Parameter().$ref("#/components/parameters/ScrollId" + MODEL_VERSION), new Parameter().$ref("#/components/parameters/SortBy" + MODEL_VERSION), diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/controller/EntityController.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/controller/EntityController.java index 9bf7851653d920..6236b1eb7a7d3a 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/controller/EntityController.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/controller/EntityController.java @@ -59,6 +59,8 @@ import io.datahubproject.openapi.v3.models.GenericEntityV3; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import java.net.URISyntaxException; @@ -160,8 +162,12 @@ public ResponseEntity scrollEntities( Boolean skipCache, @RequestParam(value = "includeSoftDelete", required = false, defaultValue = "false") Boolean includeSoftDelete, - @RequestParam(value = "pitKeepAlive", required = false, defaultValue = "5m") - String pitKeepALive, + @Parameter( + schema = @Schema(nullable = true), + description = + "Point In Time keep alive, accepts a time based string like \"5m\" for five minutes.") + @RequestParam(value = "pitKeepAlive", required = false, defaultValue = "5m") + String pitKeepAlive, @RequestBody @Nonnull GenericEntityAspectsBodyV3 entityAspectsBody) throws URISyntaxException { @@ -218,7 +224,7 @@ public ResponseEntity scrollEntities( null, sortCriteria, scrollId, - pitKeepALive, + pitKeepAlive != null && pitKeepAlive.isEmpty() ? null : pitKeepAlive, count); if (!AuthUtil.isAPIAuthorizedResult(opContext, result)) { diff --git a/smoke-test/tests/openapi/v3/entities.json b/smoke-test/tests/openapi/v3/entities.json new file mode 100644 index 00000000000000..079174fd78bcab --- /dev/null +++ b/smoke-test/tests/openapi/v3/entities.json @@ -0,0 +1,160 @@ +[ + { + "request": { + "url": "/openapi/v3/entity/dataset/urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Atest%2Cdataset1EntityV3%2CPROD%29", + "description": "Remove test dataset 1", + "method": "delete" + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset/urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Atest%2Cdataset2EntityV3%2CPROD%29", + "description": "Remove test dataset 2", + "method": "delete" + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset/urn%3Ali%3Adataset%3A%28urn%3Ali%3AdataPlatform%3Atest%2Cdataset3EntityV3%2CPROD%29", + "description": "Remove test dataset 3", + "method": "delete" + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset", + "params": { + "createIfNotExists": "false", + "createEntityIfNotExists": "false", + "async": "false" + }, + "description": "Create 3 datasets", + "json": [ + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,dataset1EntityV3,PROD)", + "datasetProperties": { + "value": { + "name": "dataset1EntityV3", + "qualifiedName": "entities.dataset1EntityV3", + "customProperties": {}, + "tags": [] + } + }, + "status": { + "value": { + "removed": false + } + } + }, + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,dataset2EntityV3,PROD)", + "datasetProperties": { + "value": { + "name": "dataset2EntityV3", + "qualifiedName": "entities.dataset2EntityV3", + "customProperties": {}, + "tags": [] + } + }, + "status": { + "value": { + "removed": false + } + } + }, + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,dataset3EntityV3,PROD)", + "datasetProperties": { + "value": { + "name": "dataset3EntityV3", + "qualifiedName": "entities.dataset3EntityV3", + "customProperties": {}, + "tags": [] + } + }, + "status": { + "value": { + "removed": false + } + } + } + ] + } + }, + { + "request": { + "url": "/openapi/v3/entity/scroll", + "params": { + "pitKeepAlive": "1m", + "count": "1", + "query": "qualifiedName:entities\\.dataset*", + "sortCriteria": "urn" + }, + "description": "Generic scroll", + "json": { + "aspects": [ + "datasetProperties" + ] + } + }, + "response": { + "exclude_regex_paths": [ + "root\\['scrollId'\\]" + ], + "json": { + "entities": [ + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,dataset1EntityV3,PROD)", + "datasetProperties": { + "value": { + "name": "dataset1EntityV3", + "qualifiedName": "entities.dataset1EntityV3", + "customProperties": {}, + "tags": [] + } + } + } + ] + } + } + }, + { + "request": { + "url": "/openapi/v3/entity/dataset?aspects=datasetProperties&aspects=status", + "method": "get", + "params": { + "pitKeepAlive": "1m", + "count": "1", + "query": "qualifiedName:entities\\.dataset*", + "sortCriteria": "urn", + "sortOrder": "DESCENDING" + }, + "description": "Dataset Entity scroll" + }, + "response": { + "exclude_regex_paths": [ + "root\\['scrollId'\\]" + ], + "json": { + "entities": [ + { + "urn": "urn:li:dataset:(urn:li:dataPlatform:test,dataset3EntityV3,PROD)", + "datasetProperties": { + "value": { + "name": "dataset3EntityV3", + "qualifiedName": "entities.dataset3EntityV3", + "customProperties": {}, + "tags": [] + } + }, + "status": { + "value": { + "removed": false + } + } + } + ] + } + } + } +] \ No newline at end of file From 65376ee2d391b3599bec307ff7f83ead96d12eb4 Mon Sep 17 00:00:00 2001 From: david-leifker <114954101+david-leifker@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:17:53 -0600 Subject: [PATCH 12/13] fix(openapi-spec): fix openapi spec oneOf schema (#12561) --- .../openapi/v3/OpenAPIV3Generator.java | 17 +++++++------ .../openapi/v3/OpenAPIV3GeneratorTest.java | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java index 4a2293fd4c613c..9b8df7d7c313d7 100644 --- a/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java +++ b/metadata-service/openapi-servlet/src/main/java/io/datahubproject/openapi/v3/OpenAPIV3Generator.java @@ -731,13 +731,16 @@ private static Schema buildAspectsRefResponseSchema(final EntityRegistry entityR .description(ASPECT_DESCRIPTION) .required(List.of(PROPERTY_VALUE)); - entityRegistry - .getAspectSpecs() - .values() - .forEach( - aspect -> - result.addProperty( - PROPERTY_VALUE, new Schema<>().$ref(PATH_DEFINITIONS + aspect.getName()))); + // Create a list of reference schemas for each aspect + List aspectRefs = + entityRegistry.getAspectSpecs().values().stream() + .map(aspect -> new Schema<>().$ref(PATH_DEFINITIONS + toUpperFirst(aspect.getName()))) + .distinct() + .collect(Collectors.toList()); + + // Add the value property with oneOf constraint + result.addProperty(PROPERTY_VALUE, new Schema<>().oneOf(aspectRefs)); + result.addProperty( NAME_SYSTEM_METADATA, new Schema<>() diff --git a/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java b/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java index d8f04b60455abb..30b8d823605393 100644 --- a/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java +++ b/metadata-service/openapi-servlet/src/test/java/io/datahubproject/openapi/v3/OpenAPIV3GeneratorTest.java @@ -105,5 +105,30 @@ public void testOpenApiSpecBuilder() throws Exception { entry -> assertEquals( "#/components/schemas/BatchGetRequestBody", entry.getValue().get$ref())); + + // Assert aspect response schemas have value property with oneOf references + Schema aspectResponseSchema = + openAPI.getComponents().getSchemas().get("AspectsAspectResponse_v3"); + Schema valueProperty = aspectResponseSchema.getProperties().get("value"); + assertTrue( + valueProperty.getOneOf() != null && !valueProperty.getOneOf().isEmpty(), + "value property should use oneOf"); + + // Check each reference has proper format and capitalization + valueProperty + .getOneOf() + .forEach( + schema -> { + String ref = schema.get$ref(); + assertTrue( + ref != null && ref.startsWith("#/components/schemas/"), + "reference should start with '#/components/schemas/': " + ref); + + // Extract the last part after the last slash and check first character + String refName = ref.substring(ref.lastIndexOf('/') + 1); + assertTrue( + Character.isUpperCase(refName.charAt(0)), + "schema reference should start with capital letter: " + name); + }); } } From 52f71dd111e2cb70a7275d6121e7edb039cc4e99 Mon Sep 17 00:00:00 2001 From: david-leifker <114954101+david-leifker@users.noreply.github.com> Date: Wed, 5 Feb 2025 20:04:53 -0600 Subject: [PATCH 13/13] fix(autocomplete): fix autocomplete duplicate field (#12558) --- .../elasticsearch/query/ESBrowseDAO.java | 4 +- .../elasticsearch/query/ESSearchDAO.java | 18 +++-- .../request/AutocompleteRequestHandler.java | 67 +++++++++--------- .../query/request/BaseRequestHandler.java | 69 +++++++++++++++++++ .../query/request/SearchRequestHandler.java | 60 ++++++---------- .../AutocompleteRequestHandlerTest.java | 40 +++++++---- .../request/SearchRequestHandlerTest.java | 36 +++------- .../gms/servlet/ConfigSearchExport.java | 11 +-- 8 files changed, 173 insertions(+), 132 deletions(-) create mode 100644 metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/BaseRequestHandler.java diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java index 3a84d1cb2de489..1c20d5a6ef8d91 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java @@ -642,7 +642,7 @@ private QueryBuilder buildQueryStringV2( EntitySpec entitySpec = opContext.getEntityRegistry().getEntitySpec(entityName); QueryBuilder query = SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpec, searchConfiguration, customSearchConfiguration, @@ -683,7 +683,7 @@ private QueryBuilder buildQueryStringBrowseAcrossEntities( QueryBuilder query = SearchRequestHandler.getBuilder( - finalOpContext.getEntityRegistry(), + finalOpContext, entitySpecs, searchConfiguration, customSearchConfiguration, diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESSearchDAO.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESSearchDAO.java index a720e0bf815c26..ae483ad7711b02 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESSearchDAO.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESSearchDAO.java @@ -150,7 +150,7 @@ private SearchResult executeAndExtract( return transformIndexIntoEntityName( opContext.getSearchContext().getIndexConvention(), SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpec, searchConfiguration, customSearchConfiguration, @@ -257,7 +257,7 @@ private ScrollResult executeAndExtract( return transformIndexIntoEntityName( opContext.getSearchContext().getIndexConvention(), SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpecs, searchConfiguration, customSearchConfiguration, @@ -311,7 +311,7 @@ public SearchResult search( "searchRequest", () -> SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpecs, searchConfiguration, customSearchConfiguration, @@ -357,7 +357,7 @@ public SearchResult filter( Filter transformedFilters = transformFilterForEntities(filters, indexConvention); final SearchRequest searchRequest = SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpec, searchConfiguration, customSearchConfiguration, @@ -395,7 +395,11 @@ public AutoCompleteResult autoComplete( IndexConvention indexConvention = opContext.getSearchContext().getIndexConvention(); AutocompleteRequestHandler builder = AutocompleteRequestHandler.getBuilder( - entitySpec, customSearchConfiguration, queryFilterRewriteChain, searchConfiguration); + opContext, + entitySpec, + customSearchConfiguration, + queryFilterRewriteChain, + searchConfiguration); SearchRequest req = builder.getSearchRequest( opContext, @@ -441,7 +445,7 @@ public Map aggregateByValue( IndexConvention indexConvention = opContext.getSearchContext().getIndexConvention(); final SearchRequest searchRequest = SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpecs, searchConfiguration, customSearchConfiguration, @@ -578,7 +582,7 @@ private SearchRequest getScrollRequest( } return SearchRequestHandler.getBuilder( - opContext.getEntityRegistry(), + opContext, entitySpecs, searchConfiguration, customSearchConfiguration, diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AutocompleteRequestHandler.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AutocompleteRequestHandler.java index 45359285b4a046..d755d5c6f7a408 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AutocompleteRequestHandler.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AutocompleteRequestHandler.java @@ -23,6 +23,7 @@ import io.datahubproject.metadata.context.OperationContext; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -45,9 +46,9 @@ import org.opensearch.search.fetch.subphase.highlight.HighlightBuilder; @Slf4j -public class AutocompleteRequestHandler { +public class AutocompleteRequestHandler extends BaseRequestHandler { - private final List _defaultAutocompleteFields; + private final List> _defaultAutocompleteFields; private final Map> searchableFieldTypes; private static final Map @@ -58,8 +59,10 @@ public class AutocompleteRequestHandler { private final EntitySpec entitySpec; private final QueryFilterRewriteChain queryFilterRewriteChain; private final SearchConfiguration searchConfiguration; + @Nonnull private final HighlightBuilder highlights; public AutocompleteRequestHandler( + @Nonnull OperationContext systemOperationContext, @Nonnull EntitySpec entitySpec, @Nullable CustomSearchConfiguration customSearchConfiguration, @Nonnull QueryFilterRewriteChain queryFilterRewriteChain, @@ -79,6 +82,7 @@ public AutocompleteRequestHandler( Double.toString(searchableAnnotation.getBoostScore()))), Stream.of(Pair.of("urn", "1.0"))) .collect(Collectors.toList()); + this.highlights = getDefaultHighlights(systemOperationContext); searchableFieldTypes = fieldSpecs.stream() .collect( @@ -98,6 +102,7 @@ public AutocompleteRequestHandler( } public static AutocompleteRequestHandler getBuilder( + @Nonnull OperationContext systemOperationContext, @Nonnull EntitySpec entitySpec, @Nullable CustomSearchConfiguration customSearchConfiguration, @Nonnull QueryFilterRewriteChain queryFilterRewriteChain, @@ -106,6 +111,7 @@ public static AutocompleteRequestHandler getBuilder( entitySpec, k -> new AutocompleteRequestHandler( + systemOperationContext, entitySpec, customSearchConfiguration, queryFilterRewriteChain, @@ -165,7 +171,8 @@ public SearchRequest getSearchRequest( ESUtils.buildSortOrder(searchSourceBuilder, null, List.of(entitySpec)); // wire inner non-scored query - searchSourceBuilder.highlighter(getHighlights(field)); + searchSourceBuilder.highlighter( + field == null || field.isEmpty() ? highlights : getHighlights(opContext, List.of(field))); searchRequest.source(searchSourceBuilder); return searchRequest; } @@ -181,7 +188,7 @@ private BoolQueryBuilder getQuery( public BoolQueryBuilder getQuery( @Nonnull ObjectMapper objectMapper, @Nullable AutocompleteConfiguration customAutocompleteConfig, - List autocompleteFields, + List> autocompleteFields, @Nonnull String query) { BoolQueryBuilder finalQuery = @@ -201,7 +208,7 @@ public BoolQueryBuilder getQuery( private Optional getAutocompleteQuery( @Nullable AutocompleteConfiguration customConfig, - List autocompleteFields, + List> autocompleteFields, @Nonnull String query) { Optional result = Optional.empty(); @@ -212,7 +219,8 @@ private Optional getAutocompleteQuery( return result; } - private BoolQueryBuilder defaultQuery(List autocompleteFields, @Nonnull String query) { + private BoolQueryBuilder defaultQuery( + List> autocompleteFields, @Nonnull String query) { BoolQueryBuilder finalQuery = QueryBuilders.boolQuery().minimumShouldMatch(1); // Search for exact matches with higher boost and ngram matches @@ -248,38 +256,25 @@ private BoolQueryBuilder defaultQuery(List autocompleteFields, @Nonnull St return finalQuery; } - // Get HighlightBuilder to highlight the matched field - private HighlightBuilder getHighlights(@Nullable String field) { - HighlightBuilder highlightBuilder = - new HighlightBuilder() - // Don't set tags to get the original field value - .preTags("") - .postTags("") - .numOfFragments(1); - // Check for each field name and any subfields - getAutocompleteFields(field) - .forEach( - pair -> { - final String fieldName = (String) pair.getLeft(); - highlightBuilder - .field(fieldName) - .field(fieldName + ".*") - .field(fieldName + ".ngram") - .field(fieldName + ".delimited"); - if (!fieldName.equalsIgnoreCase("urn")) { - highlightBuilder.field(fieldName + ".keyword"); - } - }); - - // set field match req false for ngram - highlightBuilder.fields().stream() - .filter(f -> f.name().contains("ngram")) - .forEach(f -> f.requireFieldMatch(false).noMatchSize(200)); - - return highlightBuilder; + @Override + public Collection getDefaultQueryFieldNames() { + return _defaultAutocompleteFields.stream().map(Pair::getKey).collect(Collectors.toList()); } - private List getAutocompleteFields(@Nullable String field) { + @Override + protected Collection getValidQueryFieldNames() { + return searchableFieldTypes.keySet(); + } + + @Override + protected Stream highlightFieldExpansion( + @Nonnull OperationContext opContext, @Nonnull String fieldName) { + return Stream.concat( + Stream.of(fieldName, fieldName + ".*", fieldName + ".ngram", fieldName + ".delimited"), + Stream.of(ESUtils.toKeywordField(fieldName, false, opContext.getAspectRetriever()))); + } + + private List> getAutocompleteFields(@Nullable String field) { if (field != null && !field.isEmpty() && !field.equalsIgnoreCase("urn")) { return ImmutableList.of(Pair.of(field, "10.0")); } diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/BaseRequestHandler.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/BaseRequestHandler.java new file mode 100644 index 00000000000000..ec431221078b2f --- /dev/null +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/BaseRequestHandler.java @@ -0,0 +1,69 @@ +package com.linkedin.metadata.search.elasticsearch.query.request; + +import com.google.common.annotations.VisibleForTesting; +import io.datahubproject.metadata.context.OperationContext; +import java.util.Collection; +import java.util.Objects; +import java.util.stream.Stream; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opensearch.search.fetch.subphase.highlight.HighlightBuilder; + +public abstract class BaseRequestHandler { + + /** + * Provide the fields which are queried by default + * + * @return collection of field names + */ + protected abstract Collection getDefaultQueryFieldNames(); + + protected abstract Collection getValidQueryFieldNames(); + + protected abstract Stream highlightFieldExpansion( + @Nonnull OperationContext opContext, @Nonnull String fieldName); + + @VisibleForTesting + public HighlightBuilder getDefaultHighlights(@Nonnull OperationContext opContext) { + return getHighlights(opContext, null); + } + + @VisibleForTesting + public HighlightBuilder getHighlights( + @Nonnull OperationContext opContext, @Nullable Collection fieldsToHighlight) { + HighlightBuilder highlightBuilder = + new HighlightBuilder() + // Don't set tags to get the original field value + .preTags("") + .postTags("") + .numOfFragments(1); + + final Stream fieldStream; + if (fieldsToHighlight == null || fieldsToHighlight.isEmpty()) { + fieldStream = getDefaultQueryFieldNames().stream(); + } else { + // filter for valid names + fieldStream = + fieldsToHighlight.stream() + .filter(Objects::nonNull) + .filter(fieldName -> !fieldName.isEmpty()) + .filter(getValidQueryFieldNames()::contains); + } + + fieldStream + .flatMap(fieldName -> highlightFieldExpansion(opContext, fieldName)) + .distinct() + .map(HighlightBuilder.Field::new) + .map( + field -> { + if (field.name().endsWith("ngram")) { + return field.requireFieldMatch(false).noMatchSize(200); + } else { + return field; + } + }) + .forEach(highlightBuilder::field); + + return highlightBuilder; + } +} diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/SearchRequestHandler.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/SearchRequestHandler.java index 0ecf1a932e4bfd..90ab6cd5979faf 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/SearchRequestHandler.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/SearchRequestHandler.java @@ -78,7 +78,7 @@ import org.opensearch.search.suggest.term.TermSuggestion; @Slf4j -public class SearchRequestHandler { +public class SearchRequestHandler extends BaseRequestHandler { private static final Map, SearchRequestHandler> REQUEST_HANDLER_BY_ENTITY_NAME = new ConcurrentHashMap<>(); @@ -94,13 +94,13 @@ public class SearchRequestHandler { private final QueryFilterRewriteChain queryFilterRewriteChain; private SearchRequestHandler( - @Nonnull EntityRegistry entityRegistry, + @Nonnull OperationContext opContext, @Nonnull EntitySpec entitySpec, @Nonnull SearchConfiguration configs, @Nullable CustomSearchConfiguration customSearchConfiguration, @Nonnull QueryFilterRewriteChain queryFilterRewriteChain) { this( - entityRegistry, + opContext, ImmutableList.of(entitySpec), configs, customSearchConfiguration, @@ -108,7 +108,7 @@ private SearchRequestHandler( } private SearchRequestHandler( - @Nonnull EntityRegistry entityRegistry, + @Nonnull OperationContext opContext, @Nonnull List entitySpecs, @Nonnull SearchConfiguration configs, @Nullable CustomSearchConfiguration customSearchConfiguration, @@ -121,16 +121,17 @@ private SearchRequestHandler( .flatMap(List::stream) .collect(Collectors.toList()); defaultQueryFieldNames = getDefaultQueryFieldNames(annotations); - highlights = getHighlights(); + highlights = getDefaultHighlights(opContext); searchQueryBuilder = new SearchQueryBuilder(configs, customSearchConfiguration); aggregationQueryBuilder = new AggregationQueryBuilder(configs, entitySearchAnnotations); this.configs = configs; - this.searchableFieldTypes = buildSearchableFieldTypes(entityRegistry, entitySpecs); + this.searchableFieldTypes = + buildSearchableFieldTypes(opContext.getEntityRegistry(), entitySpecs); this.queryFilterRewriteChain = queryFilterRewriteChain; } public static SearchRequestHandler getBuilder( - @Nonnull EntityRegistry entityRegistry, + @Nonnull OperationContext systemOperationContext, @Nonnull EntitySpec entitySpec, @Nonnull SearchConfiguration configs, @Nullable CustomSearchConfiguration customSearchConfiguration, @@ -139,7 +140,7 @@ public static SearchRequestHandler getBuilder( ImmutableList.of(entitySpec), k -> new SearchRequestHandler( - entityRegistry, + systemOperationContext, entitySpec, configs, customSearchConfiguration, @@ -147,7 +148,7 @@ public static SearchRequestHandler getBuilder( } public static SearchRequestHandler getBuilder( - @Nonnull EntityRegistry entityRegistry, + @Nonnull OperationContext systemOperationContext, @Nonnull List entitySpecs, @Nonnull SearchConfiguration configs, @Nullable CustomSearchConfiguration customSearchConfiguration, @@ -156,7 +157,7 @@ public static SearchRequestHandler getBuilder( ImmutableList.copyOf(entitySpecs), k -> new SearchRequestHandler( - entityRegistry, + systemOperationContext, entitySpecs, configs, customSearchConfiguration, @@ -185,6 +186,11 @@ private Set getDefaultQueryFieldNames(List annotat .collect(Collectors.toSet()); } + @Override + protected Collection getValidQueryFieldNames() { + return searchableFieldTypes.keySet(); + } + public BoolQueryBuilder getFilterQuery( @Nonnull OperationContext opContext, @Nullable Filter filter) { return getFilterQuery(opContext, filter, searchableFieldTypes, queryFilterRewriteChain); @@ -246,7 +252,7 @@ public SearchRequest getSearchRequest( if (Boolean.FALSE.equals(searchFlags.isSkipHighlighting())) { if (CollectionUtils.isNotEmpty(searchFlags.getCustomHighlightingFields())) { searchSourceBuilder.highlighter( - getValidatedHighlighter(searchFlags.getCustomHighlightingFields())); + getHighlights(opContext, searchFlags.getCustomHighlightingFields())); } else { searchSourceBuilder.highlighter(highlights); } @@ -383,22 +389,10 @@ public QueryBuilder getQuery( return searchQueryBuilder.buildQuery(opContext, entitySpecs, query, fulltext); } - @VisibleForTesting - public HighlightBuilder getHighlights() { - HighlightBuilder highlightBuilder = - new HighlightBuilder() - // Don't set tags to get the original field value - .preTags("") - .postTags("") - .numOfFragments(1); - - // Check for each field name and any subfields - defaultQueryFieldNames.stream() - .flatMap(fieldName -> Stream.of(fieldName, fieldName + ".*")) - .distinct() - .forEach(highlightBuilder::field); - - return highlightBuilder; + @Override + protected Stream highlightFieldExpansion( + @Nonnull OperationContext opContext, @Nonnull String fieldName) { + return Stream.of(fieldName, fieldName + ".*"); } @WithSpan @@ -597,18 +591,6 @@ private List extractSearchSuggestions(@Nonnull SearchResponse return searchSuggestions; } - private HighlightBuilder getValidatedHighlighter(Collection fieldsToHighlight) { - HighlightBuilder highlightBuilder = new HighlightBuilder(); - highlightBuilder.preTags(""); - highlightBuilder.postTags(""); - fieldsToHighlight.stream() - .filter(defaultQueryFieldNames::contains) - .flatMap(fieldName -> Stream.of(fieldName, fieldName + ".*")) - .distinct() - .forEach(highlightBuilder::field); - return highlightBuilder; - } - /** * Calculate the field types based on annotations if available, with fallback to ES mappings * diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/AutocompleteRequestHandlerTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/AutocompleteRequestHandlerTest.java index e91dc1e6a8b0b9..4055736926f43e 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/AutocompleteRequestHandlerTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/AutocompleteRequestHandlerTest.java @@ -49,11 +49,12 @@ import org.opensearch.index.query.functionscore.ScoreFunctionBuilders; import org.opensearch.search.builder.SearchSourceBuilder; import org.opensearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class AutocompleteRequestHandlerTest { private static SearchConfiguration testQueryConfig; - private static AutocompleteRequestHandler handler; + private AutocompleteRequestHandler handler; private OperationContext mockOpContext = TestOperationContexts.systemContextNoSearchAuthorization(mock(EntityRegistry.class)); private OperationContext nonMockOpContext = @@ -83,9 +84,13 @@ public class AutocompleteRequestHandlerTest { testQueryConfig.setExactMatch(exactMatchConfiguration); testQueryConfig.setWordGram(wordGramConfiguration); testQueryConfig.setPartial(partialConfiguration); + } + @BeforeClass + public void beforeTest() { handler = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder().build(), QueryFilterRewriteChain.EMPTY, @@ -177,9 +182,9 @@ public void testDefaultAutocompleteRequest() { @Test public void testAutocompleteRequestWithField() { - // When field is null + // The field must be a valid field in the model. Pick from `keyPart1` or `urn` SearchRequest autocompleteRequest = - handler.getSearchRequest(mockOpContext, "input", "field", null, 10); + handler.getSearchRequest(mockOpContext, "input", "keyPart1", null, 10); SearchSourceBuilder sourceBuilder = autocompleteRequest.source(); assertEquals(sourceBuilder.size(), 10); BoolQueryBuilder wrapper = @@ -189,19 +194,19 @@ public void testAutocompleteRequestWithField() { assertEquals(query.should().size(), 3); MatchQueryBuilder matchQueryBuilder = (MatchQueryBuilder) query.should().get(0); - assertEquals("field.keyword", matchQueryBuilder.fieldName()); + assertEquals("keyPart1.keyword", matchQueryBuilder.fieldName()); MultiMatchQueryBuilder autocompleteQuery = (MultiMatchQueryBuilder) query.should().get(2); Map queryFields = autocompleteQuery.fields(); - assertTrue(queryFields.containsKey("field.ngram")); - assertTrue(queryFields.containsKey("field.ngram._2gram")); - assertTrue(queryFields.containsKey("field.ngram._3gram")); - assertTrue(queryFields.containsKey("field.ngram._4gram")); + assertTrue(queryFields.containsKey("keyPart1.ngram")); + assertTrue(queryFields.containsKey("keyPart1.ngram._2gram")); + assertTrue(queryFields.containsKey("keyPart1.ngram._3gram")); + assertTrue(queryFields.containsKey("keyPart1.ngram._4gram")); assertEquals(autocompleteQuery.type(), MultiMatchQueryBuilder.Type.BOOL_PREFIX); MatchPhrasePrefixQueryBuilder prefixQuery = (MatchPhrasePrefixQueryBuilder) query.should().get(1); - assertEquals("field.delimited", prefixQuery.fieldName()); + assertEquals("keyPart1.delimited", prefixQuery.fieldName()); TermQueryBuilder removedFilter = (TermQueryBuilder) wrapper.mustNot().get(0); assertEquals(removedFilter.fieldName(), "removed"); @@ -209,11 +214,11 @@ public void testAutocompleteRequestWithField() { HighlightBuilder highlightBuilder = sourceBuilder.highlighter(); List highlightedFields = highlightBuilder.fields(); assertEquals(highlightedFields.size(), 5); - assertEquals(highlightedFields.get(0).name(), "field"); - assertEquals(highlightedFields.get(1).name(), "field.*"); - assertEquals(highlightedFields.get(2).name(), "field.ngram"); - assertEquals(highlightedFields.get(3).name(), "field.delimited"); - assertEquals(highlightedFields.get(4).name(), "field.keyword"); + assertEquals(highlightedFields.get(0).name(), "keyPart1"); + assertEquals(highlightedFields.get(1).name(), "keyPart1.*"); + assertEquals(highlightedFields.get(2).name(), "keyPart1.ngram"); + assertEquals(highlightedFields.get(3).name(), "keyPart1.delimited"); + assertEquals(highlightedFields.get(4).name(), "keyPart1.keyword"); } @Test @@ -221,6 +226,7 @@ public void testCustomConfigWithDefault() { // Exclude Default query AutocompleteRequestHandler withoutDefaultQuery = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .autocompleteConfigurations( @@ -248,6 +254,7 @@ public void testCustomConfigWithDefault() { // Include Default query AutocompleteRequestHandler withDefaultQuery = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .autocompleteConfigurations( @@ -290,6 +297,7 @@ public void testCustomConfigWithInheritedQueryFunctionScores() { // Pickup scoring functions from non-autocomplete AutocompleteRequestHandler withInherit = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .queryConfigurations(List.of(TEST_QUERY_CONFIG)) @@ -332,6 +340,7 @@ public void testCustomConfigWithInheritedQueryFunctionScores() { // no search query customization AutocompleteRequestHandler noQueryCustomization = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .autocompleteConfigurations( @@ -378,6 +387,7 @@ public void testCustomConfigWithFunctionScores() { // Scoring functions explicit autocomplete override AutocompleteRequestHandler explicitNoInherit = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .queryConfigurations(List.of(TEST_QUERY_CONFIG)) // should be ignored @@ -432,6 +442,7 @@ public void testCustomConfigWithFunctionScores() { // inherit enabled) AutocompleteRequestHandler explicit = AutocompleteRequestHandler.getBuilder( + mockOpContext, TestEntitySpecBuilder.getSpec(), CustomSearchConfiguration.builder() .queryConfigurations(List.of(TEST_QUERY_CONFIG)) // should be ignored @@ -605,6 +616,7 @@ private BoolQueryBuilder getQuery( AutocompleteRequestHandler requestHandler = AutocompleteRequestHandler.getBuilder( + mockOpContext, entitySpec, CustomSearchConfiguration.builder().build(), QueryFilterRewriteChain.EMPTY, diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java index 62b9572d3c7a9e..f1e56e63502ffc 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java @@ -119,17 +119,13 @@ public void testDatasetFieldsAndHighlights() { EntitySpec entitySpec = operationContext.getEntityRegistry().getEntitySpec("dataset"); SearchRequestHandler datasetHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), - entitySpec, - testQueryConfig, - null, - QueryFilterRewriteChain.EMPTY); + operationContext, entitySpec, testQueryConfig, null, QueryFilterRewriteChain.EMPTY); /* Ensure efficient query performance, we do not expect upstream/downstream/fineGrained lineage */ List highlightFields = - datasetHandler.getHighlights().fields().stream() + datasetHandler.getDefaultHighlights(operationContext).fields().stream() .map(HighlightBuilder.Field::name) .collect(Collectors.toList()); assertTrue( @@ -144,7 +140,7 @@ public void testCustomHighlights() { EntitySpec entitySpec = operationContext.getEntityRegistry().getEntitySpec("dataset"); SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), + operationContext, TestEntitySpecBuilder.getSpec(), testQueryConfig, null, @@ -174,7 +170,7 @@ public void testCustomHighlights() { public void testSearchRequestHandlerHighlightingTurnedOff() { SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), + operationContext, TestEntitySpecBuilder.getSpec(), testQueryConfig, null, @@ -220,7 +216,7 @@ public void testSearchRequestHandlerHighlightingTurnedOff() { public void testSearchRequestHandler() { SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), + operationContext, TestEntitySpecBuilder.getSpec(), testQueryConfig, null, @@ -294,7 +290,7 @@ public void testSearchRequestHandler() { public void testAggregationsInSearch() { SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), + operationContext, TestEntitySpecBuilder.getSpec(), testQueryConfig, null, @@ -368,7 +364,7 @@ public void testFilteredSearch() { final SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), + operationContext, TestEntitySpecBuilder.getSpec(), testQueryConfig, null, @@ -793,11 +789,7 @@ public void testQueryByDefault() { operationContext.getEntityRegistry().getEntitySpec(EntityTypeMapper.getName(entityType)); SearchRequestHandler handler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), - entitySpec, - testQueryConfig, - null, - QueryFilterRewriteChain.EMPTY); + operationContext, entitySpec, testQueryConfig, null, QueryFilterRewriteChain.EMPTY); Set unexpected = new HashSet<>(handler.getDefaultQueryFieldNames()); unexpected.removeAll(expectedEntityQueryByDefault); @@ -1027,11 +1019,7 @@ private BoolQueryBuilder getQuery( final SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), - entitySpec, - testQueryConfig, - null, - QueryFilterRewriteChain.EMPTY); + operationContext, entitySpec, testQueryConfig, null, QueryFilterRewriteChain.EMPTY); return (BoolQueryBuilder) requestHandler @@ -1059,11 +1047,7 @@ private BoolQueryBuilder getAggregationQuery( final SearchRequestHandler requestHandler = SearchRequestHandler.getBuilder( - operationContext.getEntityRegistry(), - entitySpec, - testQueryConfig, - null, - QueryFilterRewriteChain.EMPTY); + operationContext, entitySpec, testQueryConfig, null, QueryFilterRewriteChain.EMPTY); return (BoolQueryBuilder) requestHandler diff --git a/metadata-service/servlet/src/main/java/com/datahub/gms/servlet/ConfigSearchExport.java b/metadata-service/servlet/src/main/java/com/datahub/gms/servlet/ConfigSearchExport.java index f80581bf6fbdde..720845e7ac1a33 100644 --- a/metadata-service/servlet/src/main/java/com/datahub/gms/servlet/ConfigSearchExport.java +++ b/metadata-service/servlet/src/main/java/com/datahub/gms/servlet/ConfigSearchExport.java @@ -6,7 +6,6 @@ import com.datahub.gms.util.CSVWriter; import com.linkedin.datahub.graphql.types.entitytype.EntityTypeMapper; import com.linkedin.gms.factory.config.ConfigurationProvider; -import com.linkedin.metadata.aspect.AspectRetriever; import com.linkedin.metadata.config.search.SearchConfiguration; import com.linkedin.metadata.models.EntitySpec; import com.linkedin.metadata.models.registry.EntityRegistry; @@ -40,10 +39,6 @@ private static ConfigurationProvider getConfigProvider(WebApplicationContext ctx return (ConfigurationProvider) ctx.getBean("configurationProvider"); } - private static AspectRetriever getAspectRetriever(WebApplicationContext ctx) { - return (AspectRetriever) ctx.getBean("aspectRetriever"); - } - private static OperationContext getOperationContext(WebApplicationContext ctx) { return (OperationContext) ctx.getBean("systemOperationContext"); } @@ -53,9 +48,9 @@ private static QueryFilterRewriteChain getQueryFilterRewriteChain(WebApplication } private void writeSearchCsv(WebApplicationContext ctx, PrintWriter pw) { + OperationContext systemOpContext = getOperationContext(ctx); SearchConfiguration searchConfiguration = getConfigProvider(ctx).getElasticSearch().getSearch(); - AspectRetriever aspectRetriever = getAspectRetriever(ctx); - EntityRegistry entityRegistry = aspectRetriever.getEntityRegistry(); + EntityRegistry entityRegistry = systemOpContext.getEntityRegistry(); QueryFilterRewriteChain queryFilterRewriteChain = getQueryFilterRewriteChain(ctx); CSVWriter writer = CSVWriter.builder().printWriter(pw).build(); @@ -92,7 +87,7 @@ private void writeSearchCsv(WebApplicationContext ctx, PrintWriter pw) { EntitySpec entitySpec = entitySpecOpt.get(); SearchRequest searchRequest = SearchRequestHandler.getBuilder( - entityRegistry, + systemOpContext, entitySpec, searchConfiguration, null,