Documentation Index
Fetch the complete documentation index at: https://honeydew.ai/docs/llms.txt
Use this file to discover all available pages before exploring further.
Introduction
Honeydew is a standalone semantic layer. It sits between your data warehouse and the tools that consume it: Tableau, Power BI, Excel, SQL clients, AI agents, notebooks. Tableau is one of those tools. The job of the semantic layer is to define the building blocks once and use them everywhere. Semantics include the following concepts:- How business entities (such as “customer”) are mapped to data sources (which tables to read from)
- How data tables are related (which joins to use)
- How metrics are calculated (which aggregations to perform)
- Metadata (such as descriptions, display names, formatting) associated with presenting those objects to business users.
Visual to declarative
In Tableau you think visually: drag a dimension to Rows, drop a measure on Columns, add a filter to the shelf, write an LOD expression to change the grain. In Honeydew you think declaratively: define entities, connect them with relationships, write metrics that describe what to calculate. The how - which joins, whichGROUP BY, which filters - is resolved automatically at
query time.
| Tableau concept | Honeydew equivalent |
|---|---|
| Data Source / Data Model | Workspace + Entities |
| Relationship / Join | Relationship |
| Dimension (green pill) | Attribute |
| Measure (blue pill) | Metric |
| Calculated Field (dimension) | Calculated Attribute |
| Calculated Field (measure) | Metric |
| LOD Expression | Calculated attribute or metric with GROUP BY qualifier |
| Table Calculation | Derived metric or calculated attribute |
| Set / Group | Calculated attribute |
| Parameter | BI Parameter or conditional filtering |
| Context Filter | Semantic filter |
| Data Source Filter | Source filter |
| Published Data Source | Domain |
Data Sources and Entities
A Tableau data source connects to one or more warehouse tables, defines joins between them, and exposes dimensions and measures for worksheets. In Honeydew, each table becomes an Entity. Joins between tables become Relationships defined once and reused across all queries.Custom SQL in data sources
Tableau allows a data source to use Custom SQL. An entity in Honeydew can also be backed by a custom SQL query instead of a single table - see source data.Data blending
In Tableau, data blending links fields across separate physical data sources using a common dimension. Honeydew operates on a single physical source (a cloud data warehouse), so the equivalent depends on what was being blended. When the blended data lives in the same warehouse and just needs to be linked through a common dimension, use a relationship, often backed by a shared dimension. When the data lives in a different warehouse, database, or system, there is no Honeydew equivalent. The cross-source join has to happen either in the warehouse itself (through federation or external tables) or in the dashboard layer.Relationships and Joins
Tableau’s data model supports relationships (logical layer) and joins (physical layer). Honeydew relationships combine both concepts:- Join fields: Honeydew supports composite keys (multiple fields) and calculated attributes as join keys - no need to create concatenated key fields.
-
Join type:
LEFT,INNER,RIGHT, orFULL OUTER. - Cardinality: one-to-many and many-to-one work directly. Many-to-many requires a connecting table.
- Cross-filtering: controls whether filters on one entity affect another. The default is bidirectional, matching how Tableau’s logical layer behaves.
In Tableau’s logical layer, tables are related but not joined until needed.
Honeydew works similarly - joins are defined as relationships and only executed
when a query requires fields from both entities.
Calculated Fields → Attributes
A Tableau calculated field that produces a dimension (string, date, boolean, etc.) maps to a calculated attribute in Honeydew.Basic calculated fields
Tableau:customer entity:
Fields from related tables
In Tableau, a calculated field can reference any field in the data source after a join. In Honeydew, relationships are resolved automatically. Reference any related entity directly:Groups and Sets
Tableau Groups let you manually bucket dimension values. Tableau Sets create binary in/out classifications based on conditions. Both map to calculated attributes in Honeydew: Tableau Group:Calculated Fields → Metrics
A Tableau calculated field that produces a measure (an aggregation) maps to a metric in Honeydew.Basic aggregations
Tableau:Common aggregation mapping
The SQL syntax depends on the connected data warehouse (Snowflake, Databricks,
etc.). The examples below use Snowflake syntax.
| Tableau | SQL |
|---|---|
SUM(expr) | SUM(expr) |
AVG(expr) | AVG(expr) |
COUNT(expr) | COUNT(expr) |
COUNTD(expr) | COUNT(DISTINCT expr) |
MIN(expr) | MIN(expr) |
MAX(expr) | MAX(expr) |
MEDIAN(expr) | MEDIAN(expr) |
PERCENTILE(expr, n) | PERCENTILE_CONT(n) WITHIN GROUP (ORDER BY expr) |
STDEV(expr) | STDDEV_SAMP(expr) |
VAR(expr) | VAR_SAMP(expr) |
ZN(expr) | COALESCE(expr, 0) |
IIF(test, then, else) | CASE WHEN test THEN then_val ELSE else_val END |
IF THEN ELSEIF END | CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END |
Derived metrics
Metrics in Honeydew can reference other metrics:Filters
Tableau has multiple layers of filters that execute in a specific order: extract filters, data source filters, context filters, dimension filters, measure filters. Honeydew domains have two types of filters:- Source filters apply directly on source tables before any calculation or join. Used for performance optimization (e.g., partition pruning) and data deduplication.
- Semantic filters apply to every query in a domain, after joins are resolved. Used for governance and access control (e.g., tenant filtering). A semantic filter may introduce additional joins to enforce its condition.
WHEREfilters on attributes (dimensions)HAVINGfilters on metrics (measures)
| Tableau filter | Honeydew equivalent | When it applies |
|---|---|---|
| Extract filter | Source filter | Before joins and calculations |
| Data Source filter | Source filter | Before joins, on source tables |
| Context filter | Semantic filter | After joins, before user query filters |
| Dimension filter | WHERE in user query | After semantic filters, before metrics |
| Measure filter | HAVING in user query | After metric aggregation |
Semantic filters always apply to every query in a domain - they cannot be toggled
by the user. For filters that should apply by default but can be overridden by
user selections, see
conditional filtering.
Adding filters to a metric
Tableau does not have a first-class “filtered measure” construct. To make a measure that always filters to a subset of rows - regardless of what the user selects in the view - you fold the filter into the aggregate using an IF expression. Non-matching rows return NULL and SUM ignores them. Tableau:FILTER (WHERE ...) qualifier attached to a metric
expression. The filter lives next to the metric, not inside it.
LOD Expressions
LOD (Level of Detail) expressions are one of the most common Tableau constructs that need to be rethought in Honeydew. In Tableau, LODs let you control the granularity of a calculation independently from the level of detail in the view. In Honeydew, there are two ways to control granularity, and the choice depends on how the calculation should interact with user filters:- Calculated attributes are computed before
user query filters. They ignore user
WHEREandHAVINGfilters entirely. - Metrics with a GROUP BY qualifier are computed after user query filters. User filters still affect the result.
FIXED
AFIXED LOD computes an aggregation at a specific grain. In Tableau, FIXED
ignores dimension filters but respects context filters and data source filters.
Tableau:
FIXED behavior of ignoring
dimension filters.
Honeydew - as a metric with fixed grouping (respects user filters):
The calculated attribute and the metric with
GROUP BY both fix the grain to
customer, but they differ in how they handle user filters:customer.lifetime_sales(attribute) always returns the same value regardless of user filters.sales.sales_per_customer(metric) respects userWHEREfilters - if a user filters to 2024 data, the metric returns sales per customer in 2024 only.
FIXED with multiple dimensions
Tableau:INCLUDE
AnINCLUDE LOD adds dimensions to the view’s current grain.
Tableau:
GROUP BY (*, field) means “the user’s current grouping plus this additional
field.” This is the Honeydew equivalent of Tableau’s INCLUDE.
EXCLUDE
AnEXCLUDE LOD removes dimensions from the view’s current grain.
Tableau:
Percent of total
A very common Tableau pattern is percent of total using LODs: Tableau:GROUP BY () removes all grouping, giving the grand total. The numerator uses
the query’s grouping.
Percent of parent (nested LOD pattern)
Tableau:LOD summary
| Tableau LOD | Honeydew qualifier | Effect |
|---|---|---|
{ FIXED [A], [B] : AGG(expr) } | GROUP BY (a, b) | Sets an exact grain |
{ FIXED : AGG(expr) } | GROUP BY () | Grand total - no grouping |
{ INCLUDE [A] : AGG(expr) } | GROUP BY (*, a) | Adds a dimension to the user grain |
{ EXCLUDE [A] : AGG(expr) } | GROUP BY (NOT a) | Removes a dimension from the user grain |
Table Calculations
Tableau table calculations operate on the result set after aggregation - running totals, ranks, moving averages, percent differences. They depend on the sort order and partitioning of the view. Honeydew handles these patterns differently depending on the calculation type.Running total / cumulative sum
Tableau:Window functions in calculated attributes operate at the entity row level, not
at the query result level. For cumulative sums over a query result, use Tableau’s
built-in table calculation on a Honeydew metric.
Rank
Tableau:Percent difference
Tableau:Parameters
Tableau parameters let users select a value at runtime to control filters, reference lines, or calculation logic. Honeydew supports two approaches:BI parameters
Honeydew can pass through Tableau parameter values using BI parameters. This lets you build metrics whose behavior changes based on user selection.Conditional filtering
For parameters that switch between dimensions or control which filter to apply, conditional filtering in Honeydew providesGET_FIELD_SELECTION():
Other Patterns
Threshold filtering
Tableau lets you create filters based on measure values (e.g., only show products with more than $1,000 in sales). In Tableau, the threshold is often controlled by a parameter. In Honeydew, use a metric in a filter with conditional filtering to make the threshold dynamic:dim_threshold.min_sales to a different value - similar to how a Tableau
parameter works.
Top N filtering
Tableau lets you filter a dimension to show only the top N items by a measure (e.g., top 10 products by sales). Top N filtering depends on the query’s grouping and sort order, so it should be applied in Tableau using a Tableau parameter and a Top N filter on a Honeydew metric. Honeydew provides the aggregated metric values; Tableau handles the ranking and filtering.Period-over-period comparison
Tableau:Next Steps
- Metrics reference - full syntax for metrics, qualifiers, and grouping
- Calculated attributes - building reusable dimensions
- Domains - curate subsets of your model for specific Tableau workbooks