/*
* Copyright 2013 Future Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.araqne.logdb.query.command;
import java.util.ArrayList;
import java.util.List;
import org.araqne.logdb.QueryCommand;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.Row;
import org.araqne.logdb.RowBatch;
import org.araqne.logdb.ThreadSafe;
import org.araqne.logdb.query.expr.Assign;
import org.araqne.logdb.query.expr.Comma;
import org.araqne.logdb.query.expr.Expression;
public class Eval extends QueryCommand implements ThreadSafe {
private static final String COMMAND = "eval";
private List<Expression> exprs;
public Eval(Expression expr) {
this(expr, 0);
}
public Eval(Expression expr, int length) {
if (expr instanceof Comma) {
Comma ce = Comma.class.cast(expr);
this.exprs = ce.getList();
} else {
this.exprs = new ArrayList<Expression>();
exprs.add(expr);
}
for (Expression exp : exprs) {
if (!(exp instanceof Assign)) {
throw new QueryParseException("20100", COMMAND.length() + 1, length - 1, null);
}
}
}
public Expression getExpression(int idx) {
return exprs.get(idx);
}
public List<Expression> getExpressions() {
return exprs;
}
@Override
public String getName() {
return COMMAND;
}
public Object update(Row m, Expression expr) {
if (!(expr instanceof Assign))
return expr.eval(m);
Assign ae = Assign.class.cast(expr);
Object ret = update(m, ae.getValueExpression());
m.put(ae.getField(), ret);
return ret;
}
@Override
public void onPush(Row m) {
for (Expression expr : exprs) {
update(m, expr);
}
pushPipe(m);
}
@Override
public void onPush(RowBatch rowBatch) {
if (rowBatch.selectedInUse) {
for (int i = 0; i < rowBatch.size; i++) {
int p = rowBatch.selected[i];
Row row = rowBatch.rows[p];
for (Expression expr : exprs) {
update(row, expr);
}
}
} else {
for (int i = 0; i < rowBatch.size; i++) {
Row row = rowBatch.rows[i];
for (Expression expr : exprs) {
update(row, expr);
}
}
}
pushPipe(rowBatch);
}
@Override
public boolean isReducer() {
return false;
}
@Override
public String toString() {
if (exprs.size() == 1 && exprs.get(0) instanceof Assign) {
// for backward compatibility
Assign a = Assign.class.cast(exprs.get(0));
return "eval " + a.getField() + "=" + a.getValueExpression();
} else {
StringBuilder sb = new StringBuilder("eval ");
boolean first = true;
for (Expression expr : exprs) {
if (!first)
sb.append(", ");
sb.append(expr);
if (first)
first = false;
}
return sb.toString();
}
}
}