package railo.intergral.fusiondebug.server.type.qry;
import java.util.ArrayList;
import java.util.List;
import railo.intergral.fusiondebug.server.type.FDValueNotMutability;
import railo.intergral.fusiondebug.server.type.FDVariable;
import railo.intergral.fusiondebug.server.type.simple.FDSimpleVariable;
import railo.runtime.op.Caster;
import railo.runtime.type.Query;
import com.intergral.fusiondebug.server.IFDStackFrame;
public class FDQuery extends FDValueNotMutability {
private static final int INTERVAL = 10;
private ArrayList children=new ArrayList();
private Query qry;
public FDQuery(IFDStackFrame frame,Query qry){
this.qry=qry;
// columns
String[] strColumns = qry.getColumns();
List lstColumns=new ArrayList();
String type;
for(int i=0;i<strColumns.length;i++){
type=qry.getColumn(strColumns[i],null).getTypeAsString();
//else type="";
lstColumns.add(new FDSimpleVariable(frame,strColumns[i],type,null));
}
children.add(new FDSimpleVariable(frame,"Columns",Caster.toString(strColumns.length),lstColumns));
// rows
int rowcount=qry.getRowCount();
List lstRows=new ArrayList();//,values;
fill(frame,qry,lstRows,1,rowcount-1,strColumns);
children.add(new FDSimpleVariable(frame,"Rows",Caster.toString(rowcount),lstRows));
}
private static void fill(IFDStackFrame frame, Query qry, List lstRows, int start,int len, String[] strColumns) {
int to=start+len;
int interval = INTERVAL;
while(interval*interval<len)
interval*=interval;
if(len>interval){
int max;
for(int i=start;i<to;i+=interval) {
max=(i+interval)<to?(interval-1):to-i;
ArrayList group=new ArrayList();
lstRows.add(new FDSimpleVariable(frame,"Rows","["+i+"-"+((i+max))+"]",group));
fill(frame, qry, group, i, max, strColumns);
}
}
else {
ArrayList values;
for(int r=start;r<=to;r++){
values=new ArrayList();
for(int c=0;c<strColumns.length;c++){
values.add(new FDVariable(frame,strColumns[c],new FDQueryNode(frame,qry,r,strColumns[c])));
}
lstRows.add(new FDSimpleVariable(frame,"Row","["+r+"]",values));
}
}
}
@Override
public List getChildren() {
return children;
}
@Override
public boolean hasChildren() {
return true;
}
@Override
public String toString() {
return "Query(Columns:"+qry.getColumns().length+", Rows:"+qry.getRecordcount()+")";
}
}