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

  1. Include an entry for the SelectorFilter's exact dimension string in the columnRewrites map
  2. Check for key case/typo mismatches between the filter's dimension and the map keys
  3. 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

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


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)