{"record":{"id":"f3a313952f6da6bd","repo":"apache/druid","slug":"map-column-doesn-t-support-lookupname","errorCode":null,"errorMessage":"Map column doesn't support lookupName()","messagePattern":"Map column doesn't support lookupName\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions-contrib/virtual-columns/src/main/java/org/apache/druid/segment/MapTypeMapVirtualColumnDimensionSelector.java","lineNumber":101,"sourceCode":"      @Override\n      public void inspectRuntimeShape(RuntimeShapeInspector inspector)\n      {\n\n      }\n    };\n  }\n\n  @Override\n  public int getValueCardinality()\n  {\n    return CARDINALITY_UNKNOWN;\n  }\n\n  @Nullable\n  @Override\n  public String lookupName(int id)\n  {\n    throw new UnsupportedOperationException(\"Map column doesn't support lookupName()\");\n  }\n\n  @Override\n  public boolean nameLookupPossibleInAdvance()\n  {\n    return false;\n  }\n\n  @Nullable\n  @Override\n  public IdLookup idLookup()\n  {\n    throw new UnsupportedOperationException(\"Map column doesn't support idLookup()\");\n  }\n\n  @Override\n  public Object getObject()\n  {","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/virtual-columns/src/main/java/org/apache/druid/segment/MapTypeMapVirtualColumnDimensionSelector.java#L83-L119","documentation":"This dimension selector has no dictionary (name lookup is only possible lazily and idLookup() returns null semantics), so mapping an encoded id back to its string name is impossible. lookupName() throws UnsupportedOperationException to signal the column is not dictionary-backed.","triggerScenarios":"Any code path calling lookupName(int) on the selector: value extraction in JSON output paths that resolve dimension ids to strings, string-based ValueMatchers built via lookupName, or search/select queries on a map virtual column.","commonSituations":"GroupBy v1 or search queries that require dictionary resolution applied to a map virtual column; custom code that calls lookupName without first checking nameLookupPossibleInAdvance() (which returns false here).","solutions":["Check nameLookupPossibleInAdvance() before calling lookupName(); for this selector it returns false, so restructure to avoid name resolution.","Use the map column only through getObject()/key-value selectors rather than as a dictionary dimension.","Extract the needed key into a regular (dictionary-backed) column or virtual column expression before querying it."],"exampleFix":"// before\nString name = selector.lookupName(id); // throws\n// after\nif (selector.nameLookupPossibleInAdvance()) {\n  String name = selector.lookupName(id);\n} else {\n  Object raw = selector.getObject(); // map-aware path\n}","handlingStrategy":"type-guard","validationCode":"if (selector.nameLookupPossibleInAdvance()) { String n = selector.lookupName(id); } else { /* map-aware path */ }","typeGuard":"String safeLookupName(DimensionSelector s, int id) {\n  return s.nameLookupPossibleInAdvance() ? s.lookupName(id) : null;\n}","tryCatchPattern":"try {\n  return selector.lookupName(id);\n} catch (UnsupportedOperationException e) {\n  return null; // fall back to raw id / map-aware access\n}","preventionTips":["Respect the nameLookupPossibleInAdvance() contract before calling lookupName().","Avoid search/select and string-matcher paths on map virtual columns.","Extract needed keys into ordinary columns for dictionary-dependent queries."],"tags":["java","virtual-columns","unsupported-operation","dictionary-lookup"],"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"}