diff --git a/frontend/src/metabase-lib/lib/metadata/Metadata.js b/frontend/src/metabase-lib/lib/metadata/Metadata.js index 2a2eb8a208ac33c6dbae7782678ac4055234cae5..f268e06cad2cf6b5ea4775cde8df0439a30246c0 100644 --- a/frontend/src/metabase-lib/lib/metadata/Metadata.js +++ b/frontend/src/metabase-lib/lib/metadata/Metadata.js @@ -44,6 +44,14 @@ export default class Metadata extends Base { return (Object.values(this.segments): Segment[]); } + segment(segmentId): ?Segment { + return (segmentId != null && this.segments[segmentId]) || null; + } + + metric(metricId): ?Metric { + return (metricId != null && this.metrics[metricId]) || null; + } + database(databaseId): ?Database { return (databaseId != null && this.databases[databaseId]) || null; } diff --git a/frontend/src/metabase-lib/lib/queries/StructuredQuery.js b/frontend/src/metabase-lib/lib/queries/StructuredQuery.js index 0ab5d5a636cdd8c3afdc4180f68b489316f659f3..0054527f5a31a601142a8f9160924b4938e12d29 100644 --- a/frontend/src/metabase-lib/lib/queries/StructuredQuery.js +++ b/frontend/src/metabase-lib/lib/queries/StructuredQuery.js @@ -49,6 +49,8 @@ import AggregationWrapper from "./Aggregation"; import AggregationOption from "metabase-lib/lib/metadata/AggregationOption"; import Utils from "metabase/lib/utils"; +import { isSegmentFilter } from "metabase/lib/query/filter"; + export const STRUCTURED_QUERY_TEMPLATE = { database: null, type: "query", @@ -478,6 +480,20 @@ export default class StructuredQuery extends AtomicQuery { return this.table().segments.filter(sgmt => sgmt.is_active === true); } + /** + * @returns @type {Segment}s that are currently applied to the question + */ + segments() { + return this.filters() + .filter(f => isSegmentFilter(f)) + .map(segmentFilter => { + // segment id is stored as the second part of the filter clause + // e.x. ["SEGMENT", 1] + const segmentId = segmentFilter[1]; + return this.metadata().segment(segmentId); + }); + } + /** * @returns whether a new filter can be added or not */ diff --git a/frontend/test/metabase-lib/queries/StructuredQuery.unit.spec.js b/frontend/test/metabase-lib/queries/StructuredQuery.unit.spec.js index f44f1434b1e19463a35d2f76c88ad9b1eb5483f8..2364743f8f839c5961344f0fb369f9445498791f 100644 --- a/frontend/test/metabase-lib/queries/StructuredQuery.unit.spec.js +++ b/frontend/test/metabase-lib/queries/StructuredQuery.unit.spec.js @@ -14,6 +14,7 @@ import { PRODUCT_TILE_FIELD_ID, } from "__support__/sample_dataset_fixture"; +import Segment from "metabase-lib/lib/metadata/Segment"; import StructuredQuery from "metabase-lib/lib/queries/StructuredQuery"; function makeDatasetQuery(query) { @@ -380,6 +381,16 @@ describe("StructuredQuery unit tests", () => { pending(); }); + describe("segments", () => { + it("should list any applied segments that are currently active filters", () => { + const queryWithSegmentFilter = query.addFilter(["SEGMENT", 1]); + // expect there to be segments + expect(queryWithSegmentFilter.segments().length).toBe(1); + // and they should actually be segments + expect(queryWithSegmentFilter.segments()[0]).toBeInstanceOf(Segment); + }); + }); + describe("canAddFilter", () => { pending(); });