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 ar...@apache.org on 2007/05/16 00:59:44 UTC

svn commit: r538362 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java

Author: arminw
Date: Tue May 15 15:59:43 2007
New Revision: 538362

URL: http://svn.apache.org/viewvc?view=rev&rev=538362
Log:
optimize performance

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java?view=diff&rev=538362&r1=538361&r2=538362
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java Tue May 15 15:59:43 2007
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -42,7 +42,13 @@
  */
 public class SqlSelectStatement extends SqlQueryStatement implements SelectStatement
 {
-    private WeakReference fieldsForSelect;
+    /*
+     TODO: Currently we have to take care of references to metadata classes. These classes
+     may be set free, so it's not allowed to use hard references to metadata class instances, because
+     the object with the reference may be cached. Rework this in next major version.
+     So SqlSelectStatement instances must not be cached via hard references.
+    */
+    private SelectFields selectFields;
     private boolean useOjbClassColumn;
 
     /**
@@ -176,23 +182,26 @@
      */
     protected FieldDescriptor[] getFieldsForSelect()
     {
-        if (fieldsForSelect == null || fieldsForSelect.get() == null)
+        if (selectFields == null)
         {
-            fieldsForSelect = new WeakReference(buildFieldsForSelect(getSearchClassDescriptor()));
+            selectFields = buildFieldsForSelect(getSearchClassDescriptor());
         }
-        return (FieldDescriptor[]) fieldsForSelect.get();
+        return selectFields.fields;
     }
 
     /**
-     * Return the Fields to be selected.
+     * Prepare the Fields to be selected.
      *
      * @param cld the ClassDescriptor
-     * @return the Fields to be selected
      */
-    protected FieldDescriptor[] buildFieldsForSelect(ClassDescriptor cld)
+    protected SelectFields buildFieldsForSelect(ClassDescriptor cld)
     {
         DescriptorRepository repository = cld.getRepository();
         Set fields = new ListOrderedSet();   // keep the order of the fields
+        //Map fieldIndices = new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.HARD);
+        Map fieldIndices = new HashMap();
+        // column indext starts with 1
+        int index = 0;
         
         // add Standard Fields
         // MBAIRD: if the object being queried on has multiple classes mapped to the table,
@@ -201,14 +210,18 @@
         FieldDescriptor fds[] = repository.getFieldDescriptorsForMultiMappedTable(cld);
         for (int i = 0; i < fds.length; i++)
         {
-            fields.add(fds[i]);
+            FieldDescriptor fld = fds[i];
+            fields.add(fld);
+            if(!fieldIndices.containsKey(fld)) fieldIndices.put(fld, new Integer(++index));
         }
 
         // add inherited Fields. This is important when querying for a class having a super-reference
         fds = cld.getFieldDescriptor(true);
         for (int i = 0; i < fds.length; i++)
         {
-            fields.add(fds[i]);
+            FieldDescriptor fld = fds[i];
+            fields.add(fld);
+            if(!fieldIndices.containsKey(fld)) fieldIndices.put(fld, new Integer(++index));
         }
 
         // add Fields of joined subclasses
@@ -219,13 +232,16 @@
             fds = subCld.getFieldDescriptions();
             for (int i = 0; i < fds.length; i++)
             {
-                fields.add(fds[i]);
+                FieldDescriptor fld = fds[i];
+                fields.add(fld);
+                if(!fieldIndices.containsKey(fld)) fieldIndices.put(fld, new Integer(++index));
             }
         }
 
         FieldDescriptor[] result = new FieldDescriptor[fields.size()];
         fields.toArray(result);
-        return result;
+
+        return new SelectFields(result, fieldIndices);
     }
 
     /**
@@ -456,16 +472,14 @@
     public int getColumnIndex(FieldDescriptor fld)
     {
         int index = JdbcType.MIN_INT;
-        FieldDescriptor[] fields = getFieldsForSelect();
-        if (fields != null)
+        // make sure that fields build once
+        if(selectFields == null) getFieldsForSelect();
+        if(selectFields.fieldIndices != null)
         {
-            for (int i = 0; i < fields.length; i++)
+            Integer id = (Integer) selectFields.fieldIndices.get(fld);
+            if(id != null)
             {
-                if (fields[i].equals(fld))
-                {
-                    index = i + 1;  // starts at 1
-                    break;
-                }
+                index = id.intValue();
             }
         }
         return index;
@@ -489,5 +503,17 @@
     protected void setUseOjbClassColumn(boolean useOjbClassColumn)
     {
         this.useOjbClassColumn = useOjbClassColumn;
+    }
+
+    static class SelectFields
+    {
+        FieldDescriptor[] fields;
+        Map fieldIndices;
+
+        public SelectFields(FieldDescriptor[] fields, Map fieldIndices)
+        {
+            this.fields = fields;
+            this.fieldIndices = fieldIndices;
+        }
     }
 }



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