Remove an object from a Metric View
This how-to demonstrates how to remove Metric View dimensions from a loaded Metric View. Similar approaches apply to all collections in a Metric View.
Deserialize Metric View for these code samples
This how-to uses a sample e-commerce Metric View representing sales data with three dimension tables (product, customer, date) joined to a fact table (orders). Run the snippet below first, if you'd like to follow along with the code in the rest of this how-to
SemanticBridge.MetricView.Deserialize("""
version: 0.1
source: sales.fact.orders
joins:
- name: product
source: sales.dim.product
on: source.product_id = product.product_id
- name: customer
source: sales.dim.customer
on: source.customer_id = customer.customer_id
- name: date
source: sales.dim.date
on: source.order_date = date.date_key
dimensions:
- name: product_name
expr: product.product_name
- name: product_category
expr: product.category
- name: customer_segment
expr: customer.segment
- name: order_date
expr: date.full_date
- name: order_year
expr: date.year
- name: order_month
expr: date.month_name
measures:
- name: total_revenue
expr: SUM(revenue)
- name: order_count
expr: COUNT(order_id)
- name: avg_order_value
expr: AVG(revenue)
- name: unique_customers
expr: COUNT(DISTINCT customer_id)
""");
Note
Each removal script here affects the currently loaded Metric View.
If you want to run all of these, make sure to run the Deserialize above before each removal.
Remove by name
Find the Metric View dimension and remove it from the collection:
var view = SemanticBridge.MetricView.Model;
var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");
var dimToRemove = view.Dimensions.FirstOrDefault(d => d.Name == "order_month");
if (dimToRemove != null)
{
view.Dimensions.Remove(dimToRemove);
sb.AppendLine($"Removed: {dimToRemove.Name}");
}
sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
Output(sb.ToString());
Output:
Dimensions before: 6
Removed: order_month
Dimensions after: 5
Observe that if you run the script above twice in a row, there is no additional removal; the before and after counts are both 5.
Remove multiple Metric View dimensions
Use LINQ to filter and rebuild the collection:
using MetricView = TabularEditor.SemanticBridge.Platforms.Databricks.MetricView;
var view = SemanticBridge.MetricView.Model;
var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");
// Remove all date-related dimensions
string[] toRemove = ["order_date", "order_year", "order_month"];
var toKeep = view.Dimensions
.Where(d => !toRemove.Contains(d.Name))
.ToList();
// Clear and repopulate
view.Dimensions.Clear();
foreach (var dim in toKeep)
{
view.Dimensions.Add(dim);
}
sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
sb.AppendLine();
sb.AppendLine("Remaining dimensions:");
sb.AppendLine("---------------------");
foreach (var dim in view.Dimensions)
{
sb.AppendLine($" {dim.Name}");
}
Output(sb.ToString());
Output:
Dimensions before: 6
Dimensions after: 3
Remaining dimensions:
---------------------
product_name
product_category
customer_segment
Remove Metric View dimensions from a specific table
Remove all Metric View dimensions that reference the date table.
Warning
This example is not guaranteed to remove all and exclusively Metric View dimensions which reference a given Metric View Join. Metric View Dimensions may include near-arbitrary SQL expressions, and may also reference previously defined Metric View Dimensions. This example is for illustrative purposes only.
var view = SemanticBridge.MetricView.Model;
var sb = new System.Text.StringBuilder();
sb.AppendLine($"Dimensions before: {view.Dimensions.Count}");
var toRemove = view.Dimensions
.Where(d => d.Expr.StartsWith("date."))
.ToList();
foreach (var dim in toRemove)
{
view.Dimensions.Remove(dim);
sb.AppendLine($"Removed: {dim.Name} ({dim.Expr})");
}
sb.AppendLine($"Dimensions after: {view.Dimensions.Count}");
Output(sb.ToString());
Output:
Dimensions before: 6
Removed: order_date (date.full_date)
Removed: order_year (date.year)
Removed: order_month (date.month_name)
Dimensions after: 3