import * as React from 'react'; import { DatabaseFilled, DatabaseOutlined } from '@ant-design/icons'; import { Typography } from 'antd'; import { Dataset, EntityType, OwnershipType, SearchResult } from '../../../types.generated'; import { Entity, IconStyleType, PreviewType } from '../Entity'; import { Preview } from './preview/Preview'; import { FIELDS_TO_HIGHLIGHT } from './search/highlights'; import { EntityProfile } from '../shared/containers/profile/EntityProfile'; import { GetDatasetQuery, useGetDatasetQuery, useUpdateDatasetMutation } from '../../../graphql/dataset.generated'; import { GenericEntityProperties } from '../shared/types'; import { PropertiesTab } from '../shared/tabs/Properties/PropertiesTab'; import { DocumentationTab } from '../shared/tabs/Documentation/DocumentationTab'; import { SchemaTab } from '../shared/tabs/Dataset/Schema/SchemaTab'; import QueriesTab from '../shared/tabs/Dataset/Queries/QueriesTab'; import { SidebarAboutSection } from '../shared/containers/profile/sidebar/SidebarAboutSection'; import { SidebarOwnerSection } from '../shared/containers/profile/sidebar/Ownership/SidebarOwnerSection'; import { SidebarTagsSection } from '../shared/containers/profile/sidebar/SidebarTagsSection'; import { SidebarStatsSection } from '../shared/containers/profile/sidebar/Dataset/StatsSidebarSection'; import StatsTab from '../shared/tabs/Dataset/Stats/StatsTab'; import { LineageTab } from '../shared/tabs/Lineage/LineageTab'; import { capitalizeFirstLetter } from '../../shared/textUtil'; import ViewDefinitionTab from '../shared/tabs/Dataset/View/ViewDefinitionTab'; import { SidebarViewDefinitionSection } from '../shared/containers/profile/sidebar/Dataset/View/SidebarViewDefinitionSection'; import { SidebarRecommendationsSection } from '../shared/containers/profile/sidebar/Recommendations/SidebarRecommendationsSection'; import { getDataForEntityType } from '../shared/containers/profile/utils'; import { SidebarDomainSection } from '../shared/containers/profile/sidebar/Domain/SidebarDomainSection'; import { ValidationsTab } from '../shared/tabs/Dataset/Validations/ValidationsTab'; const SUBTYPES = { VIEW: 'view', }; /** * Definition of the DataHub Dataset entity. */ export class DatasetEntity implements Entity { type: EntityType = EntityType.Dataset; icon = (fontSize: number, styleType: IconStyleType) => { if (styleType === IconStyleType.TAB_VIEW) { return ; } if (styleType === IconStyleType.HIGHLIGHT) { return ; } if (styleType === IconStyleType.SVG) { return ( ); } return ( ); }; isSearchEnabled = () => true; isBrowseEnabled = () => true; isLineageEnabled = () => true; getAutoCompleteFieldName = () => 'name'; getPathName = () => 'dataset'; getEntityName = () => 'Dataset'; getCollectionName = () => 'Datasets'; renderProfile = (urn: string) => ( (dataset?.dataset?.subTypes?.typeNames?.includes(SUBTYPES.VIEW) && true) || false, enabled: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.viewProperties?.logic && true) || false, }, }, { name: 'Documentation', component: DocumentationTab, }, { name: 'Properties', component: PropertiesTab, }, { name: 'Lineage', component: LineageTab, display: { visible: (_, _1) => true, enabled: (_, dataset: GetDatasetQuery) => { console.log(dataset?.dataset?.upstream, dataset?.dataset?.downstream); return ( (dataset?.dataset?.upstream?.total || 0) > 0 || (dataset?.dataset?.downstream?.total || 0) > 0 ); }, }, }, { name: 'Queries', component: QueriesTab, display: { visible: (_, _1) => true, enabled: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.usageStats?.buckets?.length || 0) > 0, }, }, { name: 'Stats', component: StatsTab, display: { visible: (_, _1) => true, enabled: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.datasetProfiles?.length || 0) > 0 || (dataset?.dataset?.usageStats?.buckets?.length || 0) > 0 || (dataset?.dataset?.operations?.length || 0) > 0, }, }, { name: 'Validation', component: ValidationsTab, display: { visible: (_, _1) => true, enabled: (_, dataset: GetDatasetQuery) => { return (dataset?.dataset?.assertions?.total || 0) > 0; }, }, }, ]} sidebarSections={[ { component: SidebarAboutSection, }, { component: SidebarViewDefinitionSection, display: { visible: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.viewProperties?.logic && true) || false, }, }, { component: SidebarStatsSection, display: { visible: (_, dataset: GetDatasetQuery) => (dataset?.dataset?.datasetProfiles?.length || 0) > 0 || (dataset?.dataset?.usageStats?.buckets?.length || 0) > 0, }, }, { component: SidebarTagsSection, properties: { hasTags: true, hasTerms: true, }, }, { component: SidebarOwnerSection, properties: { defaultOwnerType: OwnershipType.TechnicalOwner, }, }, { component: SidebarDomainSection, }, { component: SidebarRecommendationsSection, }, ]} /> ); getOverridePropertiesFromEntity = (dataset?: Dataset | null): GenericEntityProperties => { // if dataset has subTypes filled out, pick the most specific subtype and return it const subTypes = dataset?.subTypes; return { name: dataset?.properties?.name || dataset?.name, externalUrl: dataset?.properties?.externalUrl, entityTypeOverride: subTypes ? capitalizeFirstLetter(subTypes.typeNames?.[0]) : '', }; }; renderPreview = (_: PreviewType, data: Dataset) => { return ( ); }; renderSearch = (result: SearchResult) => { const data = result.entity as Dataset; return ( 0 && result.matchedFields.every((field) => FIELDS_TO_HIGHLIGHT.has(field.name)) && ( Matches {FIELDS_TO_HIGHLIGHT.get(result.matchedFields[0].name)}{' '} {result.matchedFields[0].value} ) } insights={result.insights} /> ); }; getLineageVizConfig = (entity: Dataset) => { return { urn: entity?.urn, name: entity?.properties?.name || entity.name, expandedName: entity?.properties?.qualifiedName || entity.name, type: EntityType.Dataset, subtype: entity?.subTypes?.typeNames?.[0] || undefined, icon: entity?.platform?.properties?.logoUrl || undefined, platform: entity?.platform?.name, }; }; displayName = (data: Dataset) => { return data?.properties?.name || data.name; }; platformLogoUrl = (data: Dataset) => { return data.platform.properties?.logoUrl || undefined; }; getGenericEntityProperties = (data: Dataset) => { return getDataForEntityType({ data, entityType: this.type, getOverrideProperties: this.getOverridePropertiesFromEntity, }); }; }