From 4275daf8361a12558dc3bb06eb801ecb2321e2b6 Mon Sep 17 00:00:00 2001 From: dabdullin Date: Mon, 13 Jun 2022 14:20:23 +0300 Subject: [PATCH 01/57] V1 API --- odd-platform-specification/components.yaml | 96 ++++++++++++++++++++++ odd-platform-specification/openapi.yaml | 94 +++++++++++++++++++++ 2 files changed, 190 insertions(+) diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index e4a3d535a..d98c020cc 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -1770,6 +1770,102 @@ components: items: $ref: '#/components/schemas/SearchFilter' + ActivityList: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Activity' + page_info: + $ref: '#/components/schemas/PageInfo' + total_count: + type: integer + format: int64 + my_objects_count: + type: integer + format: int64 + downstream_count: + type: integer + format: int64 + upstream_count: + type: integer + format: int64 + required: + - items + - page_info + - total_count + - my_objects_count + - downstream_count + - upstream_count + + Activity: + type: object + properties: + event_type: + $ref: '#/components/schemas/ActivityEventType' + created_at: + type: string + format: date-time + created_by: + $ref: '#/components/schemas/AssociatedOwner' + data_entity: + $ref: '#/components/schemas/DataEntityRef' + old_state: + type: string + new_state: + type: string + + ActivityType: + type: string + enum: + - ALL + - MY_OBJECTS + - DOWNSTREAM + - UPSTREAM + + ActivityEventType: + type: string + enum: + - OWNER_CREATED + - OWNER_UPDATED + - OWNER_DELETED + - TAG_CREATED + - TAG_UPDATED + - TAG_DELETED + - DATA_ENTITY_CREATED + - DATA_ENTITY_INFO_UPDATED + - METADATA_UPDATED + - METADATA_DELETED + - SCHEMA_UPDATED + - RELATION_UPDATED + - TERM_CREATED + - TERM_UPDATED + - TERM_DELETED + - DESCRIPTION_CREATED + - DESCRIPTION_UPDATED + - DESCRIPTION_DELETED + - CUSTOM_METADATA_CREATED + - CUSTOM_METADATA_UPDATED + - CUSTOM_METADATA_DELETED + - ENUM_ASSOCIATION_CREATED + - ENUM_ASSOCIATION_UPDATED + - ENUM_ASSOCIATION_DELETED + - DATASET_FIELD_DESCRIPTION_CREATED + - DATASET_FIELD_DESCRIPTION_UPDATED + - DATASET_FIELD_DESCRIPTION_DELETED + - DATASET_FIELD_LABEL_CREATED + - DATASET_FIELD_LABEL_UPDATED + - DATASET_FIELD_LABEL_DELETED + - CUSTOM_GROUP_CREATED + - CUSTOM_GROUP_UPDATED + - CUSTOM_GROUP_DELETED + + ActivityEventTypeList: + type: array + items: + $ref: '#/components/schemas/ActivityEventType' + parameters: PageParam: name: page diff --git a/odd-platform-specification/openapi.yaml b/odd-platform-specification/openapi.yaml index c2431ffc5..4d9dfbe69 100644 --- a/odd-platform-specification/openapi.yaml +++ b/odd-platform-specification/openapi.yaml @@ -31,6 +31,7 @@ tags: - name: appInfo - name: collector - name: term + - name: activity paths: /api/identity/whoami: get: @@ -1874,3 +1875,96 @@ paths: $ref: './components.yaml/#/components/schemas/TagList' tags: - term + + /api/activity: + get: + summary: Get activity + description: Returns activity for dedicated period + operationId: getActivity + parameters: + - name: begin_date + in: query + required: true + schema: + type: string + format: date + - name: end_date + in: query + required: true + schema: + type: string + format: date + - name: datasource_id + in: query + schema: + type: integer + format: int64 + - name: namespace_id + in: query + schema: + type: integer + format: int64 + - name: tag_ids + in: query + schema: + type: array + items: + type: integer + format: int64 + - name: owner_ids + in: query + schema: + type: array + items: + type: integer + format: int64 + - name: user_ids + in: query + schema: + type: array + items: + type: integer + format: int64 + - name: type + in: query + schema: + $ref: './components.yaml/#/components/schemas/ActivityType' + - name: data_entity_id + in: query + schema: + type: integer + format: int64 + - name: event_type + in: query + schema: + $ref: './components.yaml/#/components/schemas/ActivityEventType' + - name: last_event_date_time + in: query + schema: + type: string + format: date-time + - $ref: './components.yaml/#/components/parameters/SizeParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: './components.yaml/#/components/schemas/ActivityList' + tags: + - activity + + /api/activity/event_types: + get: + summary: Get activity event types + description: Returns list of activity event types + operationId: getActivityEventTypes + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: './components.yaml/#/components/schemas/ActivityEventTypeList' + tags: + - activity \ No newline at end of file From cf7d4d6b66522bef0b16e8f287120f2cc8c88b2e Mon Sep 17 00:00:00 2001 From: dabdullin Date: Wed, 15 Jun 2022 17:08:31 +0300 Subject: [PATCH 02/57] update activity event types --- odd-platform-specification/components.yaml | 24 ++++++++-------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index d98c020cc..65c288942 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -1827,36 +1827,28 @@ components: ActivityEventType: type: string enum: - - OWNER_CREATED - - OWNER_UPDATED - - OWNER_DELETED - - TAG_CREATED - - TAG_UPDATED - - TAG_DELETED + - OWNERSHIP_CREATED + - OWNERSHIP_UPDATED + - OWNERSHIP_DELETED + - TAGS_ASSOCIATION_UPDATED - DATA_ENTITY_CREATED - DATA_ENTITY_INFO_UPDATED - METADATA_UPDATED - - METADATA_DELETED - SCHEMA_UPDATED - RELATION_UPDATED - - TERM_CREATED - - TERM_UPDATED - - TERM_DELETED + - TERM_ASSOCIATION_CREATED + - TERM_ASSOCIATION_DELETED - DESCRIPTION_CREATED - DESCRIPTION_UPDATED - DESCRIPTION_DELETED - CUSTOM_METADATA_CREATED - CUSTOM_METADATA_UPDATED - CUSTOM_METADATA_DELETED - - ENUM_ASSOCIATION_CREATED - - ENUM_ASSOCIATION_UPDATED - - ENUM_ASSOCIATION_DELETED + - ENUMS_ASSOCIATION_UPDATED - DATASET_FIELD_DESCRIPTION_CREATED - DATASET_FIELD_DESCRIPTION_UPDATED - DATASET_FIELD_DESCRIPTION_DELETED - - DATASET_FIELD_LABEL_CREATED - - DATASET_FIELD_LABEL_UPDATED - - DATASET_FIELD_LABEL_DELETED + - DATASET_FIELD_LABEL_ASSOCIATION_UPDATED - CUSTOM_GROUP_CREATED - CUSTOM_GROUP_UPDATED - CUSTOM_GROUP_DELETED From 20e9c30f20ef60e68deccd87dfd7a1ebd9b9a2a4 Mon Sep 17 00:00:00 2001 From: alexeykozyurov Date: Wed, 22 Jun 2022 17:38:35 +0300 Subject: [PATCH 03/57] Rollback to old filters. --- README.md | 27 +- images/apache-spark-logo.jpg | Bin 26346 -> 0 bytes images/apache-spark-logo.png | Bin 0 -> 64792 bytes .../oddplatform/dto/alert/AlertTypeEnum.java | 3 +- .../mapper/DataEntityMapperImpl.java | 1 + .../util/JooqReactiveOperations.java | 37 +-- .../oddplatform/service/AlertLocator.java | 2 +- .../oddplatform/service/AlertLocatorImpl.java | 64 +++-- .../service/IngestionServiceImpl.java | 2 +- odd-platform-specification/components.yaml | 27 +- .../src/components/Activity/Activity.tsx | 29 ++ odd-platform-ui/src/components/App.tsx | 2 + .../DataEntityDetails/DataEntityDetails.tsx | 16 +- .../DataEntityDetailsContainer.tsx | 8 +- .../DatasetFieldInfoEditForm.tsx | 8 +- .../LabelsAutocomplete/LabelsAutocomplete.tsx | 25 +- .../LabelsAutocompleteContainer.tsx | 14 - .../DataEntityDetails/Overview/Overview.tsx | 7 +- .../Overview/OverviewContainer.tsx | 5 +- .../OverviewDataQualityReport.tsx | 259 ++++++++---------- .../OverviewDataQualityReportContainer.tsx | 5 +- .../OverviewGroups/GroupItem/GroupItem.tsx | 32 ++- .../OverviewEntityGroupStats.tsx | 61 +++-- .../OverviewEntityGroupStatsStyles.ts | 10 + .../OverviewTransformerStats.tsx | 4 +- .../TagsEditForm/TagsEditForm.tsx | 13 +- .../TagsEditFormAutocomplete.tsx | 27 +- .../TagsEditForm/TagsEditFormContainer.tsx | 5 +- .../EditableLabelItem/EditableLabelItem.tsx | 14 +- .../LabelCreateForm/LabelCreateForm.tsx | 21 +- .../LabelCreateFormContainer.tsx | 18 -- .../LabelEditForm/LabelEditForm.tsx | 47 ++-- .../LabelEditForm/LabelEditFormContainer.tsx | 18 -- .../Management/LabelsList/LabelsList.tsx | 86 +++--- .../LabelsList/LabelsListContainer.tsx | 29 -- .../src/components/Management/Management.tsx | 18 +- .../EditableTagItem/EditableTagItem.tsx | 20 +- .../TagsList/TagCreateForm/TagCreateForm.tsx | 25 +- .../TagCreateForm/TagCreateFormContainer.tsx | 15 - .../TagsList/TagEditForm/TagEditForm.tsx | 41 +-- .../TagEditForm/TagEditFormContainer.tsx | 18 -- .../Management/TagsList/TagsList.tsx | 86 +++--- .../Management/TagsList/TagsListContainer.tsx | 26 -- .../src/components/Search/Search.tsx | 14 +- .../TagsEditForm/TagsEditForm.tsx | 17 +- .../Terms/TermSearch/TermSearch.tsx | 33 ++- .../Terms/TermSearch/TermSearchStyles.ts | 32 --- .../AppGraphCrossLinkStyles.ts | 4 +- .../AppGraphLink/AppGraphLinkStyles.ts | 2 +- .../shared/AppToolbar/AppToolbar.tsx | 3 +- .../StyledComponents/PageWithLeftSidebar.ts} | 8 +- .../src/redux/actions/activity.actions.ts | 13 + odd-platform-ui/src/redux/actions/index.ts | 1 + .../src/redux/actions/labels.actions.ts | 42 ++- .../src/redux/actions/tags.actions.ts | 42 ++- .../src/redux/interfaces/activities.ts | 3 + .../src/redux/interfaces/common.ts | 4 + odd-platform-ui/src/redux/interfaces/state.ts | 20 +- .../src/redux/reducers/activity.slice.ts | 46 ++++ odd-platform-ui/src/redux/reducers/index.ts | 6 +- .../src/redux/reducers/labels.reducer.ts | 72 ----- .../src/redux/reducers/labels.slice.ts | 45 +++ .../src/redux/reducers/tags.reducer.ts | 70 ----- .../src/redux/reducers/tags.slice.ts | 44 +++ .../redux/selectors/activities.selectors.ts | 31 +++ .../selectors/dataQualityTest.selectors.ts | 4 +- .../redux/selectors/dataentity.selectors.ts | 4 +- odd-platform-ui/src/redux/selectors/index.ts | 1 + .../src/redux/selectors/labels.selectors.ts | 38 +-- .../src/redux/selectors/tags.selectors.ts | 38 +-- .../src/redux/thunks/activity.thunks.ts | 58 ++++ odd-platform-ui/src/redux/thunks/index.ts | 1 + .../src/redux/thunks/labels.thunks.ts | 84 +++--- .../src/redux/thunks/tags.thunks.ts | 66 ++--- 74 files changed, 996 insertions(+), 1025 deletions(-) delete mode 100644 images/apache-spark-logo.jpg create mode 100644 images/apache-spark-logo.png create mode 100644 odd-platform-ui/src/components/Activity/Activity.tsx delete mode 100644 odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureTable/DatasetStructureList/DatasetStructureItem/DatasetFieldInfoEditForm/LabelsAutocomplete/LabelsAutocompleteContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/LabelsList/LabelCreateForm/LabelCreateFormContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/LabelsList/LabelEditForm/LabelEditFormContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/LabelsList/LabelsListContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/TagsList/TagCreateForm/TagCreateFormContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/TagsList/TagEditForm/TagEditFormContainer.tsx delete mode 100644 odd-platform-ui/src/components/Management/TagsList/TagsListContainer.tsx delete mode 100644 odd-platform-ui/src/components/Terms/TermSearch/TermSearchStyles.ts rename odd-platform-ui/src/components/{Search/SearchStyles.ts => shared/StyledComponents/PageWithLeftSidebar.ts} (72%) create mode 100644 odd-platform-ui/src/redux/actions/activity.actions.ts create mode 100644 odd-platform-ui/src/redux/interfaces/activities.ts create mode 100644 odd-platform-ui/src/redux/reducers/activity.slice.ts delete mode 100644 odd-platform-ui/src/redux/reducers/labels.reducer.ts create mode 100644 odd-platform-ui/src/redux/reducers/labels.slice.ts delete mode 100644 odd-platform-ui/src/redux/reducers/tags.reducer.ts create mode 100644 odd-platform-ui/src/redux/reducers/tags.slice.ts create mode 100644 odd-platform-ui/src/redux/selectors/activities.selectors.ts create mode 100644 odd-platform-ui/src/redux/thunks/activity.thunks.ts diff --git a/README.md b/README.md index a115448d9..51eb430ab 100644 --- a/README.md +++ b/README.md @@ -119,19 +119,20 @@ ODD Platform works with many of the tools you're already using: Microsoft ODBC MongoDB MSSQL - MySQL - Neo4j - PostgreSQL - Quicksight - Redshift - S3 - SageMaker - SageMaker Featurestore - Snowflake - SQS - Tableau - Tarantool - + MySQL + Neo4j + PostgreSQL + Quicksight + Redshift + S3 + SageMaker + SageMaker Featurestore + Snowflake + Spark + SQS + Tableau + Tarantool + ## ODD Data Model diff --git a/images/apache-spark-logo.jpg b/images/apache-spark-logo.jpg deleted file mode 100644 index 6e6403b37926cf51f921f51fa70949ed96057071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26346 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 a`h*?#6H)0*Ih(zqE@U2_%6nCYvn+^Dub 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 literal 0 HcmV?d00001 diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/alert/AlertTypeEnum.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/alert/AlertTypeEnum.java index 8c51e0b5b..f2116802f 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/alert/AlertTypeEnum.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/alert/AlertTypeEnum.java @@ -3,5 +3,6 @@ public enum AlertTypeEnum { DISTRIBUTION_ANOMALY, BACKWARDS_INCOMPATIBLE_SCHEMA, - FAILED_DQ_TEST + FAILED_DQ_TEST, + FAILED_JOB } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataEntityMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataEntityMapperImpl.java index 74c2a396a..b5abe5e5c 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataEntityMapperImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataEntityMapperImpl.java @@ -375,6 +375,7 @@ private DataEntityRef mapReference(final DataEntityPojo pojo) { .externalName(pojo.getExternalName()) .internalName(pojo.getInternalName()) .entityClasses(entityClasses) + .manuallyCreated(pojo.getManuallyCreated()) .url(""); } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/JooqReactiveOperations.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/JooqReactiveOperations.java index 5d00b4344..3b39c302b 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/JooqReactiveOperations.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/JooqReactiveOperations.java @@ -1,8 +1,5 @@ package org.opendatadiscovery.oddplatform.repository.util; -import io.r2dbc.spi.Connection; -import io.r2dbc.spi.ConnectionFactory; -import java.util.function.Function; import lombok.RequiredArgsConstructor; import org.jooq.DSLContext; import org.jooq.Record; @@ -11,10 +8,8 @@ import org.jooq.SQLDialect; import org.jooq.Table; import org.jooq.impl.DSL; -import org.springframework.r2dbc.connection.ConnectionFactoryUtils; +import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Component; -import org.springframework.transaction.NoTransactionException; -import org.springframework.transaction.reactive.TransactionContextManager; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -23,47 +18,31 @@ public class JooqReactiveOperations { private final DSLContext mappingDSLContext = DSL.using(SQLDialect.POSTGRES); - private final ConnectionFactory connectionFactory; + private final DatabaseClient databaseClient; public Mono mono(final RowCountQuery query) { - return wrapMono(c -> { + return databaseClient.inConnection(c -> { DSL.using(c).attach(query); return Mono.from(query); }); } public Mono mono(final ResultQuery query) { - return wrapMono(c -> { + return databaseClient.inConnection(c -> { DSL.using(c).attach(query); return Mono.from(query); }); } public Flux flux(final ResultQuery query) { - return Flux.usingWhen( - ConnectionFactoryUtils.getConnection(connectionFactory), - c -> { - DSL.using(c).attach(query); - return Flux.from(query); - }, - c -> TransactionContextManager - .currentContext() - .onErrorResume(NoTransactionException.class, e -> Mono.from(c.close()).then(Mono.empty())) - ); + return databaseClient.inConnectionMany(c -> { + DSL.using(c).attach(query); + return Flux.from(query); + }); } public R newRecord(final Table table, final Object source) { return mappingDSLContext.newRecord(table, source); } - - private Mono wrapMono(final Function> function) { - return Mono.usingWhen( - ConnectionFactoryUtils.getConnection(connectionFactory), - function, - c -> TransactionContextManager - .currentContext() - .onErrorResume(NoTransactionException.class, e -> Mono.from(c.close()).then(Mono.empty())) - ); - } } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocator.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocator.java index 5738ec986..0f3f3ed69 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocator.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocator.java @@ -10,7 +10,7 @@ public interface AlertLocator { List locateDatasetBackIncSchema(final Map structureDeltas); - List locateDataQualityTestRunFailed(final List taskRuns); + List locateDataEntityRunFailed(final List taskRuns); List locateEarlyBackIncSchema(final List deltas); } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocatorImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocatorImpl.java index c96bdd7da..c88845eb2 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocatorImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertLocatorImpl.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.SetUtils; import org.opendatadiscovery.oddplatform.dto.DataEntityClassDto; import org.opendatadiscovery.oddplatform.dto.DataEntitySpecificAttributesDelta; @@ -46,29 +47,18 @@ public List locateDatasetBackIncSchema(final Map locateDataQualityTestRunFailed(final List taskRuns) { - final List failedTaskRuns = taskRuns.stream() - .filter(tr -> tr.getType().equals(IngestionTaskRun.IngestionTaskRunType.DATA_QUALITY_TEST_RUN)) + public List locateDataEntityRunFailed(final List taskRuns) { + final Map> failedTaskRunsMap = taskRuns.stream() .filter(tr -> TASK_RUN_BAD_STATUSES.contains(tr.getStatus())) - .toList(); - if (failedTaskRuns.isEmpty()) { + .collect(Collectors.groupingBy(IngestionTaskRun::getType)); + if (failedTaskRunsMap.isEmpty()) { return List.of(); } - final Map> relationsMap = dataQualityTestRelationRepository - .getRelations(failedTaskRuns.stream().map(IngestionTaskRun::getDataEntityOddrn).toList()) - .stream() - .collect(Collectors.groupingBy(DataQualityTestRelationsPojo::getDataQualityTestOddrn)); - return taskRuns.stream() - .flatMap(tr -> { - final List relatedPojos = - relationsMap.getOrDefault(tr.getDataEntityOddrn(), List.of()); - return relatedPojos.stream().map(p -> buildAlert( - p.getDatasetOddrn(), - AlertTypeEnum.FAILED_DQ_TEST, - tr.getOddrn(), - String.format("Test %s failed with status %s", tr.getTaskName(), tr.getStatus()) - )); - }).toList(); + final List dqAlerts = locateDataQualityTestAlerts( + failedTaskRunsMap.get(IngestionTaskRun.IngestionTaskRunType.DATA_QUALITY_TEST_RUN)); + final List jobAlerts = locateDataTransformerAlerts( + failedTaskRunsMap.get(IngestionTaskRun.IngestionTaskRunType.DATA_TRANSFORMER_RUN)); + return Stream.concat(dqAlerts.stream(), jobAlerts.stream()).toList(); } @Override @@ -84,6 +74,40 @@ public List locateEarlyBackIncSchema(final List locateDataTransformerAlerts(final List failedDataTransformerRuns) { + if (CollectionUtils.isEmpty(failedDataTransformerRuns)) { + return List.of(); + } + return failedDataTransformerRuns.stream() + .map(tr -> buildAlert( + tr.getDataEntityOddrn(), + AlertTypeEnum.FAILED_JOB, + tr.getOddrn(), + String.format("Job %s failed with status %s", tr.getTaskName(), tr.getStatus()) + )).toList(); + } + + private List locateDataQualityTestAlerts(final List failedDQTestRuns) { + if (CollectionUtils.isEmpty(failedDQTestRuns)) { + return List.of(); + } + final Map> relationsMap = dataQualityTestRelationRepository + .getRelations(failedDQTestRuns.stream().map(IngestionTaskRun::getDataEntityOddrn).toList()) + .stream() + .collect(Collectors.groupingBy(DataQualityTestRelationsPojo::getDataQualityTestOddrn)); + return failedDQTestRuns.stream() + .flatMap(tr -> { + final List relatedPojos = + relationsMap.getOrDefault(tr.getDataEntityOddrn(), List.of()); + return relatedPojos.stream().map(p -> buildAlert( + p.getDatasetOddrn(), + AlertTypeEnum.FAILED_DQ_TEST, + tr.getOddrn(), + String.format("Test %s failed with status %s", tr.getTaskName(), tr.getStatus()) + )); + }).toList(); + } + private Stream locateAlertsInDSDelta(final Map.Entry e) { final Map latestVersionFields = e.getValue().getLatest() .stream() diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/IngestionServiceImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/IngestionServiceImpl.java index 7b7b22d45..b956a7955 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/IngestionServiceImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/IngestionServiceImpl.java @@ -108,7 +108,7 @@ public Mono ingest(final DataEntityList dataEntityList) { final List alerts = Stream.of( alertLocator.locateDatasetBackIncSchema(datasetStructureDelta), - alertLocator.locateDataQualityTestRunFailed(dataStructure.getTaskRuns()), + alertLocator.locateDataEntityRunFailed(dataStructure.getTaskRuns()), dataStructure.getEarlyAlerts() ).flatMap(List::stream).collect(Collectors.toList()); diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index bb0967849..43aebf71f 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -469,6 +469,8 @@ components: type: string has_alerts: type: boolean + manually_created: + type: boolean required: - id @@ -1585,6 +1587,7 @@ components: - DISTRIBUTION_ANOMALY - BACKWARDS_INCOMPATIBLE_SCHEMA - FAILED_DQ_TEST + - FAILED_JOB AlertStatus: type: string @@ -1835,36 +1838,28 @@ components: ActivityEventType: type: string enum: - - OWNER_CREATED - - OWNER_UPDATED - - OWNER_DELETED - - TAG_CREATED - - TAG_UPDATED - - TAG_DELETED + - OWNERSHIP_CREATED + - OWNERSHIP_UPDATED + - OWNERSHIP_DELETED + - TAGS_ASSOCIATION_UPDATED - DATA_ENTITY_CREATED - DATA_ENTITY_INFO_UPDATED - METADATA_UPDATED - - METADATA_DELETED - SCHEMA_UPDATED - RELATION_UPDATED - - TERM_CREATED - - TERM_UPDATED - - TERM_DELETED + - TERM_ASSOCIATION_CREATED + - TERM_ASSOCIATION_DELETED - DESCRIPTION_CREATED - DESCRIPTION_UPDATED - DESCRIPTION_DELETED - CUSTOM_METADATA_CREATED - CUSTOM_METADATA_UPDATED - CUSTOM_METADATA_DELETED - - ENUM_ASSOCIATION_CREATED - - ENUM_ASSOCIATION_UPDATED - - ENUM_ASSOCIATION_DELETED + - ENUMS_ASSOCIATION_UPDATED - DATASET_FIELD_DESCRIPTION_CREATED - DATASET_FIELD_DESCRIPTION_UPDATED - DATASET_FIELD_DESCRIPTION_DELETED - - DATASET_FIELD_LABEL_CREATED - - DATASET_FIELD_LABEL_UPDATED - - DATASET_FIELD_LABEL_DELETED + - DATASET_FIELD_LABEL_ASSOCIATION_UPDATED - CUSTOM_GROUP_CREATED - CUSTOM_GROUP_UPDATED - CUSTOM_GROUP_DELETED diff --git a/odd-platform-ui/src/components/Activity/Activity.tsx b/odd-platform-ui/src/components/Activity/Activity.tsx new file mode 100644 index 000000000..5c85bcba4 --- /dev/null +++ b/odd-platform-ui/src/components/Activity/Activity.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import * as S from 'components/shared/StyledComponents/PageWithLeftSidebar'; + +// import FiltersContainer from './Filters/FiltersContainer'; + +interface ActivityProps { + searchIdParam?: string; +} + +const Activity: React.FC = ({ searchIdParam }) => { + const history = useHistory(); + + return ( + + + + {/* */} + + + lul + {/* */} + + + + ); +}; + +export default Activity; diff --git a/odd-platform-ui/src/components/App.tsx b/odd-platform-ui/src/components/App.tsx index b44bbc416..d9963fee7 100644 --- a/odd-platform-ui/src/components/App.tsx +++ b/odd-platform-ui/src/components/App.tsx @@ -28,6 +28,7 @@ const TermSearchContainer = React.lazy( const AlertsContainer = React.lazy( () => import('./Alerts/AlertsContainer') ); +const Activity = React.lazy(() => import('./Activity/Activity')); const App: React.FC = () => { const dispatch = useAppDispatch(); @@ -66,6 +67,7 @@ const App: React.FC = () => { path="/dataentities/:dataEntityId/:viewType?" component={DataEntityDetailsContainer} /> + diff --git a/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetails.tsx b/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetails.tsx index 6a5107ca2..bc10e31cc 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetails.tsx +++ b/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetails.tsx @@ -16,6 +16,8 @@ import { AlertList, DataEntityApiGetDataEntityAlertsRequest, DataEntityDetails, + DataQualityApiGetDatasetTestReportRequest, + DataSetTestReport, } from 'generated-sources'; import { FetchStatus } from 'redux/interfaces'; import AppTabs, { AppTabItem } from 'components/shared/AppTabs/AppTabs'; @@ -82,6 +84,10 @@ interface DataEntityDetailsProps { fetchDataEntityAlerts: ( params: DataEntityApiGetDataEntityAlertsRequest ) => Promise; + fetchDataSetQualityTestReport: ( + params: DataQualityApiGetDatasetTestReportRequest + ) => Promise; + datasetQualityTestReport?: DataSetTestReport; dataEntityFetchingStatus: FetchStatus; openAlertsCount: number; } @@ -94,6 +100,8 @@ const DataEntityDetailsView: React.FC = ({ isQualityTest, isTransformerJob, fetchDataEntityAlerts, + fetchDataSetQualityTestReport, + datasetQualityTestReport, dataEntityFetchingStatus, openAlertsCount, }) => { @@ -128,6 +136,12 @@ const DataEntityDetailsView: React.FC = ({ fetchDataEntityAlerts({ dataEntityId }); }, []); + React.useEffect(() => { + fetchDataSetQualityTestReport({ + dataEntityId, + }); + }, [dataEntityId, fetchDataSetQualityTestReport]); + const [tabs, setTabs] = React.useState([]); React.useEffect(() => { @@ -152,7 +166,7 @@ const DataEntityDetailsView: React.FC = ({ { name: 'Test reports', link: dataEntityTestReportPath(dataEntityId), - hidden: !isDataset, + hidden: !isDataset || !datasetQualityTestReport?.total, value: 'test-reports', }, { diff --git a/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetailsContainer.tsx b/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetailsContainer.tsx index 8df3c27d0..898d22489 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetailsContainer.tsx +++ b/odd-platform-ui/src/components/DataEntityDetails/DataEntityDetailsContainer.tsx @@ -9,7 +9,11 @@ import { getDataEntityIsTransformerJob, } from 'redux/selectors/dataentity.selectors'; import { getDataEntityOpenAlertListCount } from 'redux/selectors/alert.selectors'; -import { fetchDataEntityAlerts } from 'redux/thunks'; +import { + fetchDataEntityAlerts, + fetchDataSetQualityTestReport, +} from 'redux/thunks'; +import { getDatasetTestReport } from 'redux/selectors'; import DataEntityDetailsView from './DataEntityDetails'; interface RouteProps { @@ -36,10 +40,12 @@ const mapStateToProps = ( isTransformerJob: getDataEntityIsTransformerJob(state, dataEntityId), dataEntityFetchingStatus: getDataEntityDetailsFetchingStatus(state), openAlertsCount: getDataEntityOpenAlertListCount(state, dataEntityId), + datasetQualityTestReport: getDatasetTestReport(state, dataEntityId), }); const mapDispatchToProps = { fetchDataEntityAlerts, + fetchDataSetQualityTestReport, }; export default connect( diff --git a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureTable/DatasetStructureList/DatasetStructureItem/DatasetFieldInfoEditForm/DatasetFieldInfoEditForm.tsx b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureTable/DatasetStructureList/DatasetStructureItem/DatasetFieldInfoEditForm/DatasetFieldInfoEditForm.tsx index 2b9377e0a..2a7377992 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureTable/DatasetStructureList/DatasetStructureItem/DatasetFieldInfoEditForm/DatasetFieldInfoEditForm.tsx +++ b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureTable/DatasetStructureList/DatasetStructureItem/DatasetFieldInfoEditForm/DatasetFieldInfoEditForm.tsx @@ -10,7 +10,7 @@ import LabelItem from 'components/shared/LabelItem/LabelItem'; import AppButton from 'components/shared/AppButton/AppButton'; import AppTextField from 'components/shared/AppTextField/AppTextField'; import ClearIcon from 'components/shared/Icons/ClearIcon'; -import LabelsAutocompleteContainer from './LabelsAutocomplete/LabelsAutocompleteContainer'; +import LabelsAutocomplete from './LabelsAutocomplete/LabelsAutocomplete'; import * as S from './DatasetFieldInfoEditFormStyles'; interface DataSetFieldInfoEditFormProps { @@ -30,7 +30,9 @@ type DatasetFieldInfoFormType = { internalDescription: string; }; -const DatasetFieldInfoEditForm: React.FC = ({ +const DatasetFieldInfoEditForm: React.FC< + DataSetFieldInfoEditFormProps +> = ({ datasetFieldId, datasetFieldFormData, isLoading, @@ -108,7 +110,7 @@ const DatasetFieldInfoEditForm: React.FC = ({ Add or edit labels and description - + {fields.map((label, index) => ( & Partial