cube-js/cube · error · Error

Pre aggregation schema for kSql source with partition granul

Error message

Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter

What it means

A schema-validation guard in KsqlQuery.preAggregationStartEndQueries: a ksql pre-aggregation that declares partitionGranularity must define a refreshRangeStart (buildRangeStart) parameter so the driver can compute the partition window's start boundary for incremental refresh; without it the rollup schedule cannot be built and compilation is aborted. The input at fault is a pre-aggregation object with partitionGranularity but no buildRangeStart/refreshRangeStart.

Source

Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:123

  public groupByClause() {
    if (this.ungrouped) {
      return '';
    }
    const dimensionsForSelect: any[] = this.dimensionsForSelect();
    const dimensionColumns = dimensionsForSelect.map(s => s.selectColumns() && s.dimensionSql())
      .reduce((a, b) => a.concat(b), [])
      .filter((s: any) => !!s);
    return dimensionColumns.length ? ` GROUP BY ${dimensionColumns.join(', ')}` : '';
  }

  public partitionInvalidateKeyQueries(_cube: string, _preAggregation: any) {
    return [];
  }

  public preAggregationStartEndQueries(cube: string, preAggregation: any) {
    if (preAggregation.partitionGranularity) {
      if (!preAggregation.refreshRangeStart) {
        throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeStart parameter');
      }
      if (!preAggregation.refreshRangeEnd) {
        throw new Error('Pre aggregation schema for kSql source with partition granularity must contains buildRangeEnd parameter');
      }
    }
    const res = this.evaluateSymbolSqlWithContext(() => [

      preAggregation.refreshRangeStart && [this.evaluateSql(cube, preAggregation.refreshRangeStart.sql, {}), [], { external: true }],
      preAggregation.refreshRangeEnd && [this.evaluateSql(cube, preAggregation.refreshRangeEnd.sql, {}), [], { external: true }]
    ], { preAggregationQuery: true });
    return res;
  }

  public preAggregationReadOnly(cube: string, preAggregation: any) {
    const [sql] = this.preAggregationSql(cube, preAggregation);
    return preAggregation.type === 'originalSql' && Boolean(KsqlQuery.extractTableFromSimpleSelectAsteriskQuery(sql)) ||
      preAggregation.type === 'rollup' && !!this.dimensionsForSelect().find(d => d.definition().primaryKey);
  }

View on GitHub (pinned to 7d981676b3)

Solutions

  1. Add refreshRangeStart (e.g. refreshRangeStart: { sql: 'SELECT MIN(...)' }) to the pre-aggregation definition in the cube
  2. When partitionGranularity is set, always define both refreshRangeStart and refreshRangeEnd SQL snippets
  3. Validate the schema at compile time so this is caught before query execution
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/cubejs-ksql-driver/src/KsqlQuery.ts:123 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/05a6437754e5f4d8. Report an issue: GitHub.