package water.api;
import hex.Summary2;
import water.*;
import water.util.Log;
import water.util.RString;
import water.fvec.*;
import water.util.Utils;
import java.util.Iterator;
/**
*
*/
public class SummaryPage2 extends Request2 {
static final int API_WEAVER=1; // This file has auto-gen'd doc & json fields
static public DocGen.FieldDoc[] DOC_FIELDS; // Initialized from Auto-Gen code.
// This Request supports the HTML 'GET' command, and this is the help text
// for GET.
static final String DOC_GET = "Returns a summary of a fluid-vec frame";
@API(help="An existing H2O Frame key.", required=true, filter=Default.class)
Frame source;
class colsFilter1 extends MultiVecSelect { public colsFilter1() { super("source");} }
@API(help = "Select columns", filter=colsFilter1.class)
int[] cols;
@API(help = "Maximum columns to show summaries of", filter = Default.class, lmin = 1)
int max_ncols = 1000;
@API(help = "Number of bins for quantile (1-10000000)", filter = Default.class, lmin = 1, lmax = 1000000)
int max_qbins = 1000;
@API(help = "Column summaries.")
Summary2[] summaries;
public static String link(Key k, String content) {
RString rs = new RString("<a href='SummaryPage2.query?source=%$key'>"+content+"</a>");
rs.replace("key", k.toString());
return rs.toString();
}
@Override protected Response serve() {
if( source == null ) return RequestServer._http404.serve();
// select all columns by default
if( cols == null ) {
cols = new int[Math.min(source.vecs().length,max_ncols)];
for(int i = 0; i < cols.length; i++) cols[i] = i;
}
Vec[] vecs = new Vec[cols.length];
String[] names = new String[cols.length];
for (int i = 0; i < cols.length; i++) {
vecs[i] = source.vecs()[cols[i]];
names[i] = source._names[cols[i]];
}
Frame fr = new Frame(names, vecs);
if(fr.numRows() == 0)
throw new IllegalArgumentException("Data frame has zero rows!");
Futures fs = new Futures();
for( Vec vec : vecs) vec.rollupStats(fs);
fs.blockForPending();
Summary2.BasicStat basicStats[] = new Summary2.PrePass().doAll(fr).finishUp()._basicStats;
summaries = new Summary2.SummaryTask2(basicStats, max_qbins).doAll(fr)._summaries;
if (summaries != null)
for (int i = 0; i < cols.length; i++)
summaries[i].finishUp(vecs[i]);
return Response.done(this);
}
@Override public boolean toHTML( StringBuilder sb ) {
sb.append("<div class=container-fluid'>");
sb.append("<div class='row-fluid'>");
sb.append("<div class='span2' style='overflow-y:scroll;height:100%;left:0;position:fixed;text-align:right;overflow-x:scroll;'><h5>Columns</h5>");
if (summaries != null && summaries.length > max_ncols)
sb.append("<div class='alert'>Too many columns were selected. "+max_ncols+" of them are shown!</div>");
StringBuilder innerPageBdr = null;
if (summaries != null) {
innerPageBdr = new StringBuilder("<div class='span10' style='float:right;height:90%;overflow-y:scroll'>");
for( int i = 0; i < Math.min(summaries.length,max_ncols); i++) {
String cname = source._names[cols[i]];
Summary2 s2 = summaries[i];
s2.toHTML(source.vecs()[cols[i]],cname,innerPageBdr);
sb.append("<div><a href='#col_" + cname + "'>" + cname + "</a></div>");
}
innerPageBdr.append("</div>");
}
sb.append("</div>");
sb.append("</div>");
if (summaries != null) sb.append(innerPageBdr);
sb.append("</div>");
return true;
}
}