org.h2.expression.ExpressionList Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of h2 Show documentation
Show all versions of h2 Show documentation
base on h2database 1.4.196. for more information, see http://h2database.com/
/*
* Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.expression;
import org.h2.engine.Session;
import org.h2.table.Column;
import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter;
import org.h2.util.StatementBuilder;
import org.h2.value.Value;
import org.h2.value.ValueArray;
/**
* A list of expressions, as in (ID, NAME).
* The result of this expression is an array.
*/
public class ExpressionList extends Expression {
private final Expression[] list;
public ExpressionList(Expression[] list) {
this.list = list;
}
@Override
public Value getValue(Session session) {
Value[] v = new Value[list.length];
for (int i = 0; i < list.length; i++) {
v[i] = list[i].getValue(session);
}
return ValueArray.get(v);
}
@Override
public int getType() {
return Value.ARRAY;
}
@Override
public void mapColumns(ColumnResolver resolver, int level) {
for (Expression e : list) {
e.mapColumns(resolver, level);
}
}
@Override
public Expression optimize(Session session) {
boolean allConst = true;
for (int i = 0; i < list.length; i++) {
Expression e = list[i].optimize(session);
if (!e.isConstant()) {
allConst = false;
}
list[i] = e;
}
if (allConst) {
return ValueExpression.get(getValue(session));
}
return this;
}
@Override
public void setEvaluatable(TableFilter tableFilter, boolean b) {
for (Expression e : list) {
e.setEvaluatable(tableFilter, b);
}
}
@Override
public int getScale() {
return 0;
}
@Override
public long getPrecision() {
return Integer.MAX_VALUE;
}
@Override
public int getDisplaySize() {
return Integer.MAX_VALUE;
}
@Override
public String getSQL() {
StatementBuilder buff = new StatementBuilder("(");
for (Expression e: list) {
buff.appendExceptFirst(", ");
buff.append(e.getSQL());
}
if (list.length == 1) {
buff.append(',');
}
return buff.append(')').toString();
}
@Override
public void updateAggregate(Session session) {
for (Expression e : list) {
e.updateAggregate(session);
}
}
@Override
public boolean isEverything(ExpressionVisitor visitor) {
for (Expression e : list) {
if (!e.isEverything(visitor)) {
return false;
}
}
return true;
}
@Override
public int getCost() {
int cost = 1;
for (Expression e : list) {
cost += e.getCost();
}
return cost;
}
@Override
public Expression[] getExpressionColumns(Session session) {
ExpressionColumn[] expr = new ExpressionColumn[list.length];
for (int i = 0; i < list.length; i++) {
Expression e = list[i];
Column col = new Column("C" + (i + 1),
e.getType(), e.getPrecision(), e.getScale(),
e.getDisplaySize());
expr[i] = new ExpressionColumn(session.getDatabase(), col);
}
return expr;
}
}