{"record":{"id":"35f5047491ac5288","repo":"apache/druid","slug":"cannot-perform-lookup-when-applying-an-extraction","errorCode":null,"errorMessage":"cannot perform lookup when applying an extraction function","messagePattern":"cannot perform lookup when applying an extraction function","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/column/StringUtf8DictionaryEncodedColumn.java","lineNumber":207,"sourceCode":"\n      @Override\n      public boolean nameLookupPossibleInAdvance()\n      {\n        return true;\n      }\n\n      @Nullable\n      @Override\n      public IdLookup idLookup()\n      {\n        return extractionFn == null ? this : null;\n      }\n\n      @Override\n      public int lookupId(String name)\n      {\n        if (extractionFn != null) {\n          throw new UnsupportedOperationException(\"cannot perform lookup when applying an extraction function\");\n        }\n        return StringUtf8DictionaryEncodedColumn.this.lookupId(name);\n      }\n    }\n\n    if (hasMultipleValues()) {\n      class MultiValueDimensionSelector extends QueryableDimensionSelector\n      {\n        @Override\n        public IndexedInts getRow()\n        {\n          return multiValueColumn.get(offset.getOffset());\n        }\n\n        @Override\n        public IndexedInts getRow(int offset)\n        {\n          return multiValueColumn.get(offset);","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/column/StringUtf8DictionaryEncodedColumn.java#L189-L225","documentation":"The dictionary-encoded column's lookupId(String) view throws UnsupportedOperationException when an extraction function was supplied to the column selector, because dictionary ids refer to raw values and cannot be used to look up values after extraction. This is an intentional guard in the anonymous IndexedTable/Dictionary lookup wrapper.","triggerScenarios":"Calling lookupId(name) on the dictionary object obtained from makeDimensionSelector/lookup machinery when the column was created with a non-null extractionFn.","commonSituations":"Filter/extraction code that assumes raw-dictionary lookups; join or lookup planning that ignores the extraction function applied to a dimension.","solutions":["Create the column/dimension selector without an extractionFn when dictionary-id lookup is needed","Apply the extraction after lookupId instead of via extractionFn","Check whether the selector exposes an extraction function and fall back to value-based lookup"],"exampleFix":"// before\nDimensionSelector sel = column.makeDimensionSelector(new ExtractionDimensionSpec(spec, extractionFn));\nint id = sel.lookupId(name);\n// after\nDimensionSelector sel = column.makeDimensionSelector(spec);\nint id = sel.lookupId(name); // apply extractionFn to sel.lookupName(id) afterwards if needed","handlingStrategy":"validation","validationCode":"if (selectorDimExtractionFn == null) { int id = dict.lookupId(name); } else { /* compare post-extraction values instead */ }","typeGuard":"boolean supportsLookupId(DimensionSelector sel) { try { sel.lookupId(null); return true; } catch (UnsupportedOperationException e) { return false; } } // prefer: check extractionFn at construction","tryCatchPattern":"try { return dict.lookupId(name); } catch (UnsupportedOperationException e) { return lookupByValue(name, extractionFn); }","preventionTips":["Do not attach extractionFn when dictionary-id lookups are required","Apply extractions after lookup, on lookupName results","Document that lookupId is only valid on raw dictionaries"],"tags":["java","unsupported-operation","extraction-function"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}