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 2003/09/04 15:52:33 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql SqlQueryStatement.java

brj         2003/09/04 06:52:33

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlQueryStatement.java
  Log:
  also look for FieldDescriptor in super class (vertical inheritance)
  new solution by kurt hoehn
  
  Revision  Changes    Path
  1.52      +76 -56    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.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- SqlQueryStatement.java	29 Aug 2003 20:51:39 -0000	1.51
  +++ SqlQueryStatement.java	4 Sep 2003 13:52:33 -0000	1.52
  @@ -54,13 +54,7 @@
    * <http://www.apache.org/>.
    */
   
  -import java.util.ArrayList;
  -import java.util.Collection;
  -import java.util.Enumeration;
  -import java.util.HashMap;
  -import java.util.Iterator;
  -import java.util.List;
  -import java.util.Map;
  +import java.util.*;
   
   import org.apache.ojb.broker.PersistenceBrokerSQLException;
   import org.apache.ojb.broker.accesslayer.JoinSyntaxTypes;
  @@ -102,7 +96,7 @@
       /** maps trees of joins to criteria */
       private HashMap m_joinTreeToCriteria = new HashMap();
   
  -    private Platform pf;
  +    private Platform m_platform;
       private ClassDescriptor m_baseCld;
       private ClassDescriptor m_searchCld;
   
  @@ -125,7 +119,7 @@
           this.m_parentStatement = parent;
           this.m_query = (QueryByCriteria) query;
           this.m_columns = columns;
  -        this.pf = pf;
  +        this.m_platform = pf;
           this.m_searchCld = cld;
   
           if ((m_query == null) || (m_query.getBaseClass() == m_query.getSearchClass()))
  @@ -150,7 +144,7 @@
   
   
           // Walk the super reference-descriptor
  -        getReferenceCriteria( m_root, m_baseCld );
  +        buildSuperJoinTree( m_root, m_baseCld, "" );
   
           // In some cases it is necessary to split the query criteria
           // and then to generate UNION of several SELECTs
  @@ -162,34 +156,6 @@
       }
   
   
  -    /**
  -     * Walks the class hierarchy based on the super reference-descriptor in the class-descriptor
  -     *
  -     * @param left
  -     * @param cld
  -     */
  -    protected void getReferenceCriteria(TableAlias left, ClassDescriptor cld)
  -    {
  -        Iterator objRefs = cld.getObjectReferenceDescriptors().iterator();
  -
  -        while (objRefs.hasNext())
  -        {
  -            ObjectReferenceDescriptor superRef = (ObjectReferenceDescriptor) objRefs.next();
  -
  -//            if( superRef.getPersistentField().getName() == null )
  -            if (superRef.getPersistentField() instanceof AnonymousPersistentFieldForInheritance)
  -            {
  -                ClassDescriptor superCld = cld.getRepository().getDescriptorFor(superRef.getItemClassName());
  -                FieldDescriptor[] leftFields = superRef.getForeignKeyFieldDescriptors(cld);
  -
  -                TableAlias right = createTableAlias(superCld, null, superRef.getItemClassName());
  -                Join join1to1 = new Join(left, leftFields, right, superCld.getPkFields(), false, "superClass");
  -                left.addJoin(join1to1);
  -
  -                getReferenceCriteria(right, superCld);
  -            }
  -        }
  -    }
   
       protected ClassDescriptor getBaseClassDescriptor()
       {
  @@ -245,7 +211,9 @@
               String pathName = colName.substring(0, sp);
               String[] fieldNameRef = { colName.substring(sp + 1)};
   
  +            // BRJ: 
               // check if we refer to an attribute in the parent query 
  +            // this prefix is temporary !
               if (pathName.equals("parentQuery") && m_parentStatement != null)
               {
                   return m_parentStatement.getAttributeInfo(fieldNameRef[0], useOuterJoins, aUserAlias);
  @@ -334,7 +302,7 @@
               }
               else
               {
  -                // throw new IllegalArgumentException("Now Field found for : " + aPathInfo.column);
  +                // throw new IllegalArgumentException("No Field found for : " + aPathInfo.column);
                   result = aPathInfo.column;
               }
   		}
  @@ -878,7 +846,7 @@
               {
                   columns = ((ReportQuery) subQuery).getColumns();
               }
  -            sql = new SqlSelectStatement(this ,pf, cld, columns, subQuery, m_logger).getStatement();
  +            sql = new SqlSelectStatement(this ,m_platform, cld, columns, subQuery, m_logger).getStatement();
           }
           
           buf.append(" (");
  @@ -886,6 +854,7 @@
           buf.append(") ");
       }
   
  +
       /**
        * Get TableAlias by the path from the target table of the query.
        * @param path the path from the target table of the query to this TableAlias.
  @@ -920,6 +889,22 @@
           descriptors = getRoot().cld.getAttributeDescriptorsForPath(aPath, getQuery().getPathClasses());
           prev = getRoot();
   
  +        if( descriptors == null || descriptors.size() == 0 )
  +        {
  +            if( prev.hasJoins() )
  +            {
  +                for( Iterator itr = prev.iterateJoins(); itr.hasNext(); )
  +                {
  +                    prev = ((Join)itr.next()).left;
  +                    descriptors = prev.cld.getAttributeDescriptorsForPath(aPath, getQuery().getPathClasses());
  +                    if( descriptors.size() > 0 )
  +                    {
  +                        break;
  +                    }
  +                }
  +            }
  +        }
  +
           pathLength = descriptors.size();
           for (int i = 0; i < pathLength; i++)
           {
  @@ -956,24 +941,24 @@
                   }
                   else
                   {
  -					String mnAttrPath = attrPath + "*";
  +                    String mnAttrPath = attrPath + "*";
                       String mnPath = aPath + "*";
                       String mnUserAlias = (aUserAlias == null ? null : aUserAlias + "*");
  -					indirect = getTableAliasForPath(mnAttrPath, mnUserAlias, mnPath);
  -					if (indirect == null)
  -					{
  -						indirect = createTableAlias(cod.getIndirectionTable(), mnAttrPath, mnUserAlias, mnPath);
  -                    
  -						// we need two Joins for m:n
  -						// 1.) prev class to indirectionTable
  -						prevKeys = prev.cld.getPkFields();
  +                    indirect = getTableAliasForPath(mnAttrPath, mnUserAlias, mnPath);
  +                    if (indirect == null)
  +                    {
  +                        indirect = createTableAlias(cod.getIndirectionTable(), mnAttrPath, mnUserAlias, mnPath);
  +
  +                        // we need two Joins for m:n
  +                        // 1.) prev class to indirectionTable
  +                        prevKeys = prev.cld.getPkFields();
                           keys = cod.getFksToThisClass();
  -	                    addJoin(prev, prevKeys, indirect, keys, outer, attr + "*");
  -                    }					
  +                        addJoin(prev, prevKeys, indirect, keys, outer, attr + "*");
  +                    }
                       // 2.) indirectionTable to the current Class
  -					prev = indirect;
  -					prevKeys = cod.getFksToItemClass();
  -					keys = cld.getPkFields();
  +                    prev = indirect;
  +                    prevKeys = cod.getFksToItemClass();
  +                    keys = cld.getPkFields();
                   }
               }
               else
  @@ -1012,9 +997,13 @@
   
                   outer = outer || (curr.cld == prev.cld) || curr.hasExtents() || useOuterJoins;
                   addJoin(prev, prevKeys, curr, keys, outer, attr);
  +
  +                buildSuperJoinTree( curr, cld, aPath );
               }
  +
               prev = curr;
           }
  +
           return curr;
       }
   
  @@ -1510,6 +1499,37 @@
       }
   
       /**
  +     * build the Join-Information if a super reference exists
  +     *
  +     * @param left
  +     * @param cld
  +     * @param name
  +     */
  +    protected void buildSuperJoinTree( TableAlias left, ClassDescriptor cld, String name )
  +    {
  +        Iterator objRefs = cld.getObjectReferenceDescriptors().iterator();
  +        while( objRefs.hasNext() )
  +        {
  +            ObjectReferenceDescriptor objRef = (ObjectReferenceDescriptor) objRefs.next();
  +            FieldDescriptor[] leftFields = objRef.getForeignKeyFieldDescriptors(cld);
  +
  +            ClassDescriptor refCld = cld.getRepository().getDescriptorFor(objRef.getItemClassName());
  +            if (objRef.getPersistentField() instanceof AnonymousPersistentFieldForInheritance)
  +            {
  +                TableAlias base_alias = getTableAliasForPath( name, null );
  +
  +                String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++;
  +                TableAlias right = new TableAlias( refCld, aliasName, false, null );
  +
  +                Join join1to1 = new Join(left, leftFields, right, refCld.getPkFields(), false, "superClass");
  +                base_alias.addJoin( join1to1 );
  +
  +                buildSuperJoinTree( right, refCld, name);
  +            }
  +        }
  +    }
  +
  +    /**
        * First reduce the Criteria to the normal disjunctive form, then
        * calculate the necessary tree of joined tables for each item, then group
        * items with the same tree of joined tables.
  @@ -1600,7 +1620,7 @@
        */
       protected byte getJoinSyntaxType()
       {
  -        return pf.getJoinSyntaxType();
  +        return m_platform.getJoinSyntaxType();
       }
   
       /**
  
  
  

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