From 3769a44ed234223eba1cadddec46fb322f35cd94 Mon Sep 17 00:00:00 2001
From: Kyle Doherty <kdoh@users.noreply.github.com>
Date: Fri, 23 Mar 2018 14:30:16 -0700
Subject: [PATCH] Add segments convenience method to help get at currently
 applied segments (#7149)

* add segments method [ci skip]

* update test + prettier

* add segment and metric metadata methods

* prettier
---
 .../src/metabase-lib/lib/metadata/Metadata.js    |  8 ++++++++
 .../metabase-lib/lib/queries/StructuredQuery.js  | 16 ++++++++++++++++
 .../queries/StructuredQuery.unit.spec.js         | 11 +++++++++++
 3 files changed, 35 insertions(+)

diff --git a/frontend/src/metabase-lib/lib/metadata/Metadata.js b/frontend/src/metabase-lib/lib/metadata/Metadata.js
index 2a2eb8a208a..f268e06cad2 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 0ab5d5a636c..0054527f5a3 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 f44f1434b1e..2364743f8f8 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();
     });
-- 
GitLab