Segments

Segments are predefined filters. You can use segments to define complex filtering logic in SQL. For example, users for one particular city can be treated as a segment:

cube(`Users`, {
  // ...

  segments: {
    sfUsers: {
      sql: `${CUBE}.location = 'San Francisco'`,
    },
  },
});

Or use segments to implement cross-column OR logic:

cube(`Users`, {
  // ...

  segments: {
    sfUsers: {
      sql: `${CUBE}.location = 'San Francisco' or ${CUBE}.state = 'CA'`,
    },
  },
});

As with other cube member definitions segments can be generated:

const userSegments = {
  sfUsers: ['San Francisco', 'CA'],
  nyUsers: ['New York City', 'NY'],
};

cube(`Users`, {
  // ...

  segments: {
    ...Object.keys(userSegments)
      .map((segment) => ({
        [segment]: {
          sql: `${CUBE}.location = '${userSegments[segment][0]}' or ${CUBE}.state = '${userSegments[segment][1]}'`,
        },
      }))
      .reduce((a, b) => ({ ...a, ...b })),
  },
});

After defining a segment, you can pass it in query object:

{
  "measures": ["Users.count"],
  "segments": ["Users.sfUsers"]
}

As segments are simply predefined filters, it can be difficult to determine when to use segments instead of dimension filters.

Let's consider an example:

cube(`Users`, {
  // ...

  dimensions: {
    location: {
      sql: `location`,
      type: `string`,
    },
  },

  segments: {
    sfUsers: {
      sql: `${CUBE}.location = 'San Francisco'`,
    },
  },
});

In this case following queries are equivalent:

{
  "measures": ["Users.count"],
  "filters": [
    {
      "member": "Users.location",
      "operator": "equals",
      "values": ["San Francisco"]
    }
  ]
}

and

{
  "measures": ["Users.count"],
  "segments": ["Users.sfUsers"]
}

This case is a bad candidate for segment usage and dimension filter works better here. Users.location filter value can change a lot for user queries and Users.sfUsers segment won't be used much in this case.

A good candidate case for a segment is when you have a complex filtering expression which can be reused for a lot of user queries. For example:

cube(`Users`, {
  // ...

  segments: {
    sfNyUsers: {
      sql: `${CUBE}.location = 'San Francisco' OR ${CUBE}.location like '%New York%'`,
    },
  },
});

Did you find this page useful?