// (C) 2007-2019 GoodData Corporation import { isEqual, partial, flatMap } from "lodash"; import { IMockProject } from "../../model/MockProject"; import { getUri } from "./metadataObjects"; import { reduceMAQLItems } from "./maql"; import { IMetadataObject } from "../../model/MetadataObject"; export function filterByTitle(filter: string = "", getTitle: (item: T) => string, items: T[]): T[] { return filter ? items.filter(item => getTitle(item) .toLowerCase() .includes(filter.toLowerCase()), ) : items; } export function filterByAuthor(author: string = "", getAuthor: (item: T) => string, items: T[]): T[] { return author ? items.filter(item => getAuthor(item) === author) : items; } export function filterByUri(uris: string[], getUri: (item: T) => string, items: T[]): T[] { return uris.length ? items.filter(item => uris.indexOf(getUri(item)) >= 0) : items; } export function filterAvailable( project: IMockProject, bucketItems: string[] = [], items: IMetadataObject[], ): IMetadataObject[] { function getGroup(uri: string) { return project.groups.findIndex(group => { const { attributes, metrics, facts, dateDataSets } = group; const dateAttributes = flatMap(dateDataSets, dateDataSet => dateDataSet.availableDateAttributes); return [...attributes, ...metrics, ...facts, ...dateDataSets, ...dateAttributes] .map(getUri) .some(partial(isEqual, uri)); }); } function isRelated(extendedBucketItems: string[], item: IMetadataObject): boolean { return extendedBucketItems.every(bucketItem => getGroup(bucketItem) === getGroup(getUri(item))); } const isRelatedToBuckets = partial(isRelated, reduceMAQLItems(bucketItems)); return bucketItems.length ? items.filter(isRelatedToBuckets) : items; }