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/02/01 17:50:45 UTC

svn commit: r739784 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/o...

Author: ppoddar
Date: Sun Feb  1 16:50:45 2009
New Revision: 739784

URL: http://svn.apache.org/viewvc?rev=739784&view=rev
Log:
OPENJPA-703: A separate executor for Prepared SQL.

Added:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PreparedQuery.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java Sun Feb  1 16:50:45 2009
@@ -794,9 +794,10 @@
         ExpressionParser ep = QueryLanguages.parserForLanguage(language);
         if (ep != null)
             return new JDBCStoreQuery(this, ep);
-        if (QueryLanguages.LANG_SQL.equals(language)
-         || QueryLanguages.LANG_PREPARED_SQL.equals(language))
+        if (QueryLanguages.LANG_SQL.equals(language))
             return new SQLStoreQuery(this);
+        if (QueryLanguages.LANG_PREPARED_SQL.equals(language))
+            return new PreparedSQLStoreQuery(this);
         return null;
     }
 

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java Sun Feb  1 16:50:45 2009
@@ -32,6 +32,7 @@
 import org.apache.openjpa.kernel.Broker;
 import org.apache.openjpa.kernel.PreparedQuery;
 import org.apache.openjpa.kernel.Query;
+import org.apache.openjpa.kernel.QueryLanguages;
 import org.apache.openjpa.lib.rop.ResultList;
 import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.InternalException;
@@ -88,6 +89,10 @@
         return _id;
     }
     
+    public String getLanguage() {
+        return QueryLanguages.LANG_PREPARED_SQL;
+    }
+    
     /**
      * Get the original query string which is same as the identifier of this 
      * receiver.
@@ -207,13 +212,13 @@
     /**
      * Marks the positions of user parameters.
      * 
-     * @param list odd elements are numbers representing the position of a 
-     * user parameter in the _param list. Even elements are the user parameter
+     * @param list even elements are numbers representing the position of a 
+     * user parameter in the _param list. Odd elements are the user parameter
      * key. A user parameter key may appear more than once.
      */
     void setUserParameterPositions(List list) {
         _userParamPositions = new HashMap<Object, int[]>();
-        for (int i = 1; list != null && i < list.size(); i+=2) {
+        for (int i = 1; list != null && i < list.size(); i += 2) {
             Object key = list.get(i);
             int p = (Integer)list.get(i-1);
             int[] positions = _userParamPositions.get(key);
@@ -238,5 +243,4 @@
         return "PreparedQuery: [" + getOriginalQuery() + "] --> [" + 
                getTargetQuery() + "]";
     }
-
 }

Added: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java?rev=739784&view=auto
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java (added)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java Sun Feb  1 16:50:45 2009
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.jdbc.kernel;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.ResultSetResult;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.jdbc.sql.SQLExceptions;
+import org.apache.openjpa.kernel.StoreQuery;
+import org.apache.openjpa.lib.rop.RangeResultObjectProvider;
+import org.apache.openjpa.lib.rop.ResultObjectProvider;
+import org.apache.openjpa.meta.ClassMetaData;
+
+/**
+ * A executor for Prepared SQL Query.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+public class PreparedSQLStoreQuery extends SQLStoreQuery {
+    public PreparedSQLStoreQuery(JDBCStore store) {
+        super(store);
+    }
+    
+    public Executor newDataStoreExecutor(ClassMetaData meta,
+        boolean subclasses) {
+        return new PreparedSQLExecutor(this, meta);
+    }
+    
+    public static class PreparedSQLExecutor extends AbstractExecutor {
+        private final ClassMetaData _meta;
+        public PreparedSQLExecutor(PreparedSQLStoreQuery q, 
+            ClassMetaData candidate) {
+            _meta = candidate;
+        }
+               
+        public int getOperation(StoreQuery q) {
+            return OP_SELECT;
+        }
+
+        public ResultObjectProvider executeQuery(StoreQuery q,
+            Object[] params, Range range) {
+            JDBCStore store = ((SQLStoreQuery) q).getStore();
+            DBDictionary dict = store.getDBDictionary();
+
+            SQLBuffer buf = new SQLBuffer(dict)
+                .append(q.getContext().getQueryString());
+            Connection conn = store.getConnection();
+            JDBCFetchConfiguration fetch = (JDBCFetchConfiguration)
+                q.getContext().getFetchConfiguration();
+
+            ResultObjectProvider rop;
+            PreparedStatement stmnt = null;
+            try {
+                stmnt = !range.lrs
+                    ? buf.prepareStatement(conn)
+                    : buf.prepareStatement(conn, fetch, -1, -1);
+
+                int index = 0;
+                for (int i = 0; i < params.length; i++)
+                    dict.setUnknown(stmnt, ++index, params[i], null);
+
+                ResultSet rs = stmnt.executeQuery();
+                ResultSetResult res = new ResultSetResult(conn, stmnt, rs, 
+                    store);
+                if (q.getContext().getCandidateType() != null)
+                    rop = new GenericResultObjectProvider((ClassMapping) _meta,
+                        store, fetch, res);
+                else
+                    rop = new SQLProjectionResultObjectProvider(store, fetch,
+                        res, q.getContext().getResultType());
+            } catch (SQLException se) {
+                if (stmnt != null)
+                    try { stmnt.close(); } catch (SQLException se2) {}
+                try { conn.close(); } catch (SQLException se2) {}
+                throw SQLExceptions.getStore(se, dict);
+            }
+
+            if (range.start != 0 || range.end != Long.MAX_VALUE)
+                rop = new RangeResultObjectProvider(rop, range.start,range.end);
+            return rop;
+        }
+    }
+}

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Sun Feb  1 16:50:45 2009
@@ -63,8 +63,8 @@
     private List _params = null;
     private List _cols = null;
     
-    // Odd element refers to an index of the _params list
-    // Even element refers to the user parameter key
+    // Even element refers to an index of the _params list
+    // Odd element refers to the user parameter key
     private List _userIndex = null;
     
     /**

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PreparedQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PreparedQuery.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PreparedQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PreparedQuery.java Sun Feb  1 16:50:45 2009
@@ -65,6 +65,8 @@
      */
     public String getOriginalQuery();
     
+    public String getLanguage();
+    
     /**
      * Fill in the post-compilation state of the given Query. This must be
      * called when a original query is substituted by this receiver and hence 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Sun Feb  1 16:50:45 2009
@@ -70,8 +70,8 @@
 	private Company IBM;
 	
 	public void setUp() throws Exception {
-		super.setUp(Company.class, Department.class, Employee.class,
-				Address.class, 
+		super.setUp(CLEAR_TABLES, Company.class, Department.class, 
+		    Employee.class, Address.class, 
 				"openjpa.QuerySQLCache", 
 				"true(excludes='select count(p) from Company p;select count(p) from Department p')");
 		createTestData();

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=739784&r1=739783&r2=739784&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Sun Feb  1 16:50:45 2009
@@ -875,18 +875,15 @@
         assertNotCloseInvoked();
         try {
             String qid = query;
-            PreparedQuery cached = getPreparedQuery(qid);
-            if (cached != null) {
-                language = QueryLanguages.LANG_PREPARED_SQL;
-                query = cached.getTargetQuery();
-            }
-            org.apache.openjpa.kernel.Query q = _broker.newQuery(language, 
-                query);
+            PreparedQuery pq = getPreparedQuery(qid);
+            org.apache.openjpa.kernel.Query q = (pq == null)
+                ? _broker.newQuery(language, query)
+                : _broker.newQuery(pq.getLanguage(), pq.getTargetQuery());
             // have to validate JPQL according to spec
             if (JPQLParser.LANG_JPQL.equals(language))
                 q.compile(); 
-            if (cached != null) {
-                cached.setInto(q);
+            if (pq != null) {
+                pq.setInto(q);
             }
             return new QueryImpl(this, _ret, q).setId(qid);
         } catch (RuntimeException re) {
@@ -910,19 +907,15 @@
             QueryMetaData meta = _broker.getConfiguration().
                 getMetaDataRepositoryInstance().getQueryMetaData(null, name,
                 _broker.getClassLoader(), true);
-            String query = null;
-            String language = meta.getLanguage();
             String qid = meta.getQueryString();
             
-            PreparedQuery cached = getPreparedQuery(qid);
-            if (cached != null) {
-                language = QueryLanguages.LANG_PREPARED_SQL;
-                query = cached.getTargetQuery();
-            }
-            org.apache.openjpa.kernel.Query del = _broker.newQuery(language, 
-                query);
-            if (cached != null) {
-                cached.setInto(del);
+            PreparedQuery pq = getPreparedQuery(qid);
+            org.apache.openjpa.kernel.Query del = (pq == null)
+                ? _broker.newQuery(meta.getLanguage(), meta.getQueryString())
+                : _broker.newQuery(pq.getLanguage(), pq.getTargetQuery());
+            
+            if (pq != null) {
+                pq.setInto(del);
             } else {
                 meta.setInto(del);
             }