apache/druid · error · IllegalArgumentException
Received a non-applicable rewrite
Error message
Received a non-applicable rewrite: %s, filter's dimension: %s
What it means
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.
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
Example fix
// before
rewrites = ImmutableMap.of("dim1", "renamed1");
selectorFilter.rewriteRequiredColumns(rewrites); // filter's dimension is "dim2"
// after
rewrites = ImmutableMap.of("dim1", "renamed1", "dim2", "renamed2");
selectorFilter.rewriteRequiredColumns(rewrites); Defensive patterns
Strategy: validation
Validate before calling
Set<String> dims = collectDimensions(filterTree); if (!rewrites.keySet().containsAll(dims)) { throw new IllegalArgumentException("rewrite map missing: " + new HashSet<>(dims)); } Type guard
boolean coversAll(Map<String,String> m, Set<String> dims) { return m.keySet().containsAll(dims); } Try / catch
try { return sf.rewriteRequiredColumns(rewrites); } catch (IllegalArgumentException e) { if (e.getMessage().contains("non-applicable rewrite")) { log.warn("skipping rewrite", e); return sf; } throw e; } Prevention
- Enumerate all filter dimensions programmatically before creating the map
- Unit-test rewrite maps against representative filter trees
When it happens
Trigger: 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'.
Common situations: 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.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Received a non-applicable rewrite
- Exceeded maximum allowed filters for CNF (conjunctive…
- Received a non-applicable rewrite
- Received a non-applicable rewrite
- Required column rewrite is not supported by this filter.
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/64919a7a12fe0d05.
Report an issue: GitHub.
Appendix: source
Thrown at processing/src/main/java/org/apache/druid/segment/filter/SelectorFilter.java:155
@Override
public Set<String> getRequiredColumns()
{
return ImmutableSet.of(dimension);
}
@Override
public boolean supportsRequiredColumnRewrite()
{
return true;
}
@Override
public Filter rewriteRequiredColumns(Map<String, String> columnRewrites)
{
String rewriteDimensionTo = columnRewrites.get(dimension);
if (rewriteDimensionTo == null) {
throw new IAE(
"Received a non-applicable rewrite: %s, filter's dimension: %s",
columnRewrites,
dimension
);
}
return new SelectorFilter(
rewriteDimensionTo,
value
);
}
@Override
public String toString()
{
return StringUtils.format("%s = %s", dimension, value);
}
View on GitHub (pinned to 9b90983fd2)