提交 0d4c16fe authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Merge order by lists for ARRAY_AGG and GROUP_CONCAT

上级 24e0ae0c
...@@ -2628,7 +2628,7 @@ public class Parser { ...@@ -2628,7 +2628,7 @@ public class Parser {
readExpression(), currentSelect, distinct); readExpression(), currentSelect, distinct);
if (readIf("ORDER")) { if (readIf("ORDER")) {
read("BY"); read("BY");
r.setGroupConcatOrder(parseSimpleOrderList()); r.setOrderByList(parseSimpleOrderList());
} }
if (readIf("SEPARATOR")) { if (readIf("SEPARATOR")) {
...@@ -2642,7 +2642,7 @@ public class Parser { ...@@ -2642,7 +2642,7 @@ public class Parser {
r.setGroupConcatSeparator(readExpression()); r.setGroupConcatSeparator(readExpression());
if (readIf("ORDER")) { if (readIf("ORDER")) {
read("BY"); read("BY");
r.setGroupConcatOrder(parseSimpleOrderList()); r.setOrderByList(parseSimpleOrderList());
} }
} else { } else {
r = null; r = null;
...@@ -2654,7 +2654,7 @@ public class Parser { ...@@ -2654,7 +2654,7 @@ public class Parser {
readExpression(), currentSelect, distinct); readExpression(), currentSelect, distinct);
if (readIf("ORDER")) { if (readIf("ORDER")) {
read("BY"); read("BY");
r.setArrayAggOrder(parseSimpleOrderList()); r.setOrderByList(parseSimpleOrderList());
} }
} else { } else {
boolean distinct = readIf("DISTINCT"); boolean distinct = readIf("DISTINCT");
......
...@@ -143,10 +143,8 @@ public class Aggregate extends Expression { ...@@ -143,10 +143,8 @@ public class Aggregate extends Expression {
private Expression on; private Expression on;
private Expression groupConcatSeparator; private Expression groupConcatSeparator;
private ArrayList<SelectOrderBy> groupConcatOrderList; private ArrayList<SelectOrderBy> orderByList;
private ArrayList<SelectOrderBy> arrayAggOrderList; private SortOrder orderBySort;
private SortOrder groupConcatSort;
private SortOrder arrayOrderSort;
private int dataType, scale; private int dataType, scale;
private long precision; private long precision;
private int displaySize; private int displaySize;
...@@ -220,21 +218,12 @@ public class Aggregate extends Expression { ...@@ -220,21 +218,12 @@ public class Aggregate extends Expression {
} }
/** /**
* Set the order for GROUP_CONCAT() aggregate. * Set the order for ARRAY_AGG() or GROUP_CONCAT() aggregate.
* *
* @param orderBy the order by list * @param orderByList the order by list
*/ */
public void setGroupConcatOrder(ArrayList<SelectOrderBy> orderBy) { public void setOrderByList(ArrayList<SelectOrderBy> orderByList) {
this.groupConcatOrderList = orderBy; this.orderByList = orderByList;
}
/**
* Set the order for ARRAY_AGG() aggregate.
*
* @param orderBy the order by list
*/
public void setArrayAggOrder(ArrayList<SelectOrderBy> orderBy) {
this.arrayAggOrderList = orderBy;
} }
/** /**
...@@ -255,12 +244,12 @@ public class Aggregate extends Expression { ...@@ -255,12 +244,12 @@ public class Aggregate extends Expression {
this.filterCondition = filterCondition; this.filterCondition = filterCondition;
} }
private SortOrder initOrder(ArrayList<SelectOrderBy> orderList, Session session) { private SortOrder initOrder(Session session) {
int size = orderList.size(); int size = orderByList.size();
int[] index = new int[size]; int[] index = new int[size];
int[] sortType = new int[size]; int[] sortType = new int[size];
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
SelectOrderBy o = orderList.get(i); SelectOrderBy o = orderByList.get(i);
index[i] = i + 1; index[i] = i + 1;
int order = o.descending ? SortOrder.DESCENDING : SortOrder.ASCENDING; int order = o.descending ? SortOrder.DESCENDING : SortOrder.ASCENDING;
sortType[i] = order; sortType[i] = order;
...@@ -296,12 +285,12 @@ public class Aggregate extends Expression { ...@@ -296,12 +285,12 @@ public class Aggregate extends Expression {
if (type == AggregateType.GROUP_CONCAT) { if (type == AggregateType.GROUP_CONCAT) {
if (v != ValueNull.INSTANCE) { if (v != ValueNull.INSTANCE) {
v = v.convertTo(Value.STRING); v = v.convertTo(Value.STRING);
if (groupConcatOrderList != null) { if (orderByList != null) {
int size = groupConcatOrderList.size(); int size = orderByList.size();
Value[] array = new Value[1 + size]; Value[] array = new Value[1 + size];
array[0] = v; array[0] = v;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
SelectOrderBy o = groupConcatOrderList.get(i); SelectOrderBy o = orderByList.get(i);
array[i + 1] = o.expression.getValue(session); array[i + 1] = o.expression.getValue(session);
} }
v = ValueArray.get(array); v = ValueArray.get(array);
...@@ -310,12 +299,12 @@ public class Aggregate extends Expression { ...@@ -310,12 +299,12 @@ public class Aggregate extends Expression {
} }
if (type == AggregateType.ARRAY_AGG) { if (type == AggregateType.ARRAY_AGG) {
if (v != ValueNull.INSTANCE) { if (v != ValueNull.INSTANCE) {
if (arrayAggOrderList != null) { if (orderByList != null) {
int size = arrayAggOrderList.size(); int size = orderByList.size();
Value[] array = new Value[1 + size]; Value[] array = new Value[1 + size];
array[0] = v; array[0] = v;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
SelectOrderBy o = arrayAggOrderList.get(i); SelectOrderBy o = orderByList.get(i);
array[i + 1] = o.expression.getValue(session); array[i + 1] = o.expression.getValue(session);
} }
v = ValueArray.get(array); v = ValueArray.get(array);
...@@ -377,8 +366,8 @@ public class Aggregate extends Expression { ...@@ -377,8 +366,8 @@ public class Aggregate extends Expression {
if (list == null || list.isEmpty()) { if (list == null || list.isEmpty()) {
return ValueNull.INSTANCE; return ValueNull.INSTANCE;
} }
if (groupConcatOrderList != null) { if (orderByList != null) {
final SortOrder sortOrder = groupConcatSort; final SortOrder sortOrder = orderBySort;
Collections.sort(list, new Comparator<Value>() { Collections.sort(list, new Comparator<Value>() {
@Override @Override
public int compare(Value v1, Value v2) { public int compare(Value v1, Value v2) {
...@@ -412,8 +401,8 @@ public class Aggregate extends Expression { ...@@ -412,8 +401,8 @@ public class Aggregate extends Expression {
if (list == null || list.isEmpty()) { if (list == null || list.isEmpty()) {
return ValueNull.INSTANCE; return ValueNull.INSTANCE;
} }
if (arrayAggOrderList != null) { if (orderByList != null) {
final SortOrder sortOrder = arrayOrderSort; final SortOrder sortOrder = orderBySort;
Collections.sort(list, new Comparator<Value>() { Collections.sort(list, new Comparator<Value>() {
@Override @Override
public int compare(Value v1, Value v2) { public int compare(Value v1, Value v2) {
...@@ -438,13 +427,8 @@ public class Aggregate extends Expression { ...@@ -438,13 +427,8 @@ public class Aggregate extends Expression {
if (on != null) { if (on != null) {
on.mapColumns(resolver, level); on.mapColumns(resolver, level);
} }
if (groupConcatOrderList != null) { if (orderByList != null) {
for (SelectOrderBy o : groupConcatOrderList) { for (SelectOrderBy o : orderByList) {
o.expression.mapColumns(resolver, level);
}
}
if (arrayAggOrderList != null) {
for (SelectOrderBy o : arrayAggOrderList) {
o.expression.mapColumns(resolver, level); o.expression.mapColumns(resolver, level);
} }
} }
...@@ -465,17 +449,11 @@ public class Aggregate extends Expression { ...@@ -465,17 +449,11 @@ public class Aggregate extends Expression {
precision = on.getPrecision(); precision = on.getPrecision();
displaySize = on.getDisplaySize(); displaySize = on.getDisplaySize();
} }
if (groupConcatOrderList != null) { if (orderByList != null) {
for (SelectOrderBy o : groupConcatOrderList) { for (SelectOrderBy o : orderByList) {
o.expression = o.expression.optimize(session); o.expression = o.expression.optimize(session);
} }
groupConcatSort = initOrder(groupConcatOrderList, session); orderBySort = initOrder(session);
}
if (arrayAggOrderList != null) {
for (SelectOrderBy o : arrayAggOrderList) {
o.expression = o.expression.optimize(session);
}
arrayOrderSort = initOrder(arrayAggOrderList, session);
} }
if (groupConcatSeparator != null) { if (groupConcatSeparator != null) {
groupConcatSeparator = groupConcatSeparator.optimize(session); groupConcatSeparator = groupConcatSeparator.optimize(session);
...@@ -564,13 +542,8 @@ public class Aggregate extends Expression { ...@@ -564,13 +542,8 @@ public class Aggregate extends Expression {
if (on != null) { if (on != null) {
on.setEvaluatable(tableFilter, b); on.setEvaluatable(tableFilter, b);
} }
if (groupConcatOrderList != null) { if (orderByList != null) {
for (SelectOrderBy o : groupConcatOrderList) { for (SelectOrderBy o : orderByList) {
o.expression.setEvaluatable(tableFilter, b);
}
}
if (arrayAggOrderList != null) {
for (SelectOrderBy o : arrayAggOrderList) {
o.expression.setEvaluatable(tableFilter, b); o.expression.setEvaluatable(tableFilter, b);
} }
} }
...@@ -603,9 +576,9 @@ public class Aggregate extends Expression { ...@@ -603,9 +576,9 @@ public class Aggregate extends Expression {
buff.append("DISTINCT "); buff.append("DISTINCT ");
} }
buff.append(on.getSQL()); buff.append(on.getSQL());
if (groupConcatOrderList != null) { if (orderByList != null) {
buff.append(" ORDER BY "); buff.append(" ORDER BY ");
for (SelectOrderBy o : groupConcatOrderList) { for (SelectOrderBy o : orderByList) {
buff.appendExceptFirst(", "); buff.appendExceptFirst(", ");
buff.append(o.expression.getSQL()); buff.append(o.expression.getSQL());
if (o.descending) { if (o.descending) {
...@@ -629,9 +602,9 @@ public class Aggregate extends Expression { ...@@ -629,9 +602,9 @@ public class Aggregate extends Expression {
buff.append("DISTINCT "); buff.append("DISTINCT ");
} }
buff.append(on.getSQL()); buff.append(on.getSQL());
if (arrayAggOrderList != null) { if (orderByList != null) {
buff.append(" ORDER BY "); buff.append(" ORDER BY ");
for (SelectOrderBy o : arrayAggOrderList) { for (SelectOrderBy o : orderByList) {
buff.appendExceptFirst(", "); buff.appendExceptFirst(", ");
buff.append(o.expression.getSQL()); buff.append(o.expression.getSQL());
if (o.descending) { if (o.descending) {
...@@ -765,15 +738,8 @@ public class Aggregate extends Expression { ...@@ -765,15 +738,8 @@ public class Aggregate extends Expression {
!groupConcatSeparator.isEverything(visitor)) { !groupConcatSeparator.isEverything(visitor)) {
return false; return false;
} }
if (groupConcatOrderList != null) { if (orderByList != null) {
for (SelectOrderBy o : groupConcatOrderList) { for (SelectOrderBy o : orderByList) {
if (!o.expression.isEverything(visitor)) {
return false;
}
}
}
if (arrayAggOrderList != null) {
for (SelectOrderBy o : arrayAggOrderList) {
if (!o.expression.isEverything(visitor)) { if (!o.expression.isEverything(visitor)) {
return false; return false;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论