![Stefano Mazzocchi](/assets/img/avatar_default.png)
git-svn-id: http://google-refine.googlecode.com/svn/branches/split-refactor@905 7d457c2a-affb-35e4-300a-418c747d4874
90 lines
3.2 KiB
Java
90 lines
3.2 KiB
Java
package com.metaweb.gridworks.gel.ast;
|
|
|
|
import java.util.Properties;
|
|
|
|
import com.metaweb.gridworks.expr.Evaluable;
|
|
import com.metaweb.gridworks.expr.ExpressionUtils;
|
|
|
|
/**
|
|
* An abstract syntax tree node encapsulating an operator call, such as "+".
|
|
*/
|
|
public class OperatorCallExpr implements Evaluable {
|
|
final protected Evaluable[] _args;
|
|
final protected String _op;
|
|
|
|
public OperatorCallExpr(Evaluable[] args, String op) {
|
|
_args = args;
|
|
_op = op;
|
|
}
|
|
|
|
public Object evaluate(Properties bindings) {
|
|
Object[] args = new Object[_args.length];
|
|
for (int i = 0; i < _args.length; i++) {
|
|
Object v = _args[i].evaluate(bindings);
|
|
if (ExpressionUtils.isError(v)) {
|
|
return v;
|
|
}
|
|
args[i] = v;
|
|
}
|
|
|
|
if (args.length == 2) {
|
|
if (args[0] != null && args[1] != null) {
|
|
if (args[0] instanceof Number && args[1] instanceof Number) {
|
|
if ("+".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() + ((Number) args[1]).doubleValue();
|
|
} else if ("-".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() - ((Number) args[1]).doubleValue();
|
|
} else if ("*".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() * ((Number) args[1]).doubleValue();
|
|
} else if ("/".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() / ((Number) args[1]).doubleValue();
|
|
} else if (">".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() > ((Number) args[1]).doubleValue();
|
|
} else if (">=".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() >= ((Number) args[1]).doubleValue();
|
|
} else if ("<".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() < ((Number) args[1]).doubleValue();
|
|
} else if ("<=".equals(_op)) {
|
|
return ((Number) args[0]).doubleValue() <= ((Number) args[1]).doubleValue();
|
|
}
|
|
}
|
|
|
|
if ("+".equals(_op)) {
|
|
return args[0].toString() + args[1].toString();
|
|
}
|
|
}
|
|
|
|
if ("==".equals(_op)) {
|
|
if (args[0] != null) {
|
|
return args[0].equals(args[1]);
|
|
} else {
|
|
return args[1] == null;
|
|
}
|
|
} else if ("!=".equals(_op)) {
|
|
if (args[0] != null) {
|
|
return !args[0].equals(args[1]);
|
|
} else {
|
|
return args[1] != null;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
for (Evaluable ev : _args) {
|
|
if (sb.length() > 0) {
|
|
sb.append(' ');
|
|
sb.append(_op);
|
|
sb.append(' ');
|
|
}
|
|
sb.append(ev.toString());
|
|
}
|
|
|
|
return sb.toString();
|
|
}
|
|
}
|