aggregate.java
来自「非常棒的java数据库」· Java 代码 · 共 482 行 · 第 1/2 页
JAVA
482 行
if (on != null) {
on.mapColumns(resolver, level);
}
if (orderList != null) {
for (int i = 0; i < orderList.size(); i++) {
SelectOrderBy o = (SelectOrderBy) orderList.get(i);
o.expression.mapColumns(resolver, level);
}
}
if (separator != null) {
separator.mapColumns(resolver, level);
}
}
public Expression optimize(Session session) throws SQLException {
if (on != null) {
on = on.optimize(session);
dataType = on.getType();
scale = on.getScale();
precision = on.getPrecision();
displaySize = on.getDisplaySize();
}
if (orderList != null) {
for (int i = 0; i < orderList.size(); i++) {
SelectOrderBy o = (SelectOrderBy) orderList.get(i);
o.expression = o.expression.optimize(session);
}
sort = initOrder(session);
}
if (separator != null) {
separator = separator.optimize(session);
}
switch (type) {
case GROUP_CONCAT:
dataType = Value.STRING;
scale = 0;
precision = Integer.MAX_VALUE;
displaySize = Integer.MAX_VALUE;
break;
case COUNT_ALL:
case COUNT:
dataType = Value.LONG;
scale = 0;
precision = ValueLong.PRECISION;
displaySize = ValueLong.DISPLAY_SIZE;
break;
case SELECTIVITY:
dataType = Value.INT;
scale = 0;
precision = ValueInt.PRECISION;
displaySize = ValueInt.DISPLAY_SIZE;
break;
case SUM:
case AVG:
if (!DataType.supportsAdd(dataType)) {
throw Message.getSQLException(ErrorCode.SUM_OR_AVG_ON_WRONG_DATATYPE_1, getSQL());
}
break;
case MIN:
case MAX:
break;
case STDDEV_POP:
case STDDEV_SAMP:
case VAR_POP:
case VAR_SAMP:
dataType = Value.DOUBLE;
precision = ValueDouble.PRECISION;
displaySize = ValueDouble.DISPLAY_SIZE;
scale = 0;
break;
case EVERY:
case SOME:
dataType = Value.BOOLEAN;
precision = ValueBoolean.PRECISION;
displaySize = ValueBoolean.DISPLAY_SIZE;
scale = 0;
break;
default:
throw Message.getInternalError("type=" + type);
}
return this;
}
public void setEvaluatable(TableFilter tableFilter, boolean b) {
if (on != null) {
on.setEvaluatable(tableFilter, b);
}
if (orderList != null) {
for (int i = 0; i < orderList.size(); i++) {
SelectOrderBy o = (SelectOrderBy) orderList.get(i);
o.expression.setEvaluatable(tableFilter, b);
}
}
if (separator != null) {
separator.setEvaluatable(tableFilter, b);
}
}
public int getScale() {
return scale;
}
public long getPrecision() {
return precision;
}
public int getDisplaySize() {
return displaySize;
}
public String getSQL() {
String text;
switch (type) {
case GROUP_CONCAT: {
StringBuffer buff = new StringBuffer();
buff.append("GROUP_CONCAT(");
buff.append(on.getSQL());
if (orderList != null) {
buff.append(" ORDER BY ");
for (int i = 0; i < orderList.size(); i++) {
SelectOrderBy o = (SelectOrderBy) orderList.get(i);
if (i > 0) {
buff.append(", ");
}
buff.append(o.expression.getSQL());
if (o.descending) {
buff.append(" DESC");
}
}
}
if (separator != null) {
buff.append(" SEPARATOR ");
buff.append(separator.getSQL());
}
buff.append(")");
return buff.toString();
}
case COUNT_ALL:
return "COUNT(*)";
case COUNT:
text = "COUNT";
break;
case SELECTIVITY:
text = "SELECTIVITY";
break;
case SUM:
text = "SUM";
break;
case MIN:
text = "MIN";
break;
case MAX:
text = "MAX";
break;
case AVG:
text = "AVG";
break;
case STDDEV_POP:
text = "STDDEV_POP";
break;
case STDDEV_SAMP:
text = "STDDEV_SAMP";
break;
case VAR_POP:
text = "VAR_POP";
break;
case VAR_SAMP:
text = "VAR_SAMP";
break;
case EVERY:
text = "EVERY";
break;
case SOME:
text = "SOME";
break;
default:
throw Message.getInternalError("type=" + type);
}
if (distinct) {
return text + "(DISTINCT " + on.getSQL() + ")";
} else {
return text + StringUtils.enclose(on.getSQL());
}
}
public int getAggregateType() {
return type;
}
private Index getColumnIndex(boolean first) {
if (on instanceof ExpressionColumn) {
ExpressionColumn col = (ExpressionColumn) on;
Column column = col.getColumn();
TableFilter filter = col.getTableFilter();
if (filter != null) {
Table table = filter.getTable();
Index index = table.getIndexForColumn(column, first);
return index;
}
}
return null;
}
public boolean isEverything(ExpressionVisitor visitor) {
if (visitor.type == ExpressionVisitor.OPTIMIZABLE_MIN_MAX_COUNT_ALL) {
switch (type) {
case COUNT_ALL:
return visitor.table.canGetRowCount();
case MIN:
case MAX:
if (!SysProperties.OPTIMIZE_MIN_MAX) {
return false;
}
boolean first = type == MIN;
Index index = getColumnIndex(first);
return index != null;
default:
return false;
}
}
if (on != null && !on.isEverything(visitor)) {
return false;
}
if (separator != null && !separator.isEverything(visitor)) {
return false;
}
for (int i = 0; orderList != null && i < orderList.size(); i++) {
SelectOrderBy o = (SelectOrderBy) orderList.get(i);
if (!o.expression.isEverything(visitor)) {
return false;
}
}
return true;
}
public int getCost() {
return (on == null) ? 1 : on.getCost() + 1;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?