[ESQL] Ensure date/date_nanos implicit casting rule behind snapshot (#130026)
* put date date_nanos implicit casting rule behind snapshot
This commit is contained in:
parent
a7a79f7612
commit
c43a51d842
|
@ -1,6 +0,0 @@
|
|||
pr: 127797
|
||||
summary: "Date nanos implicit casting in union types option #2"
|
||||
area: ES|QL
|
||||
type: enhancement
|
||||
issues:
|
||||
- 110009
|
|
@ -134,6 +134,7 @@ import java.util.stream.Collectors;
|
|||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static org.elasticsearch.xpack.core.enrich.EnrichPolicy.GEO_MATCH_TYPE;
|
||||
import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.IMPLICIT_CASTING_DATE_AND_DATE_NANOS;
|
||||
import static org.elasticsearch.xpack.esql.core.type.DataType.BOOLEAN;
|
||||
import static org.elasticsearch.xpack.esql.core.type.DataType.DATETIME;
|
||||
import static org.elasticsearch.xpack.esql.core.type.DataType.DATE_NANOS;
|
||||
|
@ -175,7 +176,7 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
|
|||
new ResolveInference(),
|
||||
new ResolveLookupTables(),
|
||||
new ResolveFunctions(),
|
||||
new DateMillisToNanosInEsRelation()
|
||||
new DateMillisToNanosInEsRelation(IMPLICIT_CASTING_DATE_AND_DATE_NANOS.isEnabled())
|
||||
),
|
||||
new Batch<>(
|
||||
"Resolution",
|
||||
|
@ -1819,10 +1820,6 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
|
|||
|
||||
private static Expression typeSpecificConvert(ConvertFunction convert, Source source, DataType type, InvalidMappedField mtf) {
|
||||
EsField field = new EsField(mtf.getName(), type, mtf.getProperties(), mtf.isAggregatable());
|
||||
return typeSpecificConvert(convert, source, field);
|
||||
}
|
||||
|
||||
private static Expression typeSpecificConvert(ConvertFunction convert, Source source, EsField field) {
|
||||
FieldAttribute originalFieldAttr = (FieldAttribute) convert.field();
|
||||
FieldAttribute resolvedAttr = new FieldAttribute(
|
||||
source,
|
||||
|
@ -1902,23 +1899,42 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
|
|||
* Cast the union typed fields in EsRelation to date_nanos if they are mixed date and date_nanos types.
|
||||
*/
|
||||
private static class DateMillisToNanosInEsRelation extends Rule<LogicalPlan, LogicalPlan> {
|
||||
|
||||
private final boolean isSnapshot;
|
||||
|
||||
DateMillisToNanosInEsRelation(boolean isSnapshot) {
|
||||
this.isSnapshot = isSnapshot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LogicalPlan apply(LogicalPlan plan) {
|
||||
return plan.transformUp(EsRelation.class, relation -> {
|
||||
if (relation.indexMode() == IndexMode.LOOKUP) {
|
||||
return relation;
|
||||
}
|
||||
return relation.transformExpressionsUp(FieldAttribute.class, f -> {
|
||||
if (f.field() instanceof InvalidMappedField imf && imf.types().stream().allMatch(DataType::isDate)) {
|
||||
HashMap<ResolveUnionTypes.TypeResolutionKey, Expression> typeResolutions = new HashMap<>();
|
||||
var convert = new ToDateNanos(f.source(), f);
|
||||
imf.types().forEach(type -> typeResolutions(f, convert, type, imf, typeResolutions));
|
||||
var resolvedField = ResolveUnionTypes.resolvedMultiTypeEsField(f, typeResolutions);
|
||||
return new FieldAttribute(f.source(), f.parentName(), f.name(), resolvedField, f.nullable(), f.id(), f.synthetic());
|
||||
if (isSnapshot) {
|
||||
return plan.transformUp(EsRelation.class, relation -> {
|
||||
if (relation.indexMode() == IndexMode.LOOKUP) {
|
||||
return relation;
|
||||
}
|
||||
return f;
|
||||
return relation.transformExpressionsUp(FieldAttribute.class, f -> {
|
||||
if (f.field() instanceof InvalidMappedField imf && imf.types().stream().allMatch(DataType::isDate)) {
|
||||
HashMap<ResolveUnionTypes.TypeResolutionKey, Expression> typeResolutions = new HashMap<>();
|
||||
var convert = new ToDateNanos(f.source(), f);
|
||||
imf.types().forEach(type -> typeResolutions(f, convert, type, imf, typeResolutions));
|
||||
var resolvedField = ResolveUnionTypes.resolvedMultiTypeEsField(f, typeResolutions);
|
||||
return new FieldAttribute(
|
||||
f.source(),
|
||||
f.parentName(),
|
||||
f.name(),
|
||||
resolvedField,
|
||||
f.nullable(),
|
||||
f.id(),
|
||||
f.synthetic()
|
||||
);
|
||||
}
|
||||
return f;
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return plan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue