You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/03/02 22:05:06 UTC

svn commit: r749435 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ openjpa-pro...

Author: ppoddar
Date: Mon Mar  2 21:05:05 2009
New Revision: 749435

URL: http://svn.apache.org/viewvc?rev=749435&view=rev
Log:
OPENJPA-704: Make extended path lookup optional to save runtime costs for predominant use cases.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestDynamicFetchPlan.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlan.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlanImpl.java
    openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingFetchConfiguration.java Mon Mar  2 21:05:05 2009
@@ -217,6 +217,24 @@
             throw translate(re);
         }
     }
+    
+    public boolean getExtendedPathLookup() {
+        try {
+            return _fetch.getExtendedPathLookup();
+        } catch (RuntimeException re) {
+            throw translate(re);
+        }
+    }
+
+    public FetchConfiguration setExtendedPathLookup(boolean flag) {
+        try {
+            _fetch.setExtendedPathLookup(flag);
+            return this;
+        } catch (RuntimeException re) {
+            throw translate(re);
+        }
+    }
+    
 
     public Set getFetchGroups() {
         try {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfiguration.java Mon Mar  2 21:05:05 2009
@@ -148,6 +148,20 @@
      * The query automatic flush configuration.
      */
     public FetchConfiguration setFlushBeforeQueries(int flush);
+    
+    /**
+     * Affirms if extended path lookup feature is active.
+     * 
+     * @since 2.0.0
+     */
+    public boolean getExtendedPathLookup();
+    
+    /**
+     * Sets extended path lookup feature.
+     *
+     * @since 2.0.0
+     */
+    public FetchConfiguration setExtendedPathLookup(boolean flag);
 
     /**
      * Returns immutable set of names of the fetch groups that this component

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java Mon Mar  2 21:05:05 2009
@@ -85,6 +85,7 @@
         public Map hints = null;
         public boolean fetchGroupContainsDefault = false;
         public boolean fetchGroupContainsAll = false;
+        public boolean extendedPathLookup = false;
     }
 
     private final ConfigurationState _state;
@@ -156,6 +157,7 @@
         setMaxFetchDepth(fetch.getMaxFetchDepth());
         setQueryCacheEnabled(fetch.getQueryCacheEnabled());
         setFlushBeforeQueries(fetch.getFlushBeforeQueries());
+        setExtendedPathLookup(fetch.getExtendedPathLookup());
         setLockTimeout(fetch.getLockTimeout());
         clearFetchGroups();
         addFetchGroups(fetch.getFetchGroups());
@@ -222,6 +224,15 @@
     public int getFlushBeforeQueries() {
         return _state.flushQuery;
     }
+    
+    public boolean getExtendedPathLookup() {
+        return _state.extendedPathLookup;
+    }
+    
+    public FetchConfiguration setExtendedPathLookup(boolean flag) {
+        _state.extendedPathLookup = flag;
+        return this;
+    }
 
     public FetchConfiguration setFlushBeforeQueries(int flush) {
         if (flush == DEFAULT && _state.ctx != null)
@@ -613,11 +624,10 @@
      * Whether our configuration state includes the given field.
      */
     private boolean includes(FieldMetaData fmd) {
-        if (hasFetchGroupAll() 
-        || (hasFetchGroupDefault() && fmd.isInDefaultFetchGroup())
+        if ((hasFetchGroupDefault() && fmd.isInDefaultFetchGroup()) 
+        || hasFetchGroupAll()
         || hasField(fmd.getFullName(false))
-        || hasField(fmd.getRealName())
-        || (_fromField != null && hasField(_fromField + "." + fmd.getName())))
+        || hasExtendedLookupPath(fmd))
             return true;
         String[] fgs = fmd.getCustomFetchGroups();
         for (int i = 0; i < fgs.length; i++)
@@ -625,6 +635,13 @@
                 return true;
         return false; 
     }
+    
+    private boolean hasExtendedLookupPath(FieldMetaData fmd) {
+        return getExtendedPathLookup()
+            && (hasField(fmd.getRealName())
+                || (_fromField != null 
+                && hasField(_fromField + "." + fmd.getName())));
+    }
 
     /**
      * Return the available recursion depth via the given field for the

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestDynamicFetchPlan.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestDynamicFetchPlan.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestDynamicFetchPlan.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestDynamicFetchPlan.java Mon Mar  2 21:05:05 2009
@@ -59,6 +59,7 @@
 	public void testFetchBySubClassFieldB() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+		fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class, "b");
@@ -76,6 +77,7 @@
 	public void testFetchBySubClassFieldA() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+        fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class, "b");
@@ -93,6 +95,7 @@
 	public void testFetchBySuperClassField() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+        fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class, "b");
@@ -110,6 +113,7 @@
 	public void testFetchBySubClassFieldNameB() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+        fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class.getName() + ".b");
@@ -127,6 +131,7 @@
 	public void testFetchBySubClassFieldNameA() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+        fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class.getName() + ".b");
@@ -144,6 +149,7 @@
 	public void testFetchBySuperClassFieldName() {
 		OpenJPAEntityManager em = emf.createEntityManager();
 		FetchPlan fp = em.getFetchPlan();
+        fp.setExtendedPathLookup(true);
 		fp.clearFetchGroups();
 		fp.clearFields();
 		fp.addField(FetchA.class.getName() + ".b");

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlan.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlan.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlan.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlan.java Mon Mar  2 21:05:05 2009
@@ -298,4 +298,19 @@
      */
     @Reflectable(false)
     public org.apache.openjpa.kernel.FetchConfiguration getDelegate();
+    
+    /**
+     * Affirms if extended path lookup feature is active.
+     * 
+     * @since 2.0.0
+     */
+    public boolean getExtendedPathLookup();
+    
+    /**
+     * Sets extended path lookup feature.
+     *
+     * @since 2.0.0
+     */
+    public FetchPlan setExtendedPathLookup(boolean flag);
+
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlanImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlanImpl.java?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlanImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/FetchPlanImpl.java Mon Mar  2 21:05:05 2009
@@ -249,6 +249,15 @@
         _fetch.setWriteLockLevel(EntityManagerImpl.toLockLevel(mode));
         return this;
     }
+    
+    public boolean getExtendedPathLookup() {
+        return _fetch.getExtendedPathLookup();
+    }
+    
+    public FetchPlan setExtendedPathLookup(boolean flag) {
+        _fetch.setExtendedPathLookup(flag);
+        return this;
+    }
 
     public int hashCode() {
         return _fetch.hashCode();

Modified: openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml?rev=749435&r1=749434&r2=749435&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_pc.xml Mon Mar  2 21:05:05 2009
@@ -2149,14 +2149,25 @@
 field-masking algorithms, which would allow the latter method behavior if
 <literal>Magazine</literal> did not also define a field called <literal>
 publisher</literal>.
-            </para>
+            </para>
+            
+            <para>
+            <title>Extended Path Lookup</title>
+To include the fields defined in a super class by the subclass or to distinguish
+between fields that are defined in <emphasis>both</emphasis> super- and subclass,
+set <literal>setExtendedPathLookup(boolean)</literal> on <literal>FetchPlan
+</literal> to <literal>true</literal>. By default, this option is set to
+<literal>false</literal>, to reduce more extensive lookups for predominant use 
+cases.           
+            </para>
+            
             <para>
 In order to avoid the cost of reflection, OpenJPA does not perform any
 validation of the field name / class name pairs that you put into the fetch
 configuration. If you specify non-existent class / field pairs, nothing adverse
 will happen, but you will receive no notification of the fact that the specified
 configuration is not being used.
-            </para>
+            </para>         
             <example id="ref_guide_fetch-conf_per_field">
                 <title>
                     Adding an Eager Field
@@ -2192,8 +2203,12 @@
 joined into the select, OpenJPA avoids the extra join just to select the foreign
 key values.
                     </para>
-                </listitem>
-            </itemizedlist>
+                </listitem>
+                
+                
+            </itemizedlist>
+            
+            
         </section>
     </section>
     <section id="ref_guide_perfpack_eager">