{"record":{"id":"ef442103d076878a","repo":"apache/druid","slug":"map-column-doesn-t-support-idlookup","errorCode":null,"errorMessage":"Map column doesn't support idLookup()","messagePattern":"Map column doesn't support idLookup\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions-contrib/virtual-columns/src/main/java/org/apache/druid/segment/MapTypeMapVirtualColumnDimensionSelector.java","lineNumber":114,"sourceCode":"\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  {\n    final DimensionSelector keySelector = getKeySelector();\n    final DimensionSelector valueSelector = getValueSelector();\n\n    final IndexedInts keyIndices = keySelector.getRow();\n    final IndexedInts valueIndices = valueSelector.getRow();\n\n    final int limit = Math.min(keyIndices.size(), valueIndices.size());\n    return IntStream\n        .range(0, limit)\n        .boxed()\n        .collect(\n            Collectors.toMap(\n                i -> keySelector.lookupName(keyIndices.get(i)),","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/virtual-columns/src/main/java/org/apache/druid/segment/MapTypeMapVirtualColumnDimensionSelector.java#L96-L132","documentation":"idLookup() should return an IdLookup that maps string values to dictionary ids without boxing; because this map-backed selector has no dictionary, the method throws UnsupportedOperationException rather than returning a bogus lookup.","triggerScenarios":"Query engines that call idLookup() to optimize filters or to obtain ids directly from string values (e.g. in some group-by or filter implementations) when the selector wraps a map virtual column.","commonSituations":"Filter pushdown or integer-optimization code paths hitting a map virtual column; third-party/custom extensions assuming all DimensionSelectors provide IdLookup.","solutions":["Guard the call: only use idLookup() when the selector supports it; for map virtual columns use value-based matchers via getObject() instead.","Avoid using the map virtual column in scenarios that require id-based optimization (direct group-by, string-keyed filters).","Project the desired map key into a normal column/expression before filtering or grouping."],"exampleFix":"// before\nIdLookup lookup = selector.idLookup(); // throws\n// after\nif (selector.nameLookupPossibleInAdvance()) {\n  IdLookup lookup = selector.idLookup();\n} else {\n  ValueMatcher matcher = selector.makeValueMatcher(expectedValue);\n}","handlingStrategy":"type-guard","validationCode":"if (selector.nameLookupPossibleInAdvance() && selector.idLookup() != null) { /* id-based optimization */ }","typeGuard":"IdLookup safeIdLookup(DimensionSelector s) {\n  try { return s.idLookup(); } catch (UnsupportedOperationException e) { return null; }\n}","tryCatchPattern":"try {\n  IdLookup lookup = selector.idLookup();\n  optimizeWithIds(lookup);\n} catch (UnsupportedOperationException e) {\n  optimizeWithValues(selector); // string/value based path\n}","preventionTips":["Treat IdLookup as optional; never assume every DimensionSelector provides it.","Wrap idLookup() in try/catch or feature-detect via nameLookupPossibleInAdvance().","Restrict id-optimizing code paths to dictionary-backed columns."],"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"}