Author: rmannibucau
Date: Sun Jun  7 18:12:39 2015
New Revision: 1684055

URL: http://svn.apache.org/r1684055
Log:
mapping db param to jpa param for stored procedure parameter names + starting 
to impl cursor support (need testing)

Modified:
    
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/StoredProcedureQuery.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/XROP.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MultiQueryMetaData.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/TestStoredProcedure.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/entity/EntityWithStoredProcedure.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoredProcedureQueryImpl.java
    
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/StoredProcedureQuery.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/StoredProcedureQuery.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/StoredProcedureQuery.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/StoredProcedureQuery.java
 Sun Jun  7 18:12:39 2015
@@ -37,7 +37,7 @@ import java.sql.CallableStatement;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -105,7 +105,7 @@ public class StoredProcedureQuery extend
                 }
             }
         }
-        return new StoredProcedureQueryExecutor(this, mappings, classes);
+        return new StoredProcedureQueryExecutor(this, mappings, classes, 
_meta);
     }
 
     public boolean supportsParameterDeclarations() {
@@ -128,9 +128,11 @@ public class StoredProcedureQuery extend
     public class StoredProcedureQueryExecutor  extends AbstractExecutor {
         private final List<Class<?>> _resultClasses;
         private final List<QueryResultMapping> _resultMappings;
+        private final Map<String, String> _parametersNameMapping = new 
HashMap<String, String>();
+        private final Map<String, String> _parametersNameMappingReverse = new 
HashMap<String, String>();
 
         public StoredProcedureQueryExecutor(StoredProcedureQuery q, 
List<QueryResultMapping> resultMapping,
-                                            List<Class<?>> classes) {
+                                            List<Class<?>> classes, 
MultiQueryMetaData _meta) {
             QueryContext ctx = q.getContext();
             _resultMappings = resultMapping;
             _resultClasses = classes;
@@ -140,6 +142,14 @@ public class StoredProcedureQuery extend
             if (_proc == null) {
                 throw new RuntimeException("Can not find stored procedure " + 
procName);
             }
+            for (final Column c : _proc.getColumns()) {
+                final String name = 
_meta.getParameters().get(c.getIndex()).getName();
+                if (name != null) {
+                    final String dbName = c.getIdentifier().getName();
+                    _parametersNameMapping.put(name, dbName);
+                    _parametersNameMappingReverse.put(dbName, name);
+                }
+            }
         }
 
         StoredProcedure getStoredProcedure(Connection conn, DBDictionary dict, 
String procedureName) {
@@ -167,21 +177,26 @@ public class StoredProcedureQuery extend
                 Connection conn = _store.getConnection();
                 CallableStatement stmnt = conn.prepareCall(_proc.getCallSQL());
 
-                final StoredProcedureQuery spq = 
StoredProcedureQuery.class.cast(q);
-                for (Column c : spq.getProcedure().getInColumns()) {
-                    dict.setUnknown(stmnt, c.getIndex() + 1, 
params[c.getIndex()], c);
-                }
-                for (Column c : spq.getProcedure().getInOutColumns()) {
-                    final int index = c.getIndex() + 1;
-                    stmnt.registerOutParameter(index, c.getType());
-                    dict.setUnknown(stmnt, index, params[index - 1], c);
-                }
-                for (Column c : spq.getProcedure().getOutColumns()) {
-                    stmnt.registerOutParameter(c.getIndex() + 1, c.getType());
+                Column[] columns = 
StoredProcedureQuery.class.cast(q).getProcedure().getColumns();
+                for (final MultiQueryMetaData.Parameter p : 
_meta.getParameters()) {
+                    final Column column = columns[p.getPosition()];
+                    switch (p.getMode()) {
+                        case IN:
+                            dict.setUnknown(stmnt, p.getPosition() + 1, 
params[p.getPosition()], column);
+                            break;
+                        case INOUT: // dont break to get the out part as well
+                            dict.setUnknown(stmnt, p.getPosition() + 1, 
params[p.getPosition()], column);
+                        case OUT:
+                        case CURSOR:
+                            final int index = p.getPosition() + 1;
+                            stmnt.registerOutParameter(index, 
column.getType());
+                    }
                 }
 
                 JDBCFetchConfiguration fetch = 
(JDBCFetchConfiguration)q.getContext().getFetchConfiguration();
-                ResultObjectProvider rop = new XROP(_resultMappings, 
_resultClasses, _store, fetch, stmnt);
+                ResultObjectProvider rop = new XROP(
+                        _resultMappings, _resultClasses, 
_parametersNameMapping,
+                        _store, fetch, stmnt);
                 rop.open();
                 return rop;
             } catch (Exception e) {
@@ -199,7 +214,7 @@ public class StoredProcedureQuery extend
                     storedProcedureQuery.getProcedure().getInColumns(),
                     storedProcedureQuery.getProcedure().getInOutColumns())) {
                 for (Column c : columns) {
-                    array[i] = userParams.get(c.getIdentifier().getName());
+                    array[i] = 
userParams.get(_parametersNameMappingReverse.get(c.getIdentifier().getName()));
                     if (array[i++] == null) {
                         userParams.get(c.getIndex());
                     }

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/XROP.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/XROP.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/XROP.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/XROP.java
 Sun Jun  7 18:12:39 2015
@@ -29,6 +29,7 @@ import java.sql.CallableStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Gets multiple Result Object Providers each with different mapping.
@@ -41,16 +42,18 @@ public class XROP implements BatchedResu
     private final JDBCFetchConfiguration fetch;
     private final List<QueryResultMapping> _multi;
     private final List<Class<?>> _resultClasses;
+    private final Map<String, String> _nameMapping;
     private int index;
     private final JDBCStore store;
     // Result of first execution
     private boolean executionResult;
 
     public XROP(List<QueryResultMapping> mappings, List<Class<?>> classes,
-                JDBCStore store, JDBCFetchConfiguration fetch,
+                Map<String, String> _parametersNameMapping, JDBCStore store, 
JDBCFetchConfiguration fetch,
                 CallableStatement stmt) {
         _multi = mappings;
         _resultClasses = classes;
+        _nameMapping = _parametersNameMapping;
         this.stmt = stmt;
         this.fetch = fetch;
         this.store = store;
@@ -87,6 +90,10 @@ public class XROP implements BatchedResu
         if (rs == null)
             return null;
 
+        return mapResultSet(rs);
+    }
+
+    private ResultObjectProvider mapResultSet(final ResultSet rs) throws 
SQLException {
         ResultSetResult res = new ResultSetResult(rs, store.getDBDictionary());
         res.setCloseConnection(false);
         res.setCloseStatement(false);
@@ -150,7 +157,7 @@ public class XROP implements BatchedResu
     @Override
     public Object getOut(String name) {
         try {
-            return stmt.getObject(name);
+            return mapIfNeeded(stmt.getObject(_nameMapping.get(name)));
         } catch (SQLException e) {
             return null;
         }
@@ -159,12 +166,19 @@ public class XROP implements BatchedResu
     @Override
     public Object getOut(int position) {
         try {
-            return stmt.getObject(position);
+            return mapIfNeeded(stmt.getObject(position));
         } catch (SQLException e) {
             return null;
         }
     }
 
+    private Object mapIfNeeded(final Object object) throws SQLException {
+        if (ResultSet.class.isInstance(object)) {
+            return mapResultSet(ResultSet.class.cast(object));
+        }
+        return object;
+    }
+
     /**
      * Throws exception.
      */

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MultiQueryMetaData.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MultiQueryMetaData.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MultiQueryMetaData.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MultiQueryMetaData.java
 Sun Jun  7 18:12:39 2015
@@ -18,11 +18,11 @@
  */
 package org.apache.openjpa.meta;
 
+import org.apache.openjpa.kernel.QueryLanguages;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.openjpa.kernel.QueryLanguages;
-
 
 
 /**
@@ -153,17 +153,10 @@ public class MultiQueryMetaData extends
         private final Mode mode;
         private final int position;
 
-        public Parameter(String name, Class<?> type, Mode mode) {
+        public Parameter(int position, String name, Class<?> type, Mode mode) {
             this.name = name;
             this.type = type;
             this.mode = mode;
-            this.position = -1;
-        }
-
-        public Parameter(int position, Class<?> type, Mode mode) {
-            this.name = null;
-            this.type = type;
-            this.mode = mode;
             this.position = position;
         }
 

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/TestStoredProcedure.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/TestStoredProcedure.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/TestStoredProcedure.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/TestStoredProcedure.java
 Sun Jun  7 18:12:39 2015
@@ -58,12 +58,12 @@ public class TestStoredProcedure extends
         Procedures.inParamsString = null;
 
         EntityManager em = emf.createEntityManager();
-        exec(em, "CREATE PROCEDURE TESTINS(some_number INTEGER,some_string 
VARCHAR(255)) " +
+        exec(em, "CREATE PROCEDURE TESTINS(SOME_NUMBER INTEGER,SOME_STRING 
VARCHAR(255)) " +
                 "PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME " +
                 "'" + Procedures.class.getName() + ".inParams'");
         StoredProcedureQuery procedure = 
em.createNamedStoredProcedureQuery("EntityWithStoredProcedure.inParams");
-        procedure.setParameter("SOME_NUMBER", 2015);
-        procedure.setParameter("SOME_STRING", "openjpa");
+        procedure.setParameter("some_number", 2015);
+        procedure.setParameter("some_string", "openjpa");
         assertFalse(procedure.execute());
         assertEquals(2015, Procedures.inParamsInteger);
         assertEquals("openjpa", Procedures.inParamsString);
@@ -72,7 +72,7 @@ public class TestStoredProcedure extends
         Procedures.inParamsInteger = -1;
         Procedures.inParamsString = null;
         StoredProcedureQuery procedure2 = 
em.createNamedStoredProcedureQuery("EntityWithStoredProcedure.inParams");
-        procedure2.setParameter("SOME_NUMBER", 20152);
+        procedure2.setParameter("some_number", 20152);
         assertFalse(procedure2.execute());
         em.close();
         assertEquals(20152, Procedures.inParamsInteger);
@@ -81,11 +81,11 @@ public class TestStoredProcedure extends
 
     public void testOut() {
         EntityManager em = emf.createEntityManager();
-        exec(em, "CREATE PROCEDURE XTWO(IN some_number INTEGER,OUT x2 INTEGER) 
" +
+        exec(em, "CREATE PROCEDURE XTWO(IN SOME_NUMBER INTEGER,OUT x2 INTEGER) 
" +
                 "PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME " +
                 "'" + Procedures.class.getName() + ".x2'");
         StoredProcedureQuery procedure = 
em.createNamedStoredProcedureQuery("EntityWithStoredProcedure.x2");
-        procedure.setParameter("SOME_NUMBER", 5);
+        procedure.setParameter("some_number", 5);
         assertFalse(procedure.execute());
         // assertEquals(10, procedure.getOutputParameterValue("result")); //  
not impl by derby
         assertEquals(10, procedure.getOutputParameterValue(2));
@@ -98,7 +98,7 @@ public class TestStoredProcedure extends
                 "PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME " +
                 "'" + Procedures.class.getName() + ".inout'");
         StoredProcedureQuery procedure = 
em.createNamedStoredProcedureQuery("EntityWithStoredProcedure.inout");
-        procedure.setParameter("P", 5);
+        procedure.setParameter("p", 5);
         assertFalse(procedure.execute());
         // assertEquals(10, procedure.getOutputParameterValue("p")); //  not 
impl by derby
         assertEquals(10, procedure.getOutputParameterValue(1));

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/entity/EntityWithStoredProcedure.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/entity/EntityWithStoredProcedure.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/entity/EntityWithStoredProcedure.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/procedure/entity/EntityWithStoredProcedure.java
 Sun Jun  7 18:12:39 2015
@@ -40,24 +40,22 @@ import static javax.persistence.Paramete
                 name = "EntityWithStoredProcedure.inParams",
                 procedureName = "TESTINS",
                 parameters = {
-                        @StoredProcedureParameter(name = "SOME_NUMBER", type = 
Integer.class),
-                        @StoredProcedureParameter(name = "SOME_STRING", type = 
String.class)
+                        @StoredProcedureParameter(name = "some_number", type = 
Integer.class),
+                        @StoredProcedureParameter(name = "some_string", type = 
String.class)
                 }
         ),
         @NamedStoredProcedureQuery(
                 name = "EntityWithStoredProcedure.x2",
                 procedureName = "XTWO",
                 parameters = {
-                        @StoredProcedureParameter(name = "SOME_NUMBER", type = 
Integer.class),
-                        @StoredProcedureParameter(name = "RESULT", type = 
Integer.class, mode = OUT)
+                        @StoredProcedureParameter(name = "some_number", type = 
Integer.class),
+                        @StoredProcedureParameter(name = "result", type = 
Integer.class, mode = OUT)
                 }
         ),
         @NamedStoredProcedureQuery(
                 name = "EntityWithStoredProcedure.inout",
                 procedureName = "XINOUT",
-                parameters = {
-                        @StoredProcedureParameter(name = "P ", type = 
Integer.class, mode = INOUT)
-                }
+                parameters = @StoredProcedureParameter(name = "p", type = 
Integer.class, mode = INOUT)
         ),
         @NamedStoredProcedureQuery(
                 name = "EntityWithStoredProcedure.mapping",

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
 Sun Jun  7 18:12:39 2015
@@ -2216,6 +2216,7 @@ public class AnnotationPersistenceMetaDa
             StoredProcedureParameter[] params = proc.parameters();
             for (StoredProcedureParameter param : params) {
                 MultiQueryMetaData.Parameter p = new 
MultiQueryMetaData.Parameter(
+                        meta.getParameterCount(),
                         param.name(), param.type(), 
toKernelParameterMode(param.mode()));
                 meta.registerParameter(p);
             }

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoredProcedureQueryImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoredProcedureQueryImpl.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoredProcedureQueryImpl.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/StoredProcedureQueryImpl.java
 Sun Jun  7 18:12:39 2015
@@ -29,12 +29,18 @@ import org.apache.openjpa.util.UserExcep
 
 import java.util.Calendar;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.persistence.*;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
 import javax.persistence.NoResultException;
 import javax.persistence.NonUniqueResultException;
+import javax.persistence.Parameter;
+import javax.persistence.ParameterMode;
+import javax.persistence.StoredProcedureQuery;
+import javax.persistence.TemporalType;
 
 /**
  * Implements Store Procedure based query for JPA facade.
@@ -61,6 +67,7 @@ public class StoredProcedureQueryImpl im
     private final MultiQueryMetaData _meta;
     private QueryResultCallback _callback;
     private boolean _declaredParams; // mainly a flag for now (null or not)
+    private Iterator<MultiQueryMetaData.Parameter> cursorIterator;
 
     /**
      * Construct a query for executing a Stored Procedure.
@@ -133,6 +140,19 @@ public class StoredProcedureQueryImpl im
         execute();
         try {
             Object list = _callback.callback();
+            if (list == null) { // check if there is a cursor
+                if (cursorIterator == null) {
+                    cursorIterator = _meta.getParameters().iterator();
+                }
+                while (cursorIterator.hasNext()) {
+                    final MultiQueryMetaData.Parameter p = 
cursorIterator.next();
+                    if (p.getMode() == 
MultiQueryMetaData.Parameter.Mode.CURSOR) {
+                        list = p.getName() == null ?
+                                getOutputParameterValue(p.getPosition()) : 
getOutputParameterValue(p.getName());
+                        break;
+                    }
+                }
+            }
             RuntimeExceptionTranslator trans = PersistenceExceptions
                     .getRollbackTranslator(_delegate.getEntityManager());
             return new DelegatingResultList((ResultList) list, trans);

Modified: 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=1684055&r1=1684054&r2=1684055&view=diff
==============================================================================
--- 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
 (original)
+++ 
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
 Sun Jun  7 18:12:39 2015
@@ -758,6 +758,7 @@ public class XMLPersistenceMetaDataParse
             return false;
         }
         meta.registerParameter(new MultiQueryMetaData.Parameter(
+                meta.getParameterCount(),
                 attrs.getValue("name"), type,
                 
MultiQueryMetaData.Parameter.Mode.valueOf(attrs.getValue("mode"))));
         return true;


Reply via email to