openjpa-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From p..@apache.org
Subject svn commit: r650714 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org...
Date Wed, 23 Apr 2008 01:10:46 GMT
Author: pcl
Date: Tue Apr 22 18:10:43 2008
New Revision: 650714

URL: http://svn.apache.org/viewvc?rev=650714&view=rev
Log:
OPENJPA-562, OPENJPA-536, OPENJPA-564, OPENJPA-536, OPENJPA-576, OPENJPA-577. Merging changes
from 1.1.x branch.

Added:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
      - copied, changed from r650559, openjpa/branches/1.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/DataSourceFactory.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceComparator.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/meta/TestMetaDataInheritanceComparator.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedFieldStrategy.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedFieldStrategy.java
(original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedFieldStrategy.java
Tue Apr 22 18:10:43 2008
@@ -410,14 +410,13 @@
         //### we selected the embedded object fields and load the object
         //### immediately; this will be inefficient when the embedded object
         //### was not selected after all
-
         StoreContext ctx = store.getContext();
         OpenJPAStateManager em = ctx.embed(null, null, sm, field);
         sm.storeObject(field.getIndex(), em.getManagedInstance());
 
         FieldMapping[] fields = field.getEmbeddedMapping().getFieldMappings();
         Object eres, processed;
-        boolean loaded = false;
+        boolean needsLoad = false;
         for (int i = 0; i < fields.length; i++) {
             eres = res.getEager(fields[i]);
             res.startDataRequest(fields[i]);
@@ -429,18 +428,24 @@
                         fields[i].loadEagerParallel(em, store, fetch, eres);
                     if (processed != eres)
                         res.putEager(fields[i], processed);
-                } else
+                } else {
                     fields[i].load(em, store, fetch, res);
-                loaded |= em.getLoaded().get(i);
+                }
+                needsLoad = needsLoad || (!em.getLoaded().get(i) && 
+                    fetch.requiresFetch(fields[i])
+                        == FetchConfiguration.FETCH_LOAD);
             } finally {
                 res.endDataRequest();
             }
         }
 
-        // after loading everything from result, load the rest of the
-        // configured fields
-        if (loaded)
-            em.load(fetch);
+        // After loading everything from result, load the rest of the
+        // configured fields if anything is missing.
+        if (needsLoad && 
+            fetch.requiresFetch(field.getFieldMetaData()) == 
+                JDBCFetchConfiguration.FETCH_LOAD) {
+          em.load(fetch);
+        }
     }
 
     /**

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
(original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
Tue Apr 22 18:10:43 2008
@@ -157,7 +157,8 @@
 
         if (sm != null && sm.getIntermediate(field.getIndex()) != null)
             return -1;
-        if (sel.isDistinct() && _lob && !field.isPrimaryKey())
+        if (_lob && !field.isPrimaryKey() && (sel.isDistinct() ||
+                eagerMode == JDBCFetchConfiguration.EAGER_NONE))
             return -1;
         sel.select(_cols, field.join(sel));
         return 1;

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/DataSourceFactory.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/DataSourceFactory.java
(original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/DataSourceFactory.java
Tue Apr 22 18:10:43 2008
@@ -162,15 +162,13 @@
                     decorators.addAll(decs);
             }
 
-            if (jdbcLog.isTraceEnabled() || sqlLog.isTraceEnabled()) {
-                // logging decorator
-                LoggingConnectionDecorator lcd =
-                    new LoggingConnectionDecorator();
-                Configurations.configureInstance(lcd, conf, opts);
-                lcd.getLogs().setJDBCLog(jdbcLog);
-                lcd.getLogs().setSQLLog(sqlLog);
-                decorators.add(lcd);
-            }
+            // logging decorator
+            LoggingConnectionDecorator lcd =
+                new LoggingConnectionDecorator();
+            Configurations.configureInstance(lcd, conf, opts);
+            lcd.getLogs().setJDBCLog(jdbcLog);
+            lcd.getLogs().setSQLLog(sqlLog);
+            decorators.add(lcd);
 
             dds.addDecorators(decorators);
             return dds;

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
(original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
Tue Apr 22 18:10:43 2008
@@ -18,6 +18,8 @@
  */
 package org.apache.openjpa.jdbc.sql;
 
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
@@ -51,7 +53,7 @@
     /**
      * Whether the driver automatically deserializes blobs.
      */
-    public boolean driverDeserializesBlobs = true;
+    public boolean driverDeserializesBlobs = false;
 
     /**
      * Whether to inline multi-table bulk-delete operations into MySQL's 
@@ -70,11 +72,9 @@
         supportsDeferredConstraints = false;
         constraintNameMode = CONS_NAME_MID;
         supportsMultipleNontransactionalResultSets = false;
-        supportsSubselect = false; // old versions
         requiresAliasForSubselect = true; // new versions
         supportsSelectStartIndex = true;
         supportsSelectEndIndex = true;
-        allowsAliasInBulkClause = false;
 
         concatenateFunction = "CONCAT({0},{1})";
 
@@ -110,6 +110,68 @@
 
         typeModifierSet.addAll(Arrays.asList(new String[] { "UNSIGNED",
             "ZEROFILL" }));
+    }
+
+    public void connectedConfiguration(Connection conn) throws SQLException {
+        super.connectedConfiguration(conn);
+
+        DatabaseMetaData metaData = conn.getMetaData();
+        // The product version looks like 4.1.3-nt
+        String productVersion = metaData.getDatabaseProductVersion();
+        // The driver version looks like mysql-connector-java-3.1.11 (...)
+        String driverVersion = metaData.getDriverVersion();
+
+        try {
+            int[] versions = getMajorMinorVersions(productVersion);
+            int maj = versions[0];
+            int min = versions[1];
+            if (maj < 4 || (maj == 4 && min < 1)) {
+                supportsSubselect = false;
+                allowsAliasInBulkClause = false;
+            }
+
+            versions = getMajorMinorVersions(driverVersion);
+            maj = versions[0];
+            if (maj < 5) {
+                driverDeserializesBlobs = true;
+            }
+        } catch (IllegalArgumentException e) {
+            // we don't understand the version format.
+            // That is ok. We just take the default values.
+        }
+    }
+
+    private static int[] getMajorMinorVersions(String versionStr)
+        throws IllegalArgumentException {
+        int beginIndex = 0;
+        int endIndex = 0;
+
+        versionStr = versionStr.trim();
+        char[] charArr = versionStr.toCharArray();
+        for (int i = 0; i < charArr.length; i++) {
+            if (Character.isDigit(charArr[i])) {
+                beginIndex = i;
+                break;
+            }
+        }
+
+        for (int i = beginIndex+1; i < charArr.length; i++) {
+            if (charArr[i] != '.' && !Character.isDigit(charArr[i])) {
+                endIndex = i;
+                break;
+            }
+        }
+
+        if (endIndex < beginIndex)
+            throw new IllegalArgumentException();
+
+        String[] arr = versionStr.substring(beginIndex, endIndex).split("\\.");
+        if (arr.length < 2)
+            throw new IllegalArgumentException();
+
+        int maj = Integer.parseInt(arr[0]);
+        int min = Integer.parseInt(arr[1]);
+        return new int[]{maj, min};
     }
 
     public String[] getCreateTableSQL(Table table) {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
(original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
Tue Apr 22 18:10:43 2008
@@ -1124,9 +1124,11 @@
                     //set "isUsedInOrderBy" to the field
                     ClassMetaData elemCls = getElement()
                         .getDeclaredTypeMetaData();
-                    FieldMetaData fmd = elemCls.getDeclaredField(decs[i]);
-                    if (fmd != null)
-                    	fmd.setUsedInOrderBy(true);                    
+                    if (elemCls != null) {
+                      FieldMetaData fmd = elemCls.getDeclaredField(decs[i]);
+                      if (fmd != null)
+                        fmd.setUsedInOrderBy(true);                      
+                    }
                 }
                 _orders = orders;
             }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceComparator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceComparator.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceComparator.java
(original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceComparator.java
Tue Apr 22 18:10:43 2008
@@ -30,7 +30,7 @@
 public class InheritanceComparator
     implements Comparator, Serializable {
 
-    private Class _base = null;
+    private Class _base = Object.class;
 
     /**
      * Set the least-derived type possible; defaults to <code>null</code>.
@@ -92,8 +92,6 @@
     private int levels(Class to) {
         if (to.isInterface())
             return to.getInterfaces().length;
-        if (_base == null)
-            return 0;
         for (int i = 0; to != null; i++, to = to.getSuperclass())
             if (to == _base)
                 return i;

Copied: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
(from r650559, openjpa/branches/1.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java)
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java?p2=openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java&p1=openjpa/branches/1.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java&r1=650559&r2=650714&rev=650714&view=diff
==============================================================================
--- openjpa/branches/1.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
(original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/InheritanceOrderedMetaDataList.java
Tue Apr 22 18:10:43 2008
@@ -31,6 +31,8 @@
     private LinkedList<ClassMetaData> buffer = new LinkedList<ClassMetaData>();
 
     public boolean add(ClassMetaData meta) {
+        if (meta == null || buffer.contains(meta))
+            return false;
         for (ListIterator<ClassMetaData> itr = buffer.listIterator();
             itr.hasNext();) {
             int ord = _comp.compare(meta, itr.next());

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
(original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
Tue Apr 22 18:10:43 2008
@@ -31,7 +31,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.SortedSet;
 import java.util.TreeSet;
 
 import org.apache.commons.lang.StringUtils;
@@ -137,10 +136,10 @@
     private final Collection _registered = new HashSet();
 
     // set of metadatas we're in the process of resolving
-    private final SortedSet _resolving = new TreeSet
-        (new MetaDataInheritanceComparator());
-    private final SortedSet _mapping = new TreeSet
-        (new MetaDataInheritanceComparator());
+    private final InheritanceOrderedMetaDataList _resolving =
+        new InheritanceOrderedMetaDataList();
+    private final InheritanceOrderedMetaDataList _mapping =
+        new InheritanceOrderedMetaDataList();
     private final List _errs = new LinkedList();
 
     // system listeners
@@ -574,7 +573,6 @@
      * if we're still in the process of resolving other metadatas.
      */
     private List resolveMeta(ClassMetaData meta) {
-    	setBaseIfNecessary(meta);
         if (meta.getPCSuperclass() == null) {
             // set superclass
             Class sup = meta.getDescribedType().getSuperclass();
@@ -618,27 +616,6 @@
         return processBuffer(meta, _resolving, MODE_META);
     }
     
-    private void setBaseIfNecessary(ClassMetaData meta) {
-        if (_resolving == null)
-            return;
-
-        InheritanceComparator comp =
-            (InheritanceComparator) _resolving.comparator();
-        if (meta.getPCSuperclass() == null) {
-            Class sup = meta.getDescribedType().getSuperclass();
-            Class pBase = null;
-            while (sup != null && sup != Object.class) {
-                pBase = sup;
-                sup = sup.getSuperclass();
-            }
-            if (pBase != null && !pBase.equals(comp.getBase())) {
-                // setBase() can be called because getMetaData() is
-                // syncronized
-                comp.setBase(pBase);
-            }
-        }
-    }
-
     /**
      * Load mapping information for the given metadata.
      */
@@ -719,7 +696,8 @@
     /**
      * Process the given metadata and the associated buffer.
      */
-    private List processBuffer(ClassMetaData meta, SortedSet buffer, int mode) {
+    private List processBuffer(ClassMetaData meta,
+        InheritanceOrderedMetaDataList buffer, int mode) {
         // if we're already processing a metadata, just buffer this one; when
         // the initial metadata finishes processing, we traverse the buffer
         // and process all the others that were introduced during reentrant
@@ -734,7 +712,7 @@
         ClassMetaData buffered;
         List processed = new ArrayList(5);
         while (!buffer.isEmpty()) {
-            buffered = (ClassMetaData) buffer.first();
+            buffered = buffer.peek();
             try {
                 buffered.resolve(mode);
                 processed.add(buffered);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/meta/TestMetaDataInheritanceComparator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/meta/TestMetaDataInheritanceComparator.java?rev=650714&r1=650713&r2=650714&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/meta/TestMetaDataInheritanceComparator.java
(original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/meta/TestMetaDataInheritanceComparator.java
Tue Apr 22 18:10:43 2008
@@ -25,10 +25,6 @@
 
 public class TestMetaDataInheritanceComparator extends PersistenceTestCase {
 
-    public void testInheritanceComparatorWithoutBase() {
-        inheritanceComparatorHelper(false);
-    }
-
     public void testInheritanceComparatorWithBase() {
         inheritanceComparatorHelper(true);
     }
@@ -45,10 +41,6 @@
         assertEquals(-1, comp.compare(AbstractThing.class, A.class));
         assertEquals(-1, comp.compare(AbstractThing.class, B.class));
         assertTrue(comp.compare(AbstractThing.class, C.class) < 0);
-    }
-
-    public void testMetaDataInheritanceComparatorWithoutBase() {
-        metaDataInheritanceComparatorHelper(false);
     }
 
     public void testMetaDataInheritanceComparatorWithBase() {



Mime
View raw message