{"record":{"id":"b74c55dbf97c204e","repo":"cube-js/cube","slug":"you-cannot-use-dimension-and-measure-in-same-condi","errorCode":null,"errorMessage":"You cannot use dimension and measure in same condition: ${JSON.stringify(f)}","messagePattern":"You cannot use dimension and measure in same condition: (.+?)","errorType":"exception","errorClass":"UserError","httpStatus":null,"severity":"error","filePath":"packages/cubejs-schema-compiler/src/adapter/BaseQuery.js","lineNumber":228,"sourceCode":"            dimensionGroup: true,\n            measure: null,\n          };\n        }\n        if (!dimension.length && measure.length) {\n          return {\n            values: this.extractFiltersAsTree(f[operator]),\n            operator,\n            dimension: null,\n            measureGroup: true,\n          };\n        }\n        if (!dimension.length && !measure.length) {\n          return {\n            values: [],\n            operator,\n          };\n        }\n        throw new UserError(`You cannot use dimension and measure in same condition: ${JSON.stringify(f)}`);\n      }\n\n      if (!f.member && !f.dimension) {\n        throw new UserError(`member attribute is required for filter ${JSON.stringify(f)}`);\n      }\n\n      if (this.cubeEvaluator.isMeasure(f.member || f.dimension)) {\n        return Object.assign({}, f, {\n          dimension: null,\n          measure: f.member || f.dimension\n        });\n      }\n\n      return Object.assign({}, f, {\n        measure: null,\n        dimension: f.member || f.dimension\n      });\n    });","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js#L210-L246","documentation":"When compiling the filter tree, Cube classifies each leaf as filtering either a dimension or a measure. A single condition referencing both a dimension and a measure is ambiguous for SQL generation (it mixes row-level and aggregate-level predicates), so the library rejects it with this UserError.","triggerScenarios":"A leaf filter whose resolved members include at least one dimension and at least one measure simultaneously (e.g. f.dimension plus a measure member, or an 'or'/'and' leaf mixing them via member arrays), with an operator that produced non-empty lists for both.","commonSituations":"Building combined filter UIs where users can pick both attributes and metrics in one condition; programmatic filter merging that concatenates dimension and measure members into one node.","solutions":["Split the condition: dimension filters and measure filters must be separate filter nodes","Put measure conditions in the 'filters' acting on measures or in having-style position, not mixed in one leaf","Check filter-building code that merges member lists into a single object"],"exampleFix":"// before\n{ member: ['Orders.status', 'Orders.count'], operator: 'equals', values: ['shipped', 10] }\n// after\nfilters: [\n  { member: 'Orders.status', operator: 'equals', values: ['shipped'] },\n  { member: 'Orders.count', operator: 'equals', values: [10] }\n]","handlingStrategy":"validation","validationCode":"// split mixed leaves before sending\nfunction splitMixedFilters(filters, isMeasure) {\n  return filters.flatMap(f => {\n    const members = [].concat(f.member || f.dimension || []);\n    if (members.some(isMeasure) && members.some(m => !isMeasure(m))) {\n      return members.map(m => ({ ...f, member: m }));\n    }\n    return [f];\n  });\n}\nquery.filters = splitMixedFilters(query.filters, isKnownMeasure);","typeGuard":"const isPureDimOrMeasure = (f, isMeasure) => {\n  const ms = [].concat(f.member || f.dimension || []);\n  const hasDim = ms.some(m => !isMeasure(m));\n  const hasMea = ms.some(isMeasure);\n  return !(hasDim && hasMea);\n};","tryCatchPattern":"try {\n  await cubeApi.load(query);\n} catch (e) {\n  if (/dimension and measure in same condition/.test(e.message)) {\n    // split the filter into separate conditions and retry once\n  } else throw e;\n}","preventionTips":["Keep one member per filter leaf","Separate dimension filters from measure (having) filters in your UI/state model","Never merge filter nodes by concatenating member arrays across types"],"tags":["query","filters","semantics"],"backgroundTag":"mixed-dimension-measure-filter","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}