package water.rapids.ast.prims.assign;
import water.H2O;
import water.fvec.Frame;
import water.fvec.Vec;
import water.rapids.Env;
import water.rapids.Val;
import water.rapids.vals.ValFrame;
import water.rapids.ast.AstPrimitive;
import water.rapids.ast.AstRoot;
/**
*/
public class AstAppend extends AstPrimitive {
@Override
public String[] args() {
return new String[]{"dst", "src", "colName"};
}
@Override
public int nargs() {
return 1 + 3;
} // (append dst src "colName")
@Override
public String str() {
return "append";
}
@Override
public ValFrame apply(Env env, Env.StackHelp stk, AstRoot asts[]) {
Frame dst = stk.track(asts[1].exec(env)).getFrame();
Val vsrc = stk.track(asts[2].exec(env));
String newColName = asts[3].exec(env).getStr();
Vec vec = dst.anyVec();
switch (vsrc.type()) {
case Val.NUM:
vec = vec.makeCon(vsrc.getNum());
break;
case Val.STR:
throw H2O.unimpl();
case Val.FRM:
if (vsrc.getFrame().numCols() != 1) throw new IllegalArgumentException("Can only append one column");
vec = vsrc.getFrame().anyVec();
break;
default:
throw new IllegalArgumentException("Source must be a Frame or Number, but found a " + vsrc.getClass());
}
dst = new Frame(dst._names.clone(), dst.vecs().clone());
dst.add(newColName, vec);
return new ValFrame(dst);
}
}