ObjectStackObjectStack

Analytics

Analytics protocol schemas

Analytics/Semantic Layer Protocol

Defines the "Business Logic" for data analysis. Inspired by Cube.dev, LookML, and dbt MetricFlow.

This layer decouples the "Physical Data" (Tables/Columns) from the "Business Data" (Metrics/Dimensions).

Source: packages/spec/src/data/analytics.zod.ts

TypeScript Usage

import { AggregationMetricType, AnalyticsQuerySchema, CubeSchema, CubeJoinSchema, DimensionSchema, DimensionType, MetricSchema, TimeUpdateInterval } from '@objectstack/spec/data';
import type { AggregationMetricType, AnalyticsQuery, Cube, CubeJoin, Dimension, DimensionType, Metric, TimeUpdateInterval } from '@objectstack/spec/data';

// Validate data
const result = AggregationMetricType.parse(data);

AggregationMetricType

Allowed Values

  • count
  • sum
  • avg
  • min
  • max
  • count_distinct
  • number
  • string
  • boolean

AnalyticsQuery

Properties

PropertyTypeRequiredDescription
cubestringoptionalTarget cube name (optional when provided externally, e.g. in API request wrapper)
measuresstring[]List of metrics to calculate
dimensionsstring[]optionalList of dimensions to group by
whereanyoptionalFiltering criteria (canonical Query DSL FilterCondition)
timeDimensions{ dimension: string; granularity?: Enum<'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'>; dateRange?: string | string[] }[]optional
orderRecord<string, Enum<'asc' | 'desc'>>optional
limitnumberoptional
offsetnumberoptional
timezonestringoptional

Cube

Properties

PropertyTypeRequiredDescription
namestringCube name (snake_case)
titlestringoptional
descriptionstringoptional
sqlstringBase SQL statement or Table Name
measuresRecord<string, { name: string; label: string; description?: string; type: Enum<'count' | 'sum' | 'avg' | 'min' | 'max' | 'count_distinct' | 'number' | 'string' | 'boolean'>; … }>Quantitative metrics
dimensionsRecord<string, { name: string; label: string; description?: string; type: Enum<'string' | 'number' | 'boolean' | 'time' | 'geo'>; … }>Qualitative attributes
joinsRecord<string, { name: string; relationship: Enum<'one_to_one' | 'one_to_many' | 'many_to_one'>; sql: string }>optional
refreshKey{ every?: string; sql?: string }optional
publicbooleanoptional (default: false)
_lockEnum<'none' | 'no-overlay' | 'no-delete' | 'full'>optionalItem-level lock — controls overlay & delete (ADR-0010).
_lockReasonstringoptionalHuman-readable reason shown when a write is refused by _lock.
_lockSourceEnum<'artifact' | 'package' | 'env-forced'>optionalLayer that set _lock (artifact | package | env-forced).
_provenanceEnum<'package' | 'org' | 'env-forced'>optionalOrigin of the item (package | org | env-forced).
_packageIdstringoptionalOwning package machine id.
_packageVersionstringoptionalOwning package version.
_lockDocsUrlstringoptionalOptional documentation link surfaced next to _lockReason.

Nested Shape: Cube.measures[string]

PropertyTypeRequiredDescription
namestringUnique metric ID
labelstringHuman readable label
descriptionstringoptional
typeEnum<'count' | 'sum' | 'avg' | 'min' | 'max' | 'count_distinct' | 'number' | 'string' | 'boolean'>
sqlstringSQL expression or field reference
formatstringoptional

Nested Shape: Cube.dimensions[string]

PropertyTypeRequiredDescription
namestringUnique dimension ID
labelstringHuman readable label
descriptionstringoptional
typeEnum<'string' | 'number' | 'boolean' | 'time' | 'geo'>
sqlstringSQL expression or column reference
granularitiesEnum<'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'>[]optional

Nested Shape: Cube.joins[string]

PropertyTypeRequiredDescription
namestringTarget cube name
relationshipEnum<'one_to_one' | 'one_to_many' | 'many_to_one'>optional (default: "many_to_one")
sqlstringJoin condition (ON clause)

Nested Shape: Cube.refreshKey

PropertyTypeRequiredDescription
everystringoptionalRefresh interval (e.g. "1 hour")
sqlstringoptionalSQL to check for data changes

CubeJoin

Properties

PropertyTypeRequiredDescription
namestringTarget cube name
relationshipEnum<'one_to_one' | 'one_to_many' | 'many_to_one'>optional (default: "many_to_one")
sqlstringJoin condition (ON clause)

Dimension

Properties

PropertyTypeRequiredDescription
namestringUnique dimension ID
labelstringHuman readable label
descriptionstringoptional
typeEnum<'string' | 'number' | 'boolean' | 'time' | 'geo'>
sqlstringSQL expression or column reference
granularitiesEnum<'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'>[]optional

DimensionType

Allowed Values

  • string
  • number
  • boolean
  • time
  • geo

Metric

Properties

PropertyTypeRequiredDescription
namestringUnique metric ID
labelstringHuman readable label
descriptionstringoptional
typeEnum<'count' | 'sum' | 'avg' | 'min' | 'max' | 'count_distinct' | 'number' | 'string' | 'boolean'>
sqlstringSQL expression or field reference
formatstringoptional

TimeUpdateInterval

Allowed Values

  • second
  • minute
  • hour
  • day
  • week
  • month
  • quarter
  • year

On this page