{"record":{"id":"9cd99e439cc136cb","repo":"apache/druid","slug":"not-implemented-9cd99e","errorCode":null,"errorMessage":"Not implemented","messagePattern":"Not implemented","errorType":"exception","errorClass":"java.lang.UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchMergeBufferAggregator.java","lineNumber":65,"sourceCode":"    helper.init(buffer, position);\n  }\n\n  @Override\n  public void aggregate(final ByteBuffer buffer, final int position)\n  {\n    DoublesSketchMergeAggregator.updateUnion(selector, helper.getSketchAtPosition(buffer, position));\n  }\n\n  @Override\n  public Object get(final ByteBuffer buffer, final int position)\n  {\n    return helper.getSketchAtPosition(buffer, position).getResult();\n  }\n\n  @Override\n  public float getFloat(final ByteBuffer buffer, final int position)\n  {\n    throw new UnsupportedOperationException(\"Not implemented\");\n  }\n\n  @Override\n  public long getLong(final ByteBuffer buffer, final int position)\n  {\n    throw new UnsupportedOperationException(\"Not implemented\");\n  }\n\n  @Override\n  public synchronized void close()\n  {\n    helper.clear();\n  }\n\n  // A small number of sketches may run out of the given memory, request more memory on heap and move there.\n  // In that case we need to reuse the object from the cache as opposed to wrapping the new buffer.\n  @Override\n  public synchronized void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer)","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchMergeBufferAggregator.java#L47-L83","documentation":"DoublesSketchMergeBufferAggregator.getFloat(ByteBuffer,int) is intentionally left unimplemented: the merged value stored in the buffer is a quantiles DoublesSketch, and extracting it as a float would be invalid, so the method throws UnsupportedOperationException to expose the incorrect accessor usage.","triggerScenarios":"Calling getFloat(buffer, position) on the merge buffer aggregator, e.g. when a query engine's selector signature treats the merged sketch column as a float numeric column.","commonSituations":"Distributed group-by/broker-side merges where intermediate sketch columns are mis-signed as numeric; custom code reading BufferAggregator results generically.","solutions":["Use get(buffer, position), which returns the merged sketch (or finalized value) via helper.getSketchAtPosition(...).getResult()","Correct the column signature to TYPE_COMPLEX for sketch columns","Use sketch post-aggregators for numeric metrics derived from the sketch"],"exampleFix":"// before\nfloat v = agg.getFloat(buf, position);\n// after\nObject result = agg.get(buf, position); // merged sketch or finalized value","handlingStrategy":"type-guard","validationCode":"Object v = mergeBufferAggregator.get(buffer, position);\nif (v instanceof DoublesSketch || v instanceof Number) { /* ok */ } else { throw new IllegalStateException(\"Unexpected buffer value\"); }","typeGuard":"boolean isComplexSketchSelector(ColumnValueSelector<?> sel) {\n  return sel.getObject() instanceof DoublesSketch || sel.getObject() instanceof Number;\n}","tryCatchPattern":"try {\n  return agg.getFloat(buffer, position);\n} catch (UnsupportedOperationException e) {\n  Object v = agg.get(buffer, position);\n  return v instanceof Number ? ((Number) v).floatValue() : Float.NaN;\n}","preventionTips":["Always read merged buffer sketches with get(buffer, position)","Declare merged sketch columns as TYPE_COMPLEX in query/engine signatures","Extract numeric metrics only via post-aggregators or finalize-then-read"],"tags":["java","druid","sketch","buffer-aggregator","unsupported-operation"],"backgroundTag":"method-not-implemented","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"}