AML Partial
Introduction
Partial allows you to extract the shared logic into a new object, making it ready for reuse across multiple objects.
Example: Model partial to reuse timestamp dimensions
// partial_timestamps.aml — Reusable timestamp dimensions
PartialModel partial_timestamps {
dimension created_at {
type: 'datetime'
definition: @sql {{ #SOURCE.created_at }};;
}
dimension updated_at {
type: 'datetime'
definition: @sql {{ #SOURCE.updated_at }};;
}
}
// users_base.model.aml — Base model
Model users_base {
type: 'table'
table_name: 'public.users'
data_source_name: 'demodb'
dimension id { ... }
dimension username { ... }
dimension email { ... }
}
// users.model.aml — Final model composing base + timestamps
Model users = users_base.extend(partial_timestamps)
AML Partial is commonly used in conjunction with AML Extend. See syntax and example usages below for more details.
Many Holistics' built-in types support AML Partial: PartialModel, PartialTableModel, PartialQueryModel, PartialDataset, PartialDashboard, PartialVizBlock, PartialPageTheme and PartialBlockTheme.
Syntax
// Declaring a partial object
// type can be any of supported types: Model, TableModel, QueryModel, Dataset,
// Dashboard, VizBlock, PageTheme, BlockTheme
Partial<type> <partialName> {
// properties
}
// Usage: extend a named object with the partial
<type> <newName> = <existingObject>.extend(<partialName>)
// Chaining multiple partials
<type> <newName> = <existingObject>
.extend(<partial1>)
.extend(<partial2>)
Example usages
Reusing metrics across multiple datasets
Our recommended approach is to split things into separate files for better organization:
revenue_metrics.aml
// File 1: Reusable metrics only
PartialDataset revenue_metrics {
metric gmv { ... }
metric mrr { ... }
metric arr { ... }
}
company_base.dataset.aml
// File 2: Base dataset with models and relationships
Dataset company_base {
label: "Company Base"
models: [...]
relationships: [...]
}
company.dataset.aml
// File 3: Final dataset that composes the base + metrics
Dataset company = company_base
.extend(revenue_metrics)
.extend({
label: "Company"
})
You can reuse the same partial across different datasets:
store.dataset.aml
Dataset store = store_base.extend(revenue_metrics)
Reusing widgets across multiple dashboards
common_widgets.aml
PartialDashboard common_widgets {
block revenue_chart: VizBlock { ... }
block sales_chart: VizBlock { ... }
}
dashboard1.dashboard.aml
Dashboard dashboard1_base {
block new_chart: VizBlock { ... }
}
Dashboard dashboard1 = dashboard1_base.extend(common_widgets)
dashboard2.dashboard.aml
Dashboard dashboard2_base {
block another_chart: VizBlock { ... }
}
Dashboard dashboard2 = dashboard2_base.extend(common_widgets)