Class DatasetRewriter

java.lang.Object
org.elasticsearch.xpack.esql.datasources.DatasetRewriter

public final class DatasetRewriter extends Object
Rewrites FROM <dataset> into the same UnresolvedExternalRelation the EXTERNAL command produces, so both paths converge at the existing resolver + analyzer. Runs once on the parsed plan before pre-analysis.

Pattern expansion (wildcards, exclusions, date math, hidden flag) is not done here. It happens in the authorization engine: DatasetResolver dispatches each relation's raw FROM patterns to EsqlResolveDatasetAction, whose body calls resolve(java.lang.String[], java.lang.String[], org.elasticsearch.cluster.metadata.ProjectMetadata, org.elasticsearch.cluster.metadata.IndexNameExpressionResolver) to expand the patterns against the caller's authorized abstractions (wildcard expansion lands where authorization lives, not client-side). resolve(java.lang.String[], java.lang.String[], org.elasticsearch.cluster.metadata.ProjectMetadata, org.elasticsearch.cluster.metadata.IndexNameExpressionResolver) returns, per relation, the authorized concrete dataset names plus whether the relation also targets non-dataset abstractions. rewrite(org.elasticsearch.xpack.esql.plan.logical.LogicalPlan, org.elasticsearch.cluster.metadata.ProjectMetadata, java.util.Map<org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation, org.elasticsearch.xpack.esql.datasources.DatasetRewriter.DatasetResolution>, boolean)/rewriteOne(org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation, org.elasticsearch.cluster.metadata.DatasetMetadata, org.elasticsearch.xpack.esql.datasources.metadata.DataSourceMetadata, org.elasticsearch.xpack.esql.datasources.DatasetRewriter.DatasetResolution, boolean) then consume that DatasetRewriter.DatasetResolution to build the plan — they no longer resolve, expand, or gate on authorization.