User: lennart 
  Date: 01/02/06 23:12:34

  Modified:    src/main/org/jboss/ejb/plugins/jaws/jdbc
                        JDBCDefinedFinderCommand.java
  Log:
  No duplicate columns and no ASC/DESC within the SELECT clause
  when adding columns from the specified ORDER clause to the SELECT clause.
  
  Revision  Changes    Path
  1.10      +76 -9     
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCDefinedFinderCommand.java
  
  Index: JDBCDefinedFinderCommand.java
  ===================================================================
  RCS file: 
/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCDefinedFinderCommand.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCDefinedFinderCommand.java     2001/01/21 14:33:48     1.9
  +++ JDBCDefinedFinderCommand.java     2001/02/07 07:12:34     1.10
  @@ -9,6 +9,8 @@
   
   import java.util.ArrayList;
   import java.util.StringTokenizer;
  +import java.util.Set;
  +import java.util.HashSet;
   
   import java.sql.PreparedStatement;
   
  @@ -23,7 +25,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Michel de Groot</a>
  - * @version $Revision: 1.9 $
  + * @version $Revision: 1.10 $
    */
   public class JDBCDefinedFinderCommand extends JDBCFinderCommand
   {
  @@ -62,6 +64,75 @@
         for (int i = 0; i < parameterArray.length; i++)
            parameterArray[i] = ((Integer)parameters.get(i)).intValue();
         
  +      // Since the fields in order clause also will form the select clause together 
with
  +      // the pk field list, we have to clean the order clause from ASC/DESC's and 
fields
  +      // that already are within the pk list
  +      String strippedOrder = "";
  +      if(f.getOrder()!=null && f.getOrder()!="")
  +      {
  +        //Split it into tokens. These tokens might contain ASC/DESC that we have to 
get rid of
  +        StringTokenizer orderTokens = new StringTokenizer(f.getOrder(), ",");
  +        String orderToken;
  +        String[] checkedOrderTokens = new String[orderTokens.countTokens()];
  +        int ix = 0;
  +        while(orderTokens.hasMoreTokens())
  +        {
  +          orderToken = orderTokens.nextToken().trim();
  +          //Get rid of ASC's
  +          int i = orderToken.toUpperCase().indexOf(" ASC");
  +          if(i!=-1) 
  +            checkedOrderTokens[ix] = orderToken.substring(0, i).trim();
  +          else
  +          {
  +            //Get rid of DESC's
  +            i = orderToken.toUpperCase().indexOf(" DESC");
  +            if(i!=-1) 
  +              checkedOrderTokens[ix] = orderToken.substring(0, i).trim();
  +            else
  +            {
  +              //No ASC/DESC - just use it as it is
  +              checkedOrderTokens[ix] = new String(orderToken).trim();
  +            }
  +          }
  +          ix++;
  +        }
  +        
  +        //Next step is to make up a Set of all pk tokens
  +        StringTokenizer pkTokens = new StringTokenizer(getPkColumnList(), ",");
  +        Set setOfPkTokens = new HashSet(pkTokens.countTokens());
  +        while(pkTokens.hasMoreTokens())
  +        {
  +          setOfPkTokens.add(pkTokens.nextToken().trim());
  +        }
  +        
  +        //Now is the time to check for duplicates between pk and order tokens
  +        int i = 0;
  +        while(i < checkedOrderTokens.length)
  +        {
  +          //If duplicate token, null it away
  +          if(setOfPkTokens.contains(checkedOrderTokens[i]))
  +          {
  +            checkedOrderTokens[i]=null;
  +          }
  +          i++;
  +        }
  +        
  +        //Ok, build a new order string that we can use later on
  +        StringBuffer orderTokensToUse = new StringBuffer("");
  +        i = 0;
  +        while(i < checkedOrderTokens.length)
  +        {
  +          if(checkedOrderTokens[i]!=null)
  +          {
  +            orderTokensToUse.append(", ");
  +            orderTokensToUse.append(checkedOrderTokens[i]);
  +          }
  +          i++;
  +        }
  +        // Note that orderTokensToUse will always start with ", " if there is any 
order tokens
  +        strippedOrder = orderTokensToUse.toString();
  +      }
  +
         // Construct SQL
         // In case of join query:
         // order must explicitly identify tablename.field to order on
  @@ -69,24 +140,20 @@
         // <regular query with fully identified fields>"
         String sql = null;
         if (query.toLowerCase().startsWith(",")) {
  -               sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() +
  -                     (f.getOrder() == null || f.getOrder().equals("") ? "" : 
","+f.getOrder()) +
  +               sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() + 
strippedOrder +
                        " FROM " + jawsEntity.getTableName() + " " + query;
         } else 
         if (query.toLowerCase().startsWith("inner join")) {
  -               sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() +
  -                     (f.getOrder() == null || f.getOrder().equals("") ? "" : 
","+f.getOrder()) +
  +               sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() + 
strippedOrder +
                        " FROM " + jawsEntity.getTableName() + " " + query;
         } else {
                // regular query; check if query is empty,
                // if so, this is a select all and WHERE should not be used
                if (f.getQuery() == null)  {
  -             sql = "SELECT " + getPkColumnList() +
  -                     (f.getOrder() == null || f.getOrder().equals("") ? "" : 
","+f.getOrder()) + 
  +             sql = "SELECT " + getPkColumnList() + strippedOrder +
                        " FROM " + jawsEntity.getTableName();
                } else {
  -             sql = "SELECT " + getPkColumnList() +
  -                     (f.getOrder() == null || f.getOrder().equals("") ? "" : 
","+f.getOrder()) + 
  +             sql = "SELECT " + getPkColumnList() + strippedOrder +
                        " FROM " + jawsEntity.getTableName() + " WHERE " + query;
                }
         }
  
  
  

Reply via email to