001    package railo.intergral.fusiondebug.server.type.qry;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    
006    import railo.intergral.fusiondebug.server.type.FDValueNotMutability;
007    import railo.intergral.fusiondebug.server.type.FDVariable;
008    import railo.intergral.fusiondebug.server.type.simple.FDSimpleVariable;
009    import railo.runtime.op.Caster;
010    import railo.runtime.type.Query;
011    
012    import com.intergral.fusiondebug.server.IFDStackFrame;
013    
014    public class FDQuery extends FDValueNotMutability {
015    
016            private static final int INTERVALL = 10;
017            private ArrayList children=new ArrayList();
018            private Query qry;
019            
020            public FDQuery(IFDStackFrame frame,Query qry){
021                    this.qry=qry;
022                    
023                    // columns
024                    String[] strColumns = qry.getColumns();
025                    List lstColumns=new ArrayList();
026                    String type;
027                    for(int i=0;i<strColumns.length;i++){
028                            type=qry.getColumn(strColumns[i],null).getTypeAsString();
029                            //else type="";
030                            lstColumns.add(new FDSimpleVariable(frame,strColumns[i],type,null));
031                    }
032                    children.add(new FDSimpleVariable(frame,"Columns",Caster.toString(strColumns.length),lstColumns));
033                    
034                    // rows
035                    int rowcount=qry.getRowCount();
036                    List lstRows=new ArrayList();//,values;
037                    fill(frame,qry,lstRows,1,rowcount-1,strColumns);
038                    children.add(new FDSimpleVariable(frame,"Rows",Caster.toString(rowcount),lstRows));
039            }
040            
041            private static void fill(IFDStackFrame frame, Query qry, List lstRows, int start,int len, String[] strColumns) {
042                    int to=start+len;
043                    int intervall = INTERVALL;
044                    while(intervall*intervall<len)
045                            intervall*=intervall;
046                    if(len>intervall){
047                            int max;
048                            for(int i=start;i<to;i+=intervall)   {
049                                    max=(i+intervall)<to?(intervall-1):to-i;
050                                    ArrayList group=new ArrayList();
051                                    lstRows.add(new FDSimpleVariable(frame,"Rows","["+i+"-"+((i+max))+"]",group));
052                                    fill(frame, qry, group, i, max, strColumns);
053                            }
054                    }
055                    else {
056                            ArrayList values;
057                            for(int r=start;r<=to;r++){
058                                    values=new ArrayList();
059                                    for(int c=0;c<strColumns.length;c++){
060                                            values.add(new FDVariable(frame,strColumns[c],new FDQueryNode(frame,qry,r,strColumns[c])));
061                                    }
062                                    lstRows.add(new FDSimpleVariable(frame,"Row","["+r+"]",values));
063                            }
064                    }
065            }
066    
067    
068            @Override
069            public List getChildren() {
070                    return children;
071            }
072    
073            @Override
074            public boolean hasChildren() {
075                    return true;
076            }
077            
078            @Override
079            public String toString() {
080                    return "Query(Columns:"+qry.getColumns().length+", Rows:"+qry.getRecordcount()+")";
081            }
082    
083    }