You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by br...@apache.org on 2005/10/28 22:30:06 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/core QueryReferenceBroker.java

brj         2005/10/28 13:30:06

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlQueryStatement.java TableAliasHandler.java
               src/java/org/apache/ojb/broker/accesslayer
                        MtoNCollectionPrefetcher.java
               src/java/org/apache/ojb/broker/core
                        QueryReferenceBroker.java
  Log:
  fix for ojb-72
  an alias is now used for the indirection table
  
  Revision  Changes    Path
  1.102     +49 -34    db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java
  
  Index: SqlQueryStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -u -r1.101 -r1.102
  --- SqlQueryStatement.java	18 Sep 2005 13:26:14 -0000	1.101
  +++ SqlQueryStatement.java	28 Oct 2005 20:30:06 -0000	1.102
  @@ -269,53 +269,57 @@
           FieldDescriptor fld;
           String result = null;
           String attrName = anAttrInfo.getAttribute();
  -        
  -        if (translate)
  +
  +        // no translation required, use attribute name
  +        if (!translate)
           {
  -            // translate attribute name into column name
  -            fld = getFieldDescriptor(aTableAlias, attrName);
  +            return attrName;
  +        }
   
  -            if (fld != null)
  -            {
  -                m_attrToFld.put(anAttrInfo.getParent().getAttribute(), fld);
  +        // BRJ: special alias for the indirection table has no ClassDescriptor 
  +        if (TableAliasHandler.isMNAlias(aTableAlias))
  +        {
  +            return aTableAlias.alias + "." + attrName;
  +        }
   
  -                // added to suport the super reference descriptor
  -                if (!fld.getClassDescriptor().getFullTableName().equals(aTableAlias.table) && aTableAlias.hasJoins())
  -                {
  -                    Iterator itr = aTableAlias.joins.iterator();
  -                    while (itr.hasNext())
  -                    {
  -                        Join join = (Join) itr.next();
  -                        if (join.right.table.equals(fld.getClassDescriptor().getFullTableName()))
  -                        {
  -                            result = join.right.alias + "." + fld.getColumnName();
  -                            break;
  -                        }
  -                    }
  +        // translate attribute name into column name
  +        fld = getFieldDescriptor(aTableAlias, attrName);
  +
  +        if (fld != null)
  +        {
  +            m_attrToFld.put(anAttrInfo.getParent().getAttribute(), fld);
   
  -                    if (result == null)
  +            // added to suport the super reference descriptor
  +            if (!fld.getClassDescriptor().getFullTableName().equals(aTableAlias.table) && aTableAlias.hasJoins())
  +            {
  +                Iterator itr = aTableAlias.joins.iterator();
  +                while (itr.hasNext())
  +                {
  +                    Join join = (Join) itr.next();
  +                    if (join.right.table.equals(fld.getClassDescriptor().getFullTableName()))
                       {
  -                        result = attrName;
  +                        result = join.right.alias + "." + fld.getColumnName();
  +                        break;
                       }
                   }
  -                else
  +
  +                if (result == null)
                   {
  -                    result = aTableAlias.alias + "." + fld.getColumnName();
  +                    result = attrName;
                   }
               }
  -            else if ("*".equals(attrName))
  -            {
  -                result = attrName;
  -            }
               else
               {
  -                // throw new IllegalArgumentException("No Field found for : " + aPathInfo.column);
  -                result = attrName;
  +                result = aTableAlias.alias + "." + fld.getColumnName();
               }
           }
  +        else if ("*".equals(attrName))
  +        {
  +            result = attrName;
  +        }
           else
           {
  -            // use attribute name
  +            // throw new IllegalArgumentException("No Field found for : " + aPathInfo.column);
               result = attrName;
           }
   
  @@ -1165,8 +1169,9 @@
   
               if (getQuery() instanceof MtoNQuery)
               {
  -                buf.append(",");
  -                buf.append(((MtoNQuery) getQuery()).getIndirectionTable());
  +                MtoNQuery mnQuery = (MtoNQuery)m_query; 
  +                buf.append(", ");
  +                appendTableAlias(getTableAliasForPath(mnQuery.getIndirectionTable()), buf);
               }
           }
   
  @@ -1334,6 +1339,16 @@
       }
   
       /**
  +     * Answer the TableAlias for aPath
  +     * @param aPath
  +     * @return TableAlias, null if none
  +     */
  +    private TableAlias getTableAliasForPath(String aPath)
  +    {
  +        return m_tableAliasHandler.getTableAliasForPath(aPath);
  +    }
  +
  +    /**
        * Gets the search table of this query.
        * @return Returns a TableAlias
        */
  
  
  
  1.12      +28 -5     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java
  
  Index: TableAliasHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- TableAliasHandler.java	8 Oct 2005 12:07:33 -0000	1.11
  +++ TableAliasHandler.java	28 Oct 2005 20:30:06 -0000	1.12
  @@ -33,6 +33,7 @@
   import org.apache.ojb.broker.metadata.SuperReferenceDescriptor;
   import org.apache.ojb.broker.query.Criteria;
   import org.apache.ojb.broker.query.FieldCriteria;
  +import org.apache.ojb.broker.query.MtoNQuery;
   import org.apache.ojb.broker.query.QueryByCriteria;
   import org.apache.ojb.broker.query.SelectionCriteria;
   import org.apache.ojb.broker.query.SqlCriteria;
  @@ -50,6 +51,7 @@
   class TableAliasHandler
   {
       private static final String ALIAS_SEPARATOR = ".";
  +    static final String M_N_ALIAS = "M_N";
       
       /** the query */
       private QueryByCriteria m_query;
  @@ -79,7 +81,16 @@
   
       private int m_aliasCount = 0;
   
  -    
  +    /**
  +     * Test if it's the special M_N_Alias.
  +     * @param aTableAlias
  +     * @return
  +     */
  +    static boolean isMNAlias(TableAlias aTableAlias)
  +    {
  +        return aTableAlias.cld == null && M_N_ALIAS.equals(aTableAlias.alias);
  +    }
  +
       TableAliasHandler(TableAliasHandler parent, QueryByCriteria aQuery, ClassDescriptor searchCld, Logger logger)
       {      
           m_logger = logger != null ? logger : LoggerFactory.getLogger(TableAliasHandler.class);
  @@ -98,6 +109,14 @@
   
           m_rootAlias = createTableAlias(getBaseClassDescriptor(), null, "");
   
  +        // BRJ: create a special alias for the indirection table
  +        if (m_query instanceof MtoNQuery)
  +        {
  +            MtoNQuery mnQuery = (MtoNQuery)m_query; 
  +            TableAlias mnAlias = new TableAlias(mnQuery.getIndirectionTable(), M_N_ALIAS);
  +            m_pathToAlias.put(mnQuery.getIndirectionTable(), mnAlias);
  +        }
  +
           if (searchCld == getBaseClassDescriptor())
           {
               m_searchAlias = m_rootAlias;
  @@ -248,7 +267,7 @@
        * @param aPath
        * @return TableAlias, null if none
        */
  -    private TableAlias getTableAliasForPath(String aPath)
  +    TableAlias getTableAliasForPath(String aPath)
       {
           return (TableAlias) m_pathToAlias.get(aPath);
       }
  @@ -435,7 +454,11 @@
   			if (curr == null)
   			{
   				List hintClasses = (List) pathClasses.get(aPath);
  -				curr = createTableAlias(cld, attrPath, pathAlias, hintClasses);
  +                
  +//                ClassDescriptor relCld = ((FieldDescriptor)keys[0]).getClassDescriptor();  // TEST
  +//                curr = createTableAlias(relCld, attrPath, pathAlias, hintClasses);
  +                
  +                curr = createTableAlias(cld, attrPath, pathAlias, hintClasses);
   
   				outer = outer || (curr.cld == prev.cld) || curr.hasExtents() || useOuterJoins;
   				addJoin(prev, prevKeys, curr, keys, outer, attr);
  @@ -1019,7 +1042,7 @@
               }
               return columns;
           }
  -
  +        
           public boolean equals(Object obj)
           {
               Join j = (Join) obj;
  
  
  
  1.25      +7 -7      db-ojb/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java
  
  Index: MtoNCollectionPrefetcher.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- MtoNCollectionPrefetcher.java	27 Apr 2005 14:25:31 -0000	1.24
  +++ MtoNCollectionPrefetcher.java	28 Oct 2005 20:30:06 -0000	1.25
  @@ -305,15 +305,15 @@
               case 0 :
                   break;
               case 1 :
  -                crit.addColumnEqualTo(fkCol, values.get(0));
  +                crit.addEqualTo(fkCol, values.get(0));
                   break;
               default :
                   // create IN (...) for the single key field
  -                crit.addColumnIn(fkCol, values);
  +                crit.addIn(fkCol, values);
                   break;
           }
   
  -        crit.addEqualToColumn(itemPkField.getAttributeName(), itemFkCol);
  +        crit.addEqualToField(itemPkField.getAttributeName(), itemFkCol);
   
           return crit;
       }
  @@ -336,7 +336,7 @@
   
           for (int i = 0; i < itemPkFields.length; i++)
           {
  -            crit.addEqualToColumn(itemPkFields[i].getAttributeName(), itemFkCols[i]);
  +            crit.addEqualToField(itemPkFields[i].getAttributeName(), itemFkCols[i]);
           }
           
           while (iter.hasNext())
  @@ -350,11 +350,11 @@
   
                   if (val[i] == null)
                   {
  -                    c.addColumnIsNull(fkCols[i]);
  +                    c.addIsNull(fkCols[i]);
                   }
                   else
                   {
  -                    c.addColumnEqualTo(fkCols[i], val[i]);
  +                    c.addEqualTo(fkCols[i], val[i]);
                   }
   
               }
  
  
  
  1.42      +3 -3      db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java
  
  Index: QueryReferenceBroker.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- QueryReferenceBroker.java	29 Sep 2005 23:26:31 -0000	1.41
  +++ QueryReferenceBroker.java	28 Oct 2005 20:30:06 -0000	1.42
  @@ -712,11 +712,11 @@
   
           for (int i = 0; i < thisClassFks.length; i++)
           {
  -            criteria.addColumnEqualTo(cod.getIndirectionTable() + "." + thisClassFks[i], values[i].getValue());
  +            criteria.addEqualTo(cod.getIndirectionTable() + "." + thisClassFks[i], values[i].getValue());
           }
           for (int i = 0; i < itemClassFks.length; i++)
           {
  -            criteria.addColumnEqualToField(
  +            criteria.addEqualToField(
                   cod.getIndirectionTable() + "." + itemClassFks[i].toString(),
                   refCld.getPkFields()[i].getAttributeName());
           }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org