2021-03-23 15:18:32 -07:00
|
|
|
import { EntityType, SearchResult } from '../../types.generated';
|
2021-04-09 11:55:25 -07:00
|
|
|
import { FetchedEntity } from '../lineage/types';
|
2021-02-23 12:45:42 -08:00
|
|
|
import { Entity, IconStyleType, PreviewType } from './Entity';
|
2021-10-26 21:23:08 -07:00
|
|
|
import { GenericEntityProperties } from './shared/types';
|
2021-06-03 11:08:43 -07:00
|
|
|
import { urlEncodeUrn } from './shared/utils';
|
2021-02-03 11:49:51 -08:00
|
|
|
|
|
|
|
function validatedGet<K, V>(key: K, map: Map<K, V>): V {
|
|
|
|
if (map.has(key)) {
|
|
|
|
return map.get(key) as V;
|
|
|
|
}
|
|
|
|
throw new Error(`Unrecognized key ${key} provided in map ${JSON.stringify(map)}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Serves as a singleton registry for all DataHub entities to appear on the frontend.
|
|
|
|
*/
|
|
|
|
export default class EntityRegistry {
|
|
|
|
entities: Array<Entity<any>> = new Array<Entity<any>>();
|
|
|
|
|
|
|
|
entityTypeToEntity: Map<EntityType, Entity<any>> = new Map<EntityType, Entity<any>>();
|
|
|
|
|
|
|
|
collectionNameToEntityType: Map<string, EntityType> = new Map<string, EntityType>();
|
|
|
|
|
|
|
|
pathNameToEntityType: Map<string, EntityType> = new Map<string, EntityType>();
|
|
|
|
|
|
|
|
register(entity: Entity<any>) {
|
|
|
|
this.entities.push(entity);
|
|
|
|
this.entityTypeToEntity.set(entity.type, entity);
|
|
|
|
this.collectionNameToEntityType.set(entity.getCollectionName(), entity.type);
|
|
|
|
this.pathNameToEntityType.set(entity.getPathName(), entity.type);
|
|
|
|
}
|
|
|
|
|
2021-03-13 07:55:29 -08:00
|
|
|
getEntity(type: EntityType): Entity<any> {
|
|
|
|
return validatedGet(type, this.entityTypeToEntity);
|
|
|
|
}
|
|
|
|
|
2021-02-03 11:49:51 -08:00
|
|
|
getEntities(): Array<Entity<any>> {
|
|
|
|
return this.entities;
|
|
|
|
}
|
|
|
|
|
|
|
|
getSearchEntityTypes(): Array<EntityType> {
|
|
|
|
return this.entities.filter((entity) => entity.isSearchEnabled()).map((entity) => entity.type);
|
|
|
|
}
|
|
|
|
|
|
|
|
getDefaultSearchEntityType(): EntityType {
|
|
|
|
return this.entities[0].type;
|
|
|
|
}
|
|
|
|
|
|
|
|
getBrowseEntityTypes(): Array<EntityType> {
|
|
|
|
return this.entities.filter((entity) => entity.isBrowseEnabled()).map((entity) => entity.type);
|
|
|
|
}
|
|
|
|
|
2021-04-09 11:55:25 -07:00
|
|
|
getLineageEntityTypes(): Array<EntityType> {
|
2021-04-23 00:18:39 -07:00
|
|
|
return this.entities.filter((entity) => entity.isLineageEnabled()).map((entity) => entity.type);
|
2021-04-09 11:55:25 -07:00
|
|
|
}
|
|
|
|
|
2021-02-23 12:45:42 -08:00
|
|
|
getIcon(type: EntityType, fontSize: number, styleType: IconStyleType): JSX.Element {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.icon(fontSize, styleType);
|
|
|
|
}
|
|
|
|
|
2021-02-03 11:49:51 -08:00
|
|
|
getCollectionName(type: EntityType): string {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.getCollectionName();
|
|
|
|
}
|
|
|
|
|
2021-09-13 09:16:37 -07:00
|
|
|
getEntityName(type: EntityType): string | undefined {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.getEntityName?.();
|
|
|
|
}
|
|
|
|
|
2021-02-03 11:49:51 -08:00
|
|
|
getTypeFromCollectionName(name: string): EntityType {
|
|
|
|
return validatedGet(name, this.collectionNameToEntityType);
|
|
|
|
}
|
|
|
|
|
|
|
|
getPathName(type: EntityType): string {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.getPathName();
|
|
|
|
}
|
|
|
|
|
2021-06-03 11:08:43 -07:00
|
|
|
getEntityUrl(type: EntityType, urn: string): string {
|
|
|
|
return `/${this.getPathName(type)}/${urlEncodeUrn(urn)}`;
|
|
|
|
}
|
|
|
|
|
2021-02-03 11:49:51 -08:00
|
|
|
getTypeFromPathName(pathName: string): EntityType {
|
|
|
|
return validatedGet(pathName, this.pathNameToEntityType);
|
|
|
|
}
|
|
|
|
|
2021-02-09 14:30:23 -08:00
|
|
|
getTypeOrDefaultFromPathName(pathName: string, def?: EntityType): EntityType | undefined {
|
2021-02-03 11:49:51 -08:00
|
|
|
try {
|
|
|
|
return validatedGet(pathName, this.pathNameToEntityType);
|
|
|
|
} catch (e) {
|
|
|
|
return def;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
renderProfile(type: EntityType, urn: string): JSX.Element {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.renderProfile(urn);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderPreview<T>(entityType: EntityType, type: PreviewType, data: T): JSX.Element {
|
|
|
|
const entity = validatedGet(entityType, this.entityTypeToEntity);
|
|
|
|
return entity.renderPreview(type, data);
|
|
|
|
}
|
|
|
|
|
2021-03-23 15:18:32 -07:00
|
|
|
renderSearchResult(type: EntityType, searchResult: SearchResult): JSX.Element {
|
2021-02-03 11:49:51 -08:00
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
2021-03-23 15:18:32 -07:00
|
|
|
return entity.renderSearch(searchResult);
|
2021-02-03 11:49:51 -08:00
|
|
|
}
|
|
|
|
|
2021-02-09 14:30:23 -08:00
|
|
|
renderBrowse<T>(type: EntityType, data: T): JSX.Element {
|
2021-02-03 11:49:51 -08:00
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
2021-02-09 14:30:23 -08:00
|
|
|
return entity.renderPreview(PreviewType.BROWSE, data);
|
2021-02-03 11:49:51 -08:00
|
|
|
}
|
2021-04-09 11:55:25 -07:00
|
|
|
|
|
|
|
getLineageVizConfig<T>(type: EntityType, data: T): FetchedEntity | undefined {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
2022-03-15 11:17:13 -07:00
|
|
|
const genericEntityProperties = this.getGenericEntityProperties(type, data);
|
|
|
|
return (
|
|
|
|
({
|
|
|
|
...entity.getLineageVizConfig?.(data),
|
|
|
|
status: genericEntityProperties?.status,
|
|
|
|
} as FetchedEntity) || undefined
|
|
|
|
);
|
2021-04-09 11:55:25 -07:00
|
|
|
}
|
2021-09-02 19:05:13 -07:00
|
|
|
|
|
|
|
getDisplayName<T>(type: EntityType, data: T): string {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.displayName(data);
|
|
|
|
}
|
2021-10-26 21:23:08 -07:00
|
|
|
|
|
|
|
getGenericEntityProperties<T>(type: EntityType, data: T): GenericEntityProperties | null {
|
|
|
|
const entity = validatedGet(type, this.entityTypeToEntity);
|
|
|
|
return entity.getGenericEntityProperties(data);
|
|
|
|
}
|
2021-02-03 11:49:51 -08:00
|
|
|
}
|