brj         2005/11/12 09:23:33

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql Tag:
                        OJB_1_0_RELEASE SqlQueryStatement.java
  Log:
  fix for ojb-50.
  path class hints are part of the key when looking for an alias
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.75.2.15 +54 -20    
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.75.2.14
  retrieving revision 1.75.2.15
  diff -u -r1.75.2.14 -r1.75.2.15
  --- SqlQueryStatement.java    3 Nov 2005 19:59:51 -0000       1.75.2.14
  +++ SqlQueryStatement.java    12 Nov 2005 17:23:33 -0000      1.75.2.15
  @@ -72,7 +72,7 @@
       private TableAlias m_search;
       /** the query */
       private QueryByCriteria m_query;
  -    /** the mapping of paths to TableAliases */
  +    /** the mapping of paths to TableAliases. the key is built using the 
path and the path class hints. */
       private HashMap m_pathToAlias = new HashMap();
       /** the mapping of ClassDescriptor to TableAliases */
       private HashMap m_cldToAlias = new HashMap();
  @@ -132,7 +132,7 @@
           {
               MtoNQuery mnQuery = (MtoNQuery)m_query; 
               TableAlias mnAlias = new 
TableAlias(mnQuery.getIndirectionTable(), M_N_ALIAS);
  -            m_pathToAlias.put(mnQuery.getIndirectionTable(), mnAlias);
  +            setTableAliasForPath(mnQuery.getIndirectionTable(), null, 
mnAlias);        
           }
   
           if (m_searchCld == m_baseCld)
  @@ -1019,8 +1019,9 @@
                boolean outer = useOuterJoins;
                int pathLength;
   
  +        List hintClasses = (List) pathClasses.get(aPath);
                String pathAlias = aUserAlias == null ? null : 
aUserAlias.getAlias(aPath);
  -             curr = getTableAliasForPath(aPath, pathAlias);
  +             curr = getTableAliasForPath(aPath, pathAlias, hintClasses);
   
                if (curr != null)
                {
  @@ -1084,7 +1085,7 @@
                                {
                                        String mnAttrPath = attrPath + "*";
                                        String mnUserAlias = (aUserAlias == 
null ? null : aUserAlias + "*");
  -                                     indirect = 
getTableAliasForPath(mnAttrPath, mnUserAlias);
  +                                     indirect = 
getTableAliasForPath(mnAttrPath, mnUserAlias, null);
                                        if (indirect == null)
                                        {
                                                indirect = 
createTableAlias(cod.getIndirectionTable(), mnAttrPath, mnUserAlias);
  @@ -1141,11 +1142,10 @@
                        }
   
                        pathAlias = aUserAlias == null ? null : 
aUserAlias.getAlias(attrPath);
  -                     curr = getTableAliasForPath(attrPath, pathAlias);
  +                     curr = getTableAliasForPath(attrPath, pathAlias, 
hintClasses);
   
                        if (curr == null)
                        {
  -                             List hintClasses = (List) 
pathClasses.get(aPath);
                                curr = createTableAlias(cld, attrPath, 
pathAlias, hintClasses);
   
                                outer = outer || (curr.cld == prev.cld) || 
curr.hasExtents() || useOuterJoins;
  @@ -1157,7 +1157,6 @@
                        prev = curr;
                }
   
  -             // PAW
                m_logger.debug("Result of getTableAlias(): " + curr);
                return curr;
        }
  @@ -1295,8 +1294,7 @@
           String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++; 
// m_pathToAlias.size();
           alias = new TableAlias(cld, aliasName, lookForExtents, hints);
   
  -        m_pathToAlias.put(path, alias);
  -        
  +        setTableAliasForPath(path, hints, alias);        
           return alias;
       }
   
  @@ -1335,8 +1333,8 @@
   
           String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++; 
// + m_pathToAlias.size();
           alias = new TableAlias(table, aliasName);
  -        m_pathToAlias.put(path, alias);
  -             m_logger.debug("createTableAlias2: path: " + path + " 
tableAlias: " + alias);
  +        setTableAliasForPath(path, null, alias);        
  +        m_logger.debug("createTableAlias2: path: " + path + " tableAlias: " 
+ alias);
   
           return alias;
       }
  @@ -1344,11 +1342,46 @@
       /**
        * Answer the TableAlias for aPath
        * @param aPath
  +     * @param hintClasses 
        * @return TableAlias, null if none
        */
  -    private TableAlias getTableAliasForPath(String aPath)
  +    private TableAlias getTableAliasForPath(String aPath, List hintClasses)
  +    {
  +        return (TableAlias) m_pathToAlias.get(buildAliasKey(aPath, 
hintClasses));
  +    }
  +
  +    /**
  +     * Set the TableAlias for aPath
  +     * @param aPath
  +     * @param hintClasses 
  +     * @param TableAlias
  +     */
  +    private void setTableAliasForPath(String aPath, List hintClasses, 
TableAlias anAlias)
  +    {
  +        m_pathToAlias.put(buildAliasKey(aPath, hintClasses), anAlias);
  +    }
  +    
  +    /**
  +     * Build the key for the TableAlias based on the path and the hints
  +     * @param aPath
  +     * @param hintClasses
  +     * @return the key for the TableAlias
  +     */
  +    private String buildAliasKey(String aPath, List hintClasses)
       {
  -        return (TableAlias) m_pathToAlias.get(aPath);
  +        if (hintClasses == null || hintClasses.isEmpty())
  +        {
  +            return aPath;
  +        }
  +        
  +        StringBuffer buf = new StringBuffer(aPath);
  +        for (Iterator iter = hintClasses.iterator(); iter.hasNext();)
  +        {
  +            Class hint = (Class) iter.next();
  +            buf.append(" ");
  +            buf.append(hint.getName());
  +        }
  +        return buf.toString();
       }
   
       /**
  @@ -1374,17 +1407,18 @@
        * Answer the TableAlias for aPath or aUserAlias
        * @param aPath
        * @param aUserAlias
  +     * @param hintClasses
        * @return TableAlias, null if none
        */
  -    private TableAlias getTableAliasForPath(String aPath, String aUserAlias)
  +    private TableAlias getTableAliasForPath(String aPath, String aUserAlias, 
List hintClasses)
       {
           if (aUserAlias == null)
           {
  -            return getTableAliasForPath(aPath);
  +            return getTableAliasForPath(aPath, hintClasses);
           }
           else
           {
  -                     return getTableAliasForPath(aUserAlias + 
ALIAS_SEPARATOR + aPath);
  +                     return getTableAliasForPath(aUserAlias + 
ALIAS_SEPARATOR + aPath, hintClasses);
           }
       }
   
  @@ -1506,7 +1540,7 @@
               if (getQuery() instanceof MtoNQuery)
               {
                   MtoNQuery mnQuery = (MtoNQuery)m_query; 
  -                
buf.append(getTableAliasForPath(mnQuery.getIndirectionTable()).getTableAndAlias());
  +                
buf.append(getTableAliasForPath(mnQuery.getIndirectionTable(), 
null).getTableAndAlias());
                   buf.append(", ");
               }           
               buf.append(alias.getTableAndAlias());
  @@ -1681,7 +1715,7 @@
           {
               SuperReferenceDescriptor superRef = cld.getSuperReference();
               FieldDescriptor[] leftFields = 
superRef.getForeignKeyFieldDescriptors(cld);
  -            TableAlias base_alias = getTableAliasForPath(name, null);
  +            TableAlias base_alias = getTableAliasForPath(name, null, null);
               String aliasName = String.valueOf(getAliasChar()) + 
m_aliasCount++;
               TableAlias right = new TableAlias(superCld, aliasName, 
useOuterJoin, null);
   
  @@ -1712,7 +1746,7 @@
               {
                   FieldDescriptor[] leftFields = subCld.getPkFields();
                   FieldDescriptor[] rightFields = 
srd.getForeignKeyFieldDescriptors(subCld);
  -                TableAlias base_alias = getTableAliasForPath(name, null);
  +                TableAlias base_alias = getTableAliasForPath(name, null, 
null);
   
                   String aliasName = String.valueOf(getAliasChar()) + 
m_aliasCount++;
                   TableAlias right = new TableAlias(subCld, aliasName, false, 
null);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to