package water.rapids.ast.prims.time; import org.joda.time.MutableDateTime; import water.MRTask; import water.fvec.Chunk; import water.fvec.Frame; import water.fvec.NewChunk; import water.fvec.Vec; import water.rapids.Env; import water.rapids.Val; import water.rapids.vals.ValFrame; import water.rapids.vals.ValNum; import water.rapids.ast.AstExec; import water.rapids.ast.AstPrimitive; import water.rapids.ast.AstRoot; import water.rapids.ast.params.AstId; /** * Convert year, month, day, hour, minute, sec, msec to Unix epoch time */ @Deprecated // Use {@link AstMoment} instead public class AstMktime extends AstPrimitive { @Override public String[] args() { return new String[]{"yr", "mo", "dy", "hr", "mi", "se", "ms"}; } /** * (mktime yr mo dy hr mi se ms) */ @Override public int nargs() { return 1 + 7; } @Override public String str() { return "mktime"; } @Override public Val apply(Env env, Env.StackHelp stk, AstRoot asts[]) { // Seven args, all required. See if any are arrays. Frame fs[] = new Frame[nargs() - 1]; int is[] = new int[nargs() - 1]; Frame x = null; // Sample frame (for auto-expanding constants) for (int i = 1; i < nargs(); i++) if (asts[i] instanceof AstId || asts[i] instanceof AstExec) fs[i - 1] = x = stk.track(asts[i].exec(env)).getFrame(); else is[i - 1] = (int) asts[i].exec(env).getNum(); if (x == null) { // Single point long msec = new MutableDateTime( is[0], // year is[1] + 1, // month is[2] + 1, // day is[3], // hour is[4], // minute is[5], // second is[6]) // msec .getMillis(); return new ValNum(msec); } // Make constant Vecs for the constant args. Commonly, they'll all be zero Vec vecs[] = new Vec[7]; for (int i = 0; i < 7; i++) { if (fs[i] == null) { vecs[i] = x.anyVec().makeCon(is[i]); } else { if (fs[i].numCols() != 1) throw new IllegalArgumentException("Expect single column"); vecs[i] = fs[i].anyVec(); } } // Convert whole column to epoch msec Frame fr2 = new MRTask() { @Override public void map(Chunk chks[], NewChunk nchks[]) { MutableDateTime dt = new MutableDateTime(0); NewChunk n = nchks[0]; int rlen = chks[0]._len; for (int r = 0; r < rlen; r++) { dt.setDateTime( (int) chks[0].at8(r), // year (int) chks[1].at8(r) + 1,// month (int) chks[2].at8(r) + 1,// day (int) chks[3].at8(r), // hour (int) chks[4].at8(r), // minute (int) chks[5].at8(r), // second (int) chks[6].at8(r)); // msec n.addNum(dt.getMillis()); } } }.doAll(new byte[]{Vec.T_NUM}, vecs).outputFrame(new String[]{"msec"}, null); // Clean up the constants for (int i = 0; i < nargs() - 1; i++) if (fs[i] == null) vecs[i].remove(); return new ValFrame(fr2); } }