提交 08913f79 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Extract DataAnalysisOperation from AbstractAggregate

上级 3814c595
...@@ -171,6 +171,7 @@ import org.h2.expression.UnaryOperation; ...@@ -171,6 +171,7 @@ import org.h2.expression.UnaryOperation;
import org.h2.expression.ValueExpression; import org.h2.expression.ValueExpression;
import org.h2.expression.Variable; import org.h2.expression.Variable;
import org.h2.expression.Wildcard; import org.h2.expression.Wildcard;
import org.h2.expression.aggregate.DataAnalysisOperation;
import org.h2.expression.aggregate.AbstractAggregate; import org.h2.expression.aggregate.AbstractAggregate;
import org.h2.expression.aggregate.Aggregate; import org.h2.expression.aggregate.Aggregate;
import org.h2.expression.aggregate.Aggregate.AggregateType; import org.h2.expression.aggregate.Aggregate.AggregateType;
...@@ -3053,23 +3054,24 @@ public class Parser { ...@@ -3053,23 +3054,24 @@ public class Parser {
} }
private void readFilterAndOver(AbstractAggregate aggregate) { private void readFilterAndOver(AbstractAggregate aggregate) {
boolean isAggregate = aggregate.isAggregate(); if (readIf("FILTER")) {
if (isAggregate && readIf("FILTER")) {
read(OPEN_PAREN); read(OPEN_PAREN);
read(WHERE); read(WHERE);
Expression filterCondition = readExpression(); Expression filterCondition = readExpression();
read(CLOSE_PAREN); read(CLOSE_PAREN);
aggregate.setFilterCondition(filterCondition); aggregate.setFilterCondition(filterCondition);
} }
Window over = null; readOver(aggregate);
}
private void readOver(DataAnalysisOperation operation) {
if (readIf("OVER")) { if (readIf("OVER")) {
over = readWindowNameOrSpecification(); operation.setOverCondition(readWindowNameOrSpecification());
aggregate.setOverCondition(over);
currentSelect.setWindowQuery(); currentSelect.setWindowQuery();
} else if (!isAggregate) { } else if (operation.isAggregate()) {
throw getSyntaxError();
} else {
currentSelect.setGroupQuery(); currentSelect.setGroupQuery();
} else {
throw getSyntaxError();
} }
} }
...@@ -3440,7 +3442,7 @@ public class Parser { ...@@ -3440,7 +3442,7 @@ public class Parser {
default: default:
// Avoid warning // Avoid warning
} }
readFilterAndOver(function); readOver(function);
return function; return function;
} }
......
...@@ -14,6 +14,7 @@ import java.util.Map.Entry; ...@@ -14,6 +14,7 @@ import java.util.Map.Entry;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
import org.h2.expression.aggregate.DataAnalysisOperation;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray; import org.h2.value.ValueArray;
...@@ -210,7 +211,7 @@ public abstract class SelectGroups { ...@@ -210,7 +211,7 @@ public abstract class SelectGroups {
/** /**
* Maps an expression object to its data. * Maps an expression object to its data.
*/ */
private final HashMap<Expression, Object> windowData = new HashMap<>(); private final HashMap<DataAnalysisOperation, Object> windowData = new HashMap<>();
/** /**
* The id of the current group. * The id of the current group.
...@@ -292,7 +293,7 @@ public abstract class SelectGroups { ...@@ -292,7 +293,7 @@ public abstract class SelectGroups {
* expression * expression
* @return expression data or null * @return expression data or null
*/ */
public final Object getWindowExprData(Expression expr) { public final Object getWindowExprData(DataAnalysisOperation expr) {
return windowData.get(expr); return windowData.get(expr);
} }
...@@ -304,7 +305,7 @@ public abstract class SelectGroups { ...@@ -304,7 +305,7 @@ public abstract class SelectGroups {
* @param object * @param object
* expression data to set * expression data to set
*/ */
public final void setWindowExprData(Expression expr, Object obj) { public final void setWindowExprData(DataAnalysisOperation expr, Object obj) {
Object old = windowData.put(expr, obj); Object old = windowData.put(expr, obj);
assert old == null; assert old == null;
} }
......
...@@ -251,11 +251,6 @@ public class Aggregate extends AbstractAggregate { ...@@ -251,11 +251,6 @@ public class Aggregate extends AbstractAggregate {
return AGGREGATES.get(name); return AGGREGATES.get(name);
} }
@Override
public boolean isAggregate() {
return true;
}
/** /**
* Set the order for ARRAY_AGG() or GROUP_CONCAT() aggregate. * Set the order for ARRAY_AGG() or GROUP_CONCAT() aggregate.
* *
...@@ -312,6 +307,7 @@ public class Aggregate extends AbstractAggregate { ...@@ -312,6 +307,7 @@ public class Aggregate extends AbstractAggregate {
@Override @Override
protected void updateGroupAggregates(Session session, int stage) { protected void updateGroupAggregates(Session session, int stage) {
super.updateGroupAggregates(session, stage);
if (on != null) { if (on != null) {
on.updateAggregate(session, stage); on.updateAggregate(session, stage);
} }
...@@ -514,9 +510,6 @@ public class Aggregate extends AbstractAggregate { ...@@ -514,9 +510,6 @@ public class Aggregate extends AbstractAggregate {
if (groupConcatSeparator != null) { if (groupConcatSeparator != null) {
groupConcatSeparator = groupConcatSeparator.optimize(session); groupConcatSeparator = groupConcatSeparator.optimize(session);
} }
if (filterCondition != null) {
filterCondition = filterCondition.optimize(session);
}
switch (type) { switch (type) {
case GROUP_CONCAT: case GROUP_CONCAT:
dataType = Value.STRING; dataType = Value.STRING;
......
...@@ -40,11 +40,6 @@ public class JavaAggregate extends AbstractAggregate { ...@@ -40,11 +40,6 @@ public class JavaAggregate extends AbstractAggregate {
this.args = args; this.args = args;
} }
@Override
public boolean isAggregate() {
return true;
}
@Override @Override
public int getCost() { public int getCost() {
int cost = 5; int cost = 5;
...@@ -140,9 +135,6 @@ public class JavaAggregate extends AbstractAggregate { ...@@ -140,9 +135,6 @@ public class JavaAggregate extends AbstractAggregate {
} catch (SQLException e) { } catch (SQLException e) {
throw DbException.convert(e); throw DbException.convert(e);
} }
if (filterCondition != null) {
filterCondition = filterCondition.optimize(session);
}
return this; return this;
} }
...@@ -237,6 +229,7 @@ public class JavaAggregate extends AbstractAggregate { ...@@ -237,6 +229,7 @@ public class JavaAggregate extends AbstractAggregate {
@Override @Override
protected void updateGroupAggregates(Session session, int stage) { protected void updateGroupAggregates(Session session, int stage) {
super.updateGroupAggregates(session, stage);
for (Expression expr : args) { for (Expression expr : args) {
expr.updateAggregate(session, stage); expr.updateAggregate(session, stage);
} }
......
...@@ -10,6 +10,7 @@ import java.util.HashMap; ...@@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import org.h2.command.dml.Select; import org.h2.command.dml.Select;
import org.h2.command.dml.SelectGroups;
import org.h2.command.dml.SelectOrderBy; import org.h2.command.dml.SelectOrderBy;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.expression.Expression; import org.h2.expression.Expression;
...@@ -24,7 +25,7 @@ import org.h2.value.ValueNull; ...@@ -24,7 +25,7 @@ import org.h2.value.ValueNull;
/** /**
* A window function. * A window function.
*/ */
public class WindowFunction extends AbstractAggregate { public class WindowFunction extends DataAnalysisOperation {
private final WindowFunctionType type; private final WindowFunctionType type;
...@@ -105,7 +106,7 @@ public class WindowFunction extends AbstractAggregate { ...@@ -105,7 +106,7 @@ public class WindowFunction extends AbstractAggregate {
* arguments, or null * arguments, or null
*/ */
public WindowFunction(WindowFunctionType type, Select select, Expression[] args) { public WindowFunction(WindowFunctionType type, Select select, Expression[] args) {
super(select, false); super(select);
this.type = type; this.type = type;
this.args = args; this.args = args;
} }
...@@ -145,12 +146,13 @@ public class WindowFunction extends AbstractAggregate { ...@@ -145,12 +146,13 @@ public class WindowFunction extends AbstractAggregate {
} }
@Override @Override
protected void updateAggregate(Session session, Object aggregateData) { protected void updateAggregate(Session session, SelectGroups groupData, int groupRowId) {
throw DbException.getUnsupportedException("Window function"); updateOrderedAggregate(session, groupData, groupRowId, over.getOrderBy());
} }
@Override @Override
protected void updateGroupAggregates(Session session, int stage) { protected void updateGroupAggregates(Session session, int stage) {
super.updateGroupAggregates(session, stage);
if (args != null) { if (args != null) {
for (Expression expr : args) { for (Expression expr : args) {
expr.updateAggregate(session, stage); expr.updateAggregate(session, stage);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论