{"record":{"id":"a981fa42edd28321","repo":"apache/druid","slug":"cardinalitybufferaggregator-does-not-support-getfl","errorCode":null,"errorMessage":"CardinalityBufferAggregator does not support getFloat()","messagePattern":"CardinalityBufferAggregator does not support getFloat\\(\\)","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityBufferAggregator.java","lineNumber":85,"sourceCode":"        CardinalityAggregator.hashValues(selectorPluses, collector);\n      }\n    }\n    finally {\n      buf.limit(oldLimit);\n      buf.position(oldPosition);\n    }\n  }\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  {","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/cardinality/CardinalityBufferAggregator.java#L67-L103","documentation":"CardinalityBufferAggregator aggregates HLL sketches into a ByteBuffer and only supports reading the sketch via get(). getFloat() throws UnsupportedOperationException because no float primitive is stored.","triggerScenarios":"Calling bufferAggregator.getFloat(buf, position) on a CardinalityAggregatorFactory-created buffer aggregator, i.e. when the query engine resolves the aggregation type as FLOAT.","commonSituations":"Vectorized/numeric result extraction on a cardinality aggregation; custom code assuming all buffer aggregators expose numeric getters.","solutions":["Read the sketch via get(buf, position) (HyperUniquesBufferAggregator.doGet) instead of getFloat()","Use the cardinality aggregation only with object/string-typed result handling","Choose a numeric aggregator if a float result is required"],"exampleFix":"// before\nfloat v = bufferAggregator.getFloat(buf, position);\n// after\nObject v = bufferAggregator.get(buf, position); // HLL sketch","handlingStrategy":"type-guard","validationCode":"if (!(aggFactory instanceof CardinalityAggregatorFactory)) { float v = bufferAggregator.getFloat(buf, position); }","typeGuard":"if (factory instanceof CardinalityAggregatorFactory) {\n    Object v = bufferAggregator.get(buf, position);\n} else {\n    float v = bufferAggregator.getFloat(buf, position);\n}","tryCatchPattern":"try {\n    v = bufferAggregator.getFloat(buf, position);\n} catch (UnsupportedOperationException e) {\n    v = Float.NaN;\n}","preventionTips":["Read cardinality buffer results via get()/HyperUniquesBufferAggregator.doGet","Avoid numeric-typed result extraction for cardinality aggregations","Match aggregation factory type to result-row column type"],"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"}