提交 64ff1b54 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add and use Window.setEvaluatable()

上级 a489024d
...@@ -7,6 +7,7 @@ package org.h2.expression.aggregate; ...@@ -7,6 +7,7 @@ package org.h2.expression.aggregate;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter;
/** /**
* A base class for aggregates. * A base class for aggregates.
...@@ -47,6 +48,16 @@ public abstract class AbstractAggregate extends Expression { ...@@ -47,6 +48,16 @@ public abstract class AbstractAggregate extends Expression {
} }
} }
@Override
public void setEvaluatable(TableFilter tableFilter, boolean b) {
if (filterCondition != null) {
filterCondition.setEvaluatable(tableFilter, b);
}
if (over != null) {
over.setEvaluatable(tableFilter, b);
}
}
protected StringBuilder appendTailConditions(StringBuilder builder) { protected StringBuilder appendTailConditions(StringBuilder builder) {
if (filterCondition != null) { if (filterCondition != null) {
builder.append(" FILTER (WHERE ").append(filterCondition.getSQL()).append(')'); builder.append(" FILTER (WHERE ").append(filterCondition.getSQL()).append(')');
......
...@@ -588,9 +588,7 @@ public class Aggregate extends AbstractAggregate { ...@@ -588,9 +588,7 @@ public class Aggregate extends AbstractAggregate {
if (groupConcatSeparator != null) { if (groupConcatSeparator != null) {
groupConcatSeparator.setEvaluatable(tableFilter, b); groupConcatSeparator.setEvaluatable(tableFilter, b);
} }
if (filterCondition != null) { super.setEvaluatable(tableFilter, b);
filterCondition.setEvaluatable(tableFilter, b);
}
} }
@Override @Override
......
...@@ -149,9 +149,7 @@ public class JavaAggregate extends AbstractAggregate { ...@@ -149,9 +149,7 @@ public class JavaAggregate extends AbstractAggregate {
for (Expression e : args) { for (Expression e : args) {
e.setEvaluatable(tableFilter, b); e.setEvaluatable(tableFilter, b);
} }
if (filterCondition != null) { super.setEvaluatable(tableFilter, b);
filterCondition.setEvaluatable(tableFilter, b);
}
} }
private Aggregate getInstance() throws SQLException { private Aggregate getInstance() throws SQLException {
......
...@@ -10,6 +10,7 @@ import java.util.ArrayList; ...@@ -10,6 +10,7 @@ import java.util.ArrayList;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.table.ColumnResolver; import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter;
import org.h2.util.StringUtils; import org.h2.util.StringUtils;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray; import org.h2.value.ValueArray;
...@@ -47,6 +48,23 @@ public final class Window { ...@@ -47,6 +48,23 @@ public final class Window {
} }
} }
/**
* Tell the expression columns whether the table filter can return values
* now. This is used when optimizing the query.
*
* @param tableFilter
* the table filter
* @param value
* true if the table filter can return value
*/
public void setEvaluatable(TableFilter tableFilter, boolean value) {
if (partitionBy != null) {
for (Expression e : partitionBy) {
e.setEvaluatable(tableFilter, value);
}
}
}
/** /**
* Returns the key for the current group. * Returns the key for the current group.
* *
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论