{"record":{"id":"64919a7a12fe0d05","repo":"apache/druid","slug":"received-a-non-applicable-rewrite-s-filter-s-di-64919a","errorCode":null,"errorMessage":"Received a non-applicable rewrite: %s, filter's dimension: %s","messagePattern":"Received a non-applicable rewrite: (.+?), filter's dimension: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/filter/SelectorFilter.java","lineNumber":155,"sourceCode":"  @Override\n  public Set<String> getRequiredColumns()\n  {\n    return ImmutableSet.of(dimension);\n  }\n\n  @Override\n  public boolean supportsRequiredColumnRewrite()\n  {\n    return true;\n  }\n\n  @Override\n  public Filter rewriteRequiredColumns(Map<String, String> columnRewrites)\n  {\n    String rewriteDimensionTo = columnRewrites.get(dimension);\n\n    if (rewriteDimensionTo == null) {\n      throw new IAE(\n          \"Received a non-applicable rewrite: %s, filter's dimension: %s\",\n          columnRewrites,\n          dimension\n      );\n    }\n\n    return new SelectorFilter(\n        rewriteDimensionTo,\n        value\n    );\n  }\n\n  @Override\n  public String toString()\n  {\n    return StringUtils.format(\"%s = %s\", dimension, value);\n  }\n","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/filter/SelectorFilter.java#L137-L173","documentation":"SelectorFilter.rewriteRequiredColumns throws this IllegalArgumentException when the columnRewrites map contains no key matching the filter's dimension. The rewrite mechanism maps each filter's dimension to a new column; a null lookup result means this specific filter cannot be rewritten with the given map, which the API signals as a caller error.","triggerScenarios":"Calling rewriteRequiredColumns on a SelectorFilter whose dimension is absent from the passed map, e.g. rewriting filters over columns 'a' and 'b' with a map containing only 'a'.","commonSituations":"Building rewritten queries where dimension renaming covers only a subset of filter dimensions; reusing a rewrite map across different filter trees; typos in the dimension key.","solutions":["Include an entry for the SelectorFilter's exact dimension string in the columnRewrites map","Check for key case/typo mismatches between the filter's dimension and the map keys","Ensure the full filter tree's dimensions are enumerated when building the rewrite map"],"exampleFix":"// before\nrewrites = ImmutableMap.of(\"dim1\", \"renamed1\");\nselectorFilter.rewriteRequiredColumns(rewrites); // filter's dimension is \"dim2\"\n// after\nrewrites = ImmutableMap.of(\"dim1\", \"renamed1\", \"dim2\", \"renamed2\");\nselectorFilter.rewriteRequiredColumns(rewrites);","handlingStrategy":"validation","validationCode":"Set<String> dims = collectDimensions(filterTree); if (!rewrites.keySet().containsAll(dims)) { throw new IllegalArgumentException(\"rewrite map missing: \" + new HashSet<>(dims)); }","typeGuard":"boolean coversAll(Map<String,String> m, Set<String> dims) { return m.keySet().containsAll(dims); }","tryCatchPattern":"try { return sf.rewriteRequiredColumns(rewrites); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"non-applicable rewrite\")) { log.warn(\"skipping rewrite\", e); return sf; } throw e; }","preventionTips":["Enumerate all filter dimensions programmatically before creating the map","Unit-test rewrite maps against representative filter trees"],"tags":["java","filter","column-rewrite"],"backgroundTag":"missing-required-argument","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"}