{"record":{"id":"062cf11aa8742cc4","repo":"apache/druid","slug":"cardinalitybufferaggregator-does-not-support-getlo","errorCode":null,"errorMessage":"CardinalityBufferAggregator does not support getLong()","messagePattern":"CardinalityBufferAggregator does not support getLong\\(\\)","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityBufferAggregator.java","lineNumber":92,"sourceCode":"  }\n\n  @Override\n  public Object get(ByteBuffer buf, int position)\n  {\n    return HyperUniquesBufferAggregator.doGet(buf, position);\n  }\n\n  @Override\n  public float getFloat(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"CardinalityBufferAggregator does not support getFloat()\");\n  }\n\n\n  @Override\n  public long getLong(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"CardinalityBufferAggregator does not support getLong()\");\n  }\n\n  @Override\n  public double getDouble(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"CardinalityBufferAggregators does not support getDouble()\");\n  }\n\n  @Override\n  public void close()\n  {\n    // no resources to cleanup\n  }\n\n  @Override\n  public void inspectRuntimeShape(RuntimeShapeInspector inspector)\n  {\n    for (int i = 0; i < selectorPluses.length; i++) {","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityBufferAggregator.java#L74-L110","documentation":"Sentinel guard in the buffer-based cardinality aggregator's typed read API: a cardinality/HyperUnique sketch is a probabilistic distinct-count structure with no long representation, so getLong() is deliberately unimplemented. It fires only when a query or column type binding asks for a primitive long read of a cardinality aggregator's output; callers must use get() (which returns the sketch object) or getFloat()/getDouble()-compatible aggregators instead.","triggerScenarios":"Calling bufferAggregator.getLong(buf, position) on a cardinality buffer aggregator when a long-typed result is assumed.","commonSituations":"Vectorized long extraction on cardinality aggregations; generic aggregation code that calls getLong for all columns.","solutions":["Read the sketch via get(buf, position) instead of getLong()","Use a numeric long aggregator if a long result is required","Finalize the sketch into an estimate before numeric consumption"],"exampleFix":"// before\nlong v = bufferAggregator.getLong(buf, position);\n// after\nObject v = bufferAggregator.get(buf, position); // HLL sketch","handlingStrategy":"type-guard","validationCode":"if (!(aggFactory instanceof CardinalityAggregatorFactory)) { long v = bufferAggregator.getLong(buf, position); }","typeGuard":"if (factory instanceof CardinalityAggregatorFactory) {\n    Object v = bufferAggregator.get(buf, position);\n} else {\n    long v = bufferAggregator.getLong(buf, position);\n}","tryCatchPattern":"try {\n    v = bufferAggregator.getLong(buf, position);\n} catch (UnsupportedOperationException e) {\n    v = 0L;\n}","preventionTips":["Use long aggregators for long-typed columns","Branch on factory type before calling numeric buffer getters","Finalize sketches into estimates before numeric use"],"tags":["java","druid","aggregation","cardinality","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}