package water.rapids.transforms; import water.H2O; import water.fvec.Frame; import water.rapids.ast.AstExec; import water.rapids.ast.AstRoot; import water.rapids.ast.params.AstId; import water.rapids.ast.params.AstStr; import java.util.HashMap; @SuppressWarnings("unused") // called thru reflection public class H2OBinaryOp extends H2OColOp { boolean _leftIsCol; boolean _riteIsCol; String _binCol; // !=null only if _leftIsCol || _riteIsCol private static final HashMap<String,String> binaryOps = new HashMap<>(); static { binaryOps.put("+", "plus"); binaryOps.put("-", "minus"); binaryOps.put("*", "multiply"); binaryOps.put("/", "divide"); binaryOps.put("<", "lessThan"); binaryOps.put("<=","lessThanEquals"); binaryOps.put(">", "greaterThan"); binaryOps.put(">=","greaterThanEquals"); binaryOps.put("==", "equals"); binaryOps.put("!=", "notEquals"); } public H2OBinaryOp(String name, String ast, boolean inplace, String[] newNames) { super(name, ast, inplace, newNames); } @Override protected void setupParamsImpl(int i, String[] args) { if( _ast._asts[i+1] instanceof AstExec) { if( !isBinaryOp(_fun) ) throw H2O.unimpl("unimpl: " + lookup(_fun)); _leftIsCol = args[i].equals("leftArg"); _riteIsCol = !_leftIsCol; _binCol = ((AstExec)_ast._asts[i+1])._asts[2].str(); _params.put(args[i], new AstStr(((AstExec) _ast._asts[i + 1])._asts[2].str())); } else super.setupParamsImpl(i,args); } @Override protected Frame transformImpl(Frame f) { if( paramIsRow() ) ((AstExec)_ast._asts[2])._asts[1] = new AstId(f); return super.transformImpl(f); } @Override protected String lookup(String op) { return binaryOps.get(op)==null?op:binaryOps.get(op); } @Override protected boolean paramIsRow() { return _leftIsCol || _riteIsCol; } @Override protected String addRowParam() { return " _params.put(\""+ (_leftIsCol?"leftArg":"rightArg") + "\", " + "new String[]{String.valueOf(row.get(\"" +_binCol+ "\"))}); // write over the previous value\n"; } private static boolean isBinaryOp(String op) { return binaryOps.get(op)!=null; } }