next up previous contents
Next: The Two Subclasses of Up: Refactoring Example Previous: Refactoring Switch Statement

Replace Parameter with Query

  public synchronized Data[] query(Kriterium krit) throws RemoteException{
    boolean[] isPartOfQuery=new boolean[krit.getAttributesCount()];
...
      String select=createSelect(krit, isPartOfQuery);
...
}
// the following method was extracted from query()
    protected String createSelect(Kriterium krit, boolean[] isPartOfQuery) {
      String select = "";
      Debug.dbg("DBServerImpl.query("+krit.getName()+")");
      DataDescriptor dd=krit.getDescriptor();
      Vector selectVector=new Vector();
      Vector fromTableVector=new Vector();
      Constraint c=null;

      for(int i=0;i<dd.getTables().length;i++)
        fromTableVector.addElement(dd.getTables()[i]);

      for (int i= 0; i < krit.getAttributesCount(); i++) {
        isPartOfQuery[i]=false;
        c=dd.getConstraint(i);
        if  (c.getTable() == null) continue;

        if (c.getType() == DataDescriptor.REF || c.getType() == DataDescriptor.BACKREF) {
          if(dd.getDBTable(i, true) !=null && dd.getDBTable(i, false) !=null ){
            // nur Tabellen nehmen, deren Spalten selektiert werden
            if(fromTableVector.indexOf(dd.getDBTable(i, true)) != -1 && 
               fromTableVector.indexOf(dd.getDBTable(i, false)) != -1){

              selectVector.addElement(dd.getDBTable(i, false) + "." + 
                                      dd.getAttributeName(i));
              select+=((select.length()>0)?", ":" ")+dd.getDBTable(i, false) + 
                      "." + dd.getAttributeName(i);
              isPartOfQuery[i]=true;
            }
          }

        } else {
          selectVector.addElement(dd.getDBTable(i, false) + "." + dd.getAttributeName(i));
          select+=((select.length()>0)?", ":" ")+dd.getDBTable(i, false) + 
                  "." + dd.getAttributeName(i);
          isPartOfQuery[i]=true;
        }
      }
      return select;
    }

// this heavyweight was refactored by using only ReplaceParameterWithMethod(292)
// this is a lightweight that was later moved to DatabaseFormat which
// deals only with the names of fields

    protected String createSelect(Kriterium krit) {
      boolean[] isPartOfQuery=isPartOfQuery(krit);
      StringBuffer select = null;
      Debug.dbg("DBServerImpl.query("+krit.getName()+")");
      DataDescriptor dd=krit.getDescriptor();
      String qualifiedName;

      for (int i= 0; i < krit.getAttributesCount(); i++) {
          if (isPartOfQuery[i]) {
              qualifiedName=
                  databaseFormat.createQualifiedName(
                     null,dd.getDBTable(i, false),  dd.getAttributeName(i));
            select=databaseFormat.concatExpressions(select,",",qualifiedName);
          }
      }
      return databaseFormat.notNullString(select);
    }

// this is also a lightweight that was later moved to DatabaseFormat
// it doesn't care about creating a select string but rather marks the fields
// necessary for the select

    protected boolean[] isPartOfQuery(Kriterium krit) {
      boolean[] isPartOfQuery=new boolean[krit.getAttributesCount()];
      DataDescriptor dd=krit.getDescriptor();
      Vector fromTableVector=new Vector();
      String table, reftable;
      Constraint c=null;

      for(int i=0;i<dd.getTables().length;i++)
        fromTableVector.addElement(dd.getTables()[i]);

      for (int i= 0; i < krit.getAttributesCount(); i++) {
        isPartOfQuery[i]=false;
        c=dd.getConstraint(i);
        if  (c.getTable() == null) continue;

        table=dd.getDBTable(i, false);
        reftable=dd.getDBTable(i, true);

        if (c.getType() == DataDescriptor.REF 
            || c.getType() == DataDescriptor.BACKREF) {

            // nur korrekte Referenzen nutzen
            if(reftable !=null && table !=null ){

            // nur Tabellen nehmen, deren Spalten selektiert werden
            if(fromTableVector.indexOf(reftable) != -1 && 
               fromTableVector.indexOf(table) != -1){

              isPartOfQuery[i]=true;
            }
          }

        } else isPartOfQuery[i]=true;
      }
      return isPartOfQuery;
    }

 


next up previous contents
Next: The Two Subclasses of Up: Refactoring Example Previous: Refactoring Switch Statement

Michael Hunger
Mit Okt 25 00:48:16 MEST 2000