提交 9b0e3a62 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Reduce code duplication

上级 bb78e045
...@@ -36,8 +36,22 @@ public abstract class AbstractAggregate extends Expression { ...@@ -36,8 +36,22 @@ public abstract class AbstractAggregate extends Expression {
protected Window over; protected Window over;
private SortOrder overOrderBySort;
private int lastGroupRowId; private int lastGroupRowId;
protected static SortOrder createOrder(Session session, ArrayList<SelectOrderBy> orderBy, int offset) {
int size = orderBy.size();
int[] index = new int[size];
int[] sortType = new int[size];
for (int i = 0; i < size; i++) {
SelectOrderBy o = orderBy.get(i);
index[i] = i + offset;
sortType[i] = o.sortType;
}
return new SortOrder(session.getDatabase(), index, sortType, null);
}
AbstractAggregate(Select select, boolean distinct) { AbstractAggregate(Select select, boolean distinct) {
this.select = select; this.select = select;
this.distinct = distinct; this.distinct = distinct;
...@@ -73,6 +87,17 @@ public abstract class AbstractAggregate extends Expression { ...@@ -73,6 +87,17 @@ public abstract class AbstractAggregate extends Expression {
} }
} }
@Override
public Expression optimize(Session session) {
if (over != null) {
ArrayList<SelectOrderBy> orderBy = over.getOrderBy();
if (orderBy != null) {
overOrderBySort = createOrder(session, orderBy, getNumExpressions());
}
}
return this;
}
@Override @Override
public void setEvaluatable(TableFilter tableFilter, boolean b) { public void setEvaluatable(TableFilter tableFilter, boolean b) {
if (filterCondition != null) { if (filterCondition != null) {
...@@ -309,8 +334,7 @@ public abstract class AbstractAggregate extends Expression { ...@@ -309,8 +334,7 @@ public abstract class AbstractAggregate extends Expression {
ArrayList<Value[]> orderedData = (ArrayList<Value[]>) data; ArrayList<Value[]> orderedData = (ArrayList<Value[]>) data;
int ne = getNumExpressions(); int ne = getNumExpressions();
int last = ne + over.getOrderBy().size(); int last = ne + over.getOrderBy().size();
SortOrder sortOrder = createOrder(session, ne); orderedData.sort(overOrderBySort);
orderedData.sort(sortOrder);
Object aggregateData = createAggregateData(); Object aggregateData = createAggregateData();
for (Value[] row : orderedData) { for (Value[] row : orderedData) {
updateFromExpressions(session, aggregateData, row); updateFromExpressions(session, aggregateData, row);
...@@ -320,19 +344,6 @@ public abstract class AbstractAggregate extends Expression { ...@@ -320,19 +344,6 @@ public abstract class AbstractAggregate extends Expression {
return result.get(groupData.getCurrentGroupRowId()); return result.get(groupData.getCurrentGroupRowId());
} }
private SortOrder createOrder(Session session, int ne) {
ArrayList<SelectOrderBy> orderBy = over.getOrderBy();
int size = orderBy.size();
int[] index = new int[size];
int[] sortType = new int[size];
for (int i = 0; i < size; i++) {
SelectOrderBy o = orderBy.get(i);
index[i] = i + ne;
sortType[i] = o.sortType;
}
return new SortOrder(session.getDatabase(), index, sortType, null);
}
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(')');
......
...@@ -256,18 +256,6 @@ public class Aggregate extends AbstractAggregate { ...@@ -256,18 +256,6 @@ public class Aggregate extends AbstractAggregate {
this.groupConcatSeparator = separator; this.groupConcatSeparator = separator;
} }
private SortOrder initOrder(Session session) {
int size = orderByList.size();
int[] index = new int[size];
int[] sortType = new int[size];
for (int i = 0; i < size; i++) {
SelectOrderBy o = orderByList.get(i);
index[i] = i + 1;
sortType[i] = o.sortType;
}
return new SortOrder(session.getDatabase(), index, sortType, null);
}
private void sortWithOrderBy(Value[] array) { private void sortWithOrderBy(Value[] array) {
final SortOrder sortOrder = orderBySort; final SortOrder sortOrder = orderBySort;
if (sortOrder != null) { if (sortOrder != null) {
...@@ -489,6 +477,7 @@ public class Aggregate extends AbstractAggregate { ...@@ -489,6 +477,7 @@ public class Aggregate extends AbstractAggregate {
@Override @Override
public Expression optimize(Session session) { public Expression optimize(Session session) {
super.optimize(session);
if (on != null) { if (on != null) {
on = on.optimize(session); on = on.optimize(session);
dataType = on.getType(); dataType = on.getType();
...@@ -500,7 +489,7 @@ public class Aggregate extends AbstractAggregate { ...@@ -500,7 +489,7 @@ public class Aggregate extends AbstractAggregate {
for (SelectOrderBy o : orderByList) { for (SelectOrderBy o : orderByList) {
o.expression = o.expression.optimize(session); o.expression = o.expression.optimize(session);
} }
orderBySort = initOrder(session); orderBySort = createOrder(session, orderByList, 1);
} }
if (groupConcatSeparator != null) { if (groupConcatSeparator != null) {
groupConcatSeparator = groupConcatSeparator.optimize(session); groupConcatSeparator = groupConcatSeparator.optimize(session);
......
...@@ -116,6 +116,7 @@ public class JavaAggregate extends AbstractAggregate { ...@@ -116,6 +116,7 @@ public class JavaAggregate extends AbstractAggregate {
@Override @Override
public Expression optimize(Session session) { public Expression optimize(Session session) {
super.optimize(session);
userConnection = session.createConnection(false); userConnection = session.createConnection(false);
int len = args.length; int len = args.length;
argTypes = new int[len]; argTypes = new int[len];
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论