package water.rapids.ast.prims.mungers; import water.Futures; import water.Key; import water.fvec.AppendableVec; import water.fvec.Frame; import water.fvec.NewChunk; import water.fvec.Vec; import water.rapids.Env; import water.rapids.vals.ValFrame; import water.rapids.ast.AstPrimitive; import water.rapids.ast.AstRoot; /** */ public class AstLevels extends AstPrimitive { @Override public String[] args() { return new String[]{"ary"}; } @Override public int nargs() { return 1 + 1; } // (levels x) @Override public String str() { return "levels"; } @Override public ValFrame apply(Env env, Env.StackHelp stk, AstRoot asts[]) { Frame f = stk.track(asts[1].exec(env)).getFrame(); Futures fs = new Futures(); Key[] keys = Vec.VectorGroup.VG_LEN1.addVecs(f.numCols()); Vec[] vecs = new Vec[keys.length]; // compute the longest vec... that's the one with the most domain levels int max = 0; for (int i = 0; i < f.numCols(); ++i) if (f.vec(i).isCategorical()) if (max < f.vec(i).domain().length) max = f.vec(i).domain().length; final int rowLayout = Vec.ESPC.rowLayout(keys[0], new long[]{0, max}); for (int i = 0; i < f.numCols(); ++i) { AppendableVec v = new AppendableVec(keys[i], Vec.T_NUM); NewChunk nc = new NewChunk(v, 0); String[] dom = f.vec(i).domain(); int numToPad = dom == null ? max : max - dom.length; if (dom != null) for (int j = 0; j < dom.length; ++j) nc.addNum(j); for (int j = 0; j < numToPad; ++j) nc.addNA(); nc.close(0, fs); vecs[i] = v.close(rowLayout, fs); vecs[i].setDomain(dom); } fs.blockForPending(); Frame fr2 = new Frame(vecs); return new ValFrame(fr2); } }