{"record":{"id":"1714367e67c83656","repo":"cube-js/cube","slug":"pre-aggregation-preaggregationname-is-already","errorCode":null,"errorMessage":"Pre-aggregation '${preAggregationName}' is already defined","messagePattern":"Pre-aggregation '(.+?)' is already defined","errorType":"exception","errorClass":"UserError","httpStatus":null,"severity":"error","filePath":"packages/cubejs-schema-compiler/src/compiler/converters/CubePreAggregationConverter.ts","lineNumber":59,"sourceCode":"        preAggregationNode = statement.expression;\n      }\n    }\n\n    if (preAggregationNode === null) {\n      throw new Error('Pre-aggregation definition is malformed');\n    }\n\n    let anchor: t.ObjectExpression | null = null;\n\n    cubeDefinition.properties.forEach((prop) => {\n      if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n        if (prop.key.name === 'preAggregations' && t.isObjectExpression(prop.value)) {\n          anchor = prop.value;\n\n          prop.value.properties.forEach((p) => {\n            if (t.isObjectProperty(p) && t.isIdentifier(p.key)) {\n              if (p.key.name === preAggregationName) {\n                throw new UserError(`Pre-aggregation '${preAggregationName}' is already defined`);\n              }\n            }\n          });\n        }\n      }\n    });\n\n    if (anchor === null) {\n      cubeDefinition.properties.push(\n        t.objectProperty(\n          t.identifier('preAggregations'),\n          t.objectExpression([t.objectProperty(t.identifier(preAggregationName), preAggregationNode)])\n        )\n      );\n    } else {\n      (<t.ObjectExpression>anchor).properties.push(\n        t.objectProperty(t.identifier(preAggregationName), <t.ObjectExpression>preAggregationNode)\n      );","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-schema-compiler/src/compiler/converters/CubePreAggregationConverter.ts#L41-L77","documentation":"While inserting a new pre-aggregation into a cube's AST preAggregations object, convertJS checks existing property keys; if a property with the same identifier as preAggregationName already exists, it throws UserError 'Pre-aggregation 'name' is already defined' to prevent silent overwrites and duplicate definitions.","triggerScenarios":"Adding or regenerating a pre-aggregation whose name collides with an existing key in the cube's preAggregations object — e.g. creating a rollup named 'main' when 'main' already exists, or re-running an auto-rollup generator against modified schemas.","commonSituations":"Query-based auto-rollups named after queries colliding with hand-written rollups, duplicated names after copy/pasting definitions between cubes, or re-running schema tooling twice without deduplication.","solutions":["Rename the new pre-aggregation to a unique identifier","Remove or merge the existing pre-aggregation with the same name","Make generation code idempotent (skip names already present)","Check for case differences that still resolve to the same identifier"],"exampleFix":"// before\npreAggregations: {\n  main: { ... },\n  main: { ... } // duplicate\n}\n\n// after\npreAggregations: {\n  main: { ... },\n  mainDaily: { ... }\n}","handlingStrategy":"validation","validationCode":"function assertUniquePreAggName(cubeDefinition, preAggregationName) {\n  const keys = (cubeDefinition.preAggregations && Object.keys(cubeDefinition.preAggregations)) || [];\n  if (keys.includes(preAggregationName)) {\n    throw new Error(`Pre-aggregation '${preAggregationName}' would duplicate an existing definition`);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  converter.convert(astByCubeName);\n} catch (e) {\n  const m = String(e.message).match(/Pre-aggregation '(.+)' is already defined/);\n  if (m) console.error(`Rename or merge duplicate rollup: ${m[1]}`);\n}","preventionTips":["Keep a naming convention for auto-generated rollups (e.g. prefix with 'auto_')","Make schema generators idempotent against existing definitions","Search schemas for duplicate keys before committing"],"tags":["pre-aggregations","duplicate","schema-compiler"],"backgroundTag":"duplicate-definition","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}