or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

api

features

charts

charts.mdconditional-formatting.mdvisualizations.md
authorization.mdchangesets.mdcharts-as-code.mdcompiler.mddashboards.mddbt.mdee-features.mdformatting.mdparameters.mdpivot.mdprojects-spaces.mdsql-runner.mdtemplating.mdwarehouse.md
index.md
tile.json

parameters.mddocs/api/features/

Parameters System

The Parameters System enables dynamic SQL parameterization in explores, metrics, and dimensions. Parameters support project-level and table-level (model-level) scopes, with validation, reference extraction, and format string support for flexible data modeling.

Capabilities

Parameter Types and Values

Core types for parameter definitions and values.

/**
 * Supported parameter value types
 */
type ParameterValue = string | number | string[] | number[];

/**
 * Map of parameter names to values
 */
type ParametersValuesMap = Record<string, ParameterValue>;

/**
 * Map of parameter names to definitions
 */
type ParameterDefinitions = Record<string, LightdashProjectParameter>;

/**
 * Dashboard-specific parameter value with metadata
 */
interface DashboardParameterValue {
  /** Parameter name */
  parameterName: string;
  /** Parameter value */
  value: ParameterValue;
}

/**
 * Dashboard parameters map
 */
type DashboardParameters = Record<string, DashboardParameterValue>;

Parameter Reference Syntax

Parameters are referenced in SQL using the following syntax:

/**
 * Parameter prefixes for reference syntax
 */
enum LightdashParameters {
  /** Full prefix: ${lightdash.parameters.param_name} */
  PREFIX = 'lightdash.parameters',
  /** Short prefix: ${ld.parameters.param_name} */
  PREFIX_SHORT = 'ld.parameters',
}

/**
 * Regex pattern for SQL parameter replacement
 * Requires full ${} syntax: ${lightdash.parameters.param_name}
 */
const parameterRegex: RegExp;

Usage Examples:

-- Full syntax
SELECT * FROM orders WHERE status = '${lightdash.parameters.order_status}'

-- Short syntax
SELECT * FROM orders WHERE created_at >= '${ld.parameters.start_date}'

-- Table-level parameter (scoped to model)
SELECT * FROM orders WHERE region = '${lightdash.parameters.orders.region}'

Parameter Reference Extraction

Extract parameter references from SQL and format strings.

/**
 * Extract parameter references from SQL or format strings
 * @param sql - SQL or format string to analyze
 * @param regex - Optional custom regex pattern
 * @returns Array of unique parameter names
 */
function getParameterReferences(
  sql: string,
  regex?: RegExp
): string[];

/**
 * Extract parameters from both SQL and format strings
 * @param compiledSql - Compiled SQL to extract parameters from
 * @param format - Optional format string
 * @returns Array of unique parameter names from both sources
 */
function getParameterReferencesFromSqlAndFormat(
  compiledSql: string,
  format?: string
): string[];

Usage Example:

import {
  getParameterReferences,
  getParameterReferencesFromSqlAndFormat,
} from '@lightdash/common';

// Extract from SQL
const sql = `
  SELECT * FROM orders
  WHERE status = '\${lightdash.parameters.status}'
    AND region = '\${ld.parameters.region}'
`;

const params = getParameterReferences(sql);
// params = ['status', 'region']

// Extract from SQL and format string
const compiledSql = 'SELECT amount FROM orders';
const format = '\${ld.parameters.currency_symbol}\${value}';

const allParams = getParameterReferencesFromSqlAndFormat(
  compiledSql,
  format
);
// allParams = ['currency_symbol']

Parameter Validation

Validate parameter names and references.

/**
 * Validate parameter references against available parameters
 * @param tableName - Table name for error messages
 * @param parameterReferences - Parameter names being referenced
 * @param availableParameters - Available parameter names
 * @throws CompileError if parameters are missing
 */
function validateParameterReferences(
  tableName: string,
  parameterReferences: string[],
  availableParameters: string[]
): void;

/**
 * Validate parameter names follow naming rules
 * @param parameters - Parameters to validate
 * @returns Validation result with invalid parameter names
 */
function validateParameterNames(
  parameters: Record<string, LightdashProjectParameter> | undefined
): {
  isInvalid: boolean;
  invalidParameters: string[];
};

Usage Example:

import {
  validateParameterReferences,
  validateParameterNames,
} from '@lightdash/common';

// Validate references
const referencedParams = ['order_status', 'region'];
const availableParams = ['order_status', 'region', 'start_date'];

try {
  validateParameterReferences(
    'orders',
    referencedParams,
    availableParams
  );
  // Validation passes
} catch (error) {
  // CompileError thrown if parameters missing
}

// Validate parameter names (alphanumeric, underscore, hyphen only)
const parameters = {
  'order_status': { type: 'string', default: 'pending' },
  'invalid name!': { type: 'string', default: 'test' },
};

const validation = validateParameterNames(parameters);
// validation = {
//   isInvalid: true,
//   invalidParameters: ['invalid name!']
// }

Available Parameters

Get available parameters from project and explore scopes.

/**
 * Get all available parameter names for project and explore
 * @param projectParameters - Project-level parameters
 * @param exploreParameters - Explore-level parameters
 * @returns Array of all available parameter names
 */
function getAvailableParameterNames(
  projectParameters: Record<string, LightdashProjectParameter> | undefined,
  exploreParameters: Record<string, LightdashProjectParameter> | undefined
): string[];

/**
 * Get parameters from included tables (model-level parameters)
 * @param includedTables - Tables with parameter definitions
 * @returns Map of qualified parameter names to definitions
 */
function getAvailableParametersFromTables(
  includedTables: (Table | CompiledTable)[]
): Record<string, LightdashProjectParameter>;

Usage Example:

import {
  getAvailableParameterNames,
  getAvailableParametersFromTables,
} from '@lightdash/common';

// Get all available parameter names
const projectParams = {
  'global_date': { type: 'date', default: '2024-01-01' },
};

const exploreParams = {
  'order_status': { type: 'string', default: 'pending' },
};

const allParams = getAvailableParameterNames(
  projectParams,
  exploreParams
);
// allParams = ['global_date', 'order_status']

// Get table-scoped parameters
const tables = [
  {
    name: 'orders',
    parameters: {
      'region': { type: 'string', default: 'US' },
    },
  },
  {
    name: 'customers',
    parameters: {
      'segment': { type: 'string', default: 'retail' },
    },
  },
];

const tableParams = getAvailableParametersFromTables(tables);
// tableParams = {
//   'orders.region': { type: 'string', default: 'US' },
//   'customers.segment': { type: 'string', default: 'retail' }
// }

Parameter Scopes

Project-Level Parameters

Global parameters available to all explores in a project.

# lightdash.yml or dbt_project.yml
parameters:
  global_start_date:
    type: date
    default: '2024-01-01'
    description: 'Global start date for analysis'

  currency:
    type: string
    default: 'USD'
    description: 'Currency code for reporting'

Reference in SQL:

SELECT * FROM orders
WHERE created_at >= '${lightdash.parameters.global_start_date}'

Table-Level (Model-Level) Parameters

Parameters scoped to specific tables/models.

# models/orders.yml
models:
  - name: orders
    parameters:
      region:
        type: string
        default: 'US'
        description: 'Order region filter'

Reference in SQL (qualified with table name):

SELECT * FROM orders
WHERE region = '${lightdash.parameters.orders.region}'

Explore-Level Parameters

Parameters defined at the explore level.

explores:
  - name: sales_analysis
    parameters:
      sales_threshold:
        type: number
        default: 1000

Reference in SQL:

SELECT * FROM orders
WHERE total_amount > ${lightdash.parameters.sales_threshold}

Common Usage Patterns

Dynamic Date Filtering

parameters:
  report_date:
    type: date
    default: '2024-01-01'

dimensions:
  - name: is_in_reporting_period
    type: boolean
    sql: |
      ${TABLE}.order_date >= '${lightdash.parameters.report_date}'

Conditional Metric Calculation

parameters:
  exchange_rate:
    type: number
    default: 1.0

metrics:
  - name: revenue_usd
    type: number
    sql: ${TABLE}.revenue * ${lightdash.parameters.exchange_rate}

Custom Format Strings

parameters:
  currency_symbol:
    type: string
    default: '$'

dimensions:
  - name: amount
    type: number
    format: '${ld.parameters.currency_symbol}${value}'

Multi-Value Parameters

parameters:
  selected_regions:
    type: string[]
    default: ['US', 'UK', 'CA']

dimensions:
  - name: is_selected_region
    type: boolean
    sql: |
      ${TABLE}.region IN (${lightdash.parameters.selected_regions})

Parameter Validation Example

import {
  getParameterReferences,
  validateParameterReferences,
  getAvailableParameterNames,
} from '@lightdash/common';

function validateExploreParameters(
  compiledSql: string,
  projectParameters: Record<string, LightdashProjectParameter>,
  exploreParameters: Record<string, LightdashProjectParameter>,
  tableName: string
) {
  // Extract parameter references from SQL
  const references = getParameterReferences(compiledSql);

  // Get all available parameters
  const available = getAvailableParameterNames(
    projectParameters,
    exploreParameters
  );

  // Validate all references exist
  validateParameterReferences(tableName, references, available);
}

Parameter Naming Rules

Valid parameter names must match the pattern: ^[a-zA-Z0-9_-]+$

Valid names:

  • order_status
  • start-date
  • region123
  • GLOBAL_VAR

Invalid names:

  • order status (contains space)
  • status@region (contains @)
  • price$usd (contains $)
  • date.value (contains . - reserved for table qualification)