You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2013/01/21 18:13:15 UTC

svn commit: r1436491 - in /openjpa/branches/2.2.1.x: ./ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence/...

Author: hthomann
Date: Mon Jan 21 17:13:14 2013
New Revision: 1436491

URL: http://svn.apache.org/viewvc?rev=1436491&view=rev
Log:
OPENJPA-2324: Option to express literal in query string directly into generate SQL - applied Albert's patch to 2.2.1.x.

Modified:
    openjpa/branches/2.2.1.x/   (props changed)
    openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
    openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
    openjpa/branches/2.2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryHints.java
    openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/HintHandler.java
    openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java

Propchange: openjpa/branches/2.2.1.x/
------------------------------------------------------------------------------
  Merged /openjpa/branches/2.1.x:r1436150

Modified: openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java?rev=1436491&r1=1436490&r2=1436491&view=diff
==============================================================================
--- openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java (original)
+++ openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java Mon Jan 21 17:13:14 2013
@@ -22,6 +22,7 @@ import org.apache.openjpa.jdbc.sql.Raw;
 import org.apache.openjpa.jdbc.sql.SQLBuffer;
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.Filters;
+import org.apache.openjpa.kernel.QueryHints;
 import org.apache.openjpa.kernel.exps.Literal;
 
 /**
@@ -141,6 +142,9 @@ public class Lit
                 _rawVal = lstate.sqlValue;
             }
         }
-        sql.appendValue(lstate.sqlValue, lstate.getColumn(index));
+        Object useLiteral = ctx.fetch.getHint(QueryHints.HINT_USE_LITERAL_IN_SQL);
+//        useLiteral = true;
+        boolean useParamToken = useLiteral != null ? !(Boolean)useLiteral : true; 
+        sql.appendValue(lstate.sqlValue, lstate.getColumn(index), null, useParamToken);
     }
 }

Modified: openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=1436491&r1=1436490&r2=1436491&view=diff
==============================================================================
--- openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original)
+++ openjpa/branches/2.2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Mon Jan 21 17:13:14 2013
@@ -37,6 +37,7 @@ import org.apache.openjpa.jdbc.kernel.ex
 import org.apache.openjpa.jdbc.schema.Column;
 import org.apache.openjpa.jdbc.schema.Sequence;
 import org.apache.openjpa.jdbc.schema.Table;
+import org.apache.openjpa.kernel.Filters;
 import org.apache.openjpa.kernel.exps.Parameter;
 
 
@@ -269,7 +270,7 @@ public final class SQLBuffer
     public SQLBuffer appendValue(Object o) {
         return appendValue(o, null);
     }
-    
+
     /**
      * Append a system inserted parameter value for a specific column.
      */
@@ -286,45 +287,78 @@ public final class SQLBuffer
      * @param userParam if non-null, designates a 'user' parameter.
      */
     public SQLBuffer appendValue(Object o, Column col, Parameter userParam) {
+        return appendValue(o, col, userParam, true);
+    }
+
+    public SQLBuffer appendValue(Object o, Column col, Parameter userParam, boolean useParamToken) {
         if (o == null)
             _sql.append("NULL");
         else if (o instanceof Raw)
             _sql.append(o.toString());
         else {
-            _sql.append(PARAMETER_TOKEN);
-
-            // initialize param and col lists; we hold off on col list until
-            // we get the first non-null col
-            if (_params == null)
-                _params = new ArrayList();
-            if (_userParams == null)
-                _userParams = new ArrayList();
-            if (col != null && _cols == null) {
-                _cols = new ArrayList();
-                while (_cols.size() < _params.size())
-                    _cols.add(null);
-            }
+            Class<?> type = Filters.wrap(o.getClass());
+//            System.out.println("======1> o="+o+", cls="+o.getClass());
+            if (useParamToken || !validParamLiteralType(type)) {
+                _sql.append(PARAMETER_TOKEN);
+
+                // initialize param and col lists; we hold off on col list until
+                // we get the first non-null col
+                if (_params == null)
+                    _params = new ArrayList();
+                if (_userParams == null)
+                    _userParams = new ArrayList();
+                if (col != null && _cols == null) {
+                    _cols = new ArrayList();
+                    while (_cols.size() < _params.size())
+                        _cols.add(null);
+                }
 
-            _params.add(o);
-            if (userParam != null) {
-                Object param = userParam;
-                if (userParam instanceof CollectionParam)
-                    param = ((CollectionParam) userParam).clone();
-                _userParams.add(param);
-                if (_userIndex == null)
-                    _userIndex = new ArrayList();
-                int index = _params.size()-1;
-                _userIndex.add(index);
-                _userIndex.add(param);
+                _params.add(o);
+                if (userParam != null) {
+                    Object param = userParam;
+                    if (userParam instanceof CollectionParam)
+                        param = ((CollectionParam) userParam).clone();
+                    _userParams.add(param);
+                    if (_userIndex == null)
+                        _userIndex = new ArrayList();
+                    int index = _params.size()-1;
+                    _userIndex.add(index);
+                    _userIndex.add(param);
+                }
+                else
+                    _userParams.add(o);
+                if (_cols != null)
+                    _cols.add(col);
+            } else {
+                if (type == String.class) {
+                    _sql.append("'" + o.toString().replace("'", "''") + "'");
+                } else if ( type == Character.class ) {
+                    if (_dict.storeCharsAsNumbers) {
+                        _sql.append(Integer.toString(((Character)o).charValue()));
+                    } else {
+                        _sql.append("'" + o.toString().replace("'", "''") + "'");
+                    }
+                } else {
+                    _sql.append(o.toString());
+                }
+//                System.out.println("======3> _sql="+_sql.toString());
             }
-            else
-                _userParams.add(o);
-            if (_cols != null)
-                _cols.add(col);
         }
         return this;
     }
  
+    private boolean validParamLiteralType(Class<?> type) {
+        boolean ret = type == String.class
+                || type == Integer.class 
+                || type == Character.class 
+                || type == Boolean.class
+                || type == Short.class
+                || type == Long.class
+                || type == Byte.class;
+//        System.out.println("======2> type="+type+", ret="+ret);
+        return ret;
+    }
+
     /**
      * Return the list of parameter values.
      */

Modified: openjpa/branches/2.2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryHints.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryHints.java?rev=1436491&r1=1436490&r2=1436491&view=diff
==============================================================================
--- openjpa/branches/2.2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryHints.java (original)
+++ openjpa/branches/2.2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryHints.java Mon Jan 21 17:13:14 2013
@@ -102,4 +102,10 @@ public interface QueryHints {
      * it binds to.
      */
     public static final String HINT_RELAX_BIND_PARAM_TYPE_CHECK = "openjpa.hint.RelaxParameterTypeChecking";
+
+    /**
+     * A boolean directive to generate literal directly into the SQL statement instead of using position parameter,
+     * if possible.
+     */
+    public static final String HINT_USE_LITERAL_IN_SQL = "openjpa.hint.UseLiteralInSQL";
 }

Modified: openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/HintHandler.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/HintHandler.java?rev=1436491&r1=1436490&r2=1436491&view=diff
==============================================================================
--- openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/HintHandler.java (original)
+++ openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/HintHandler.java Mon Jan 21 17:13:14 2013
@@ -19,8 +19,6 @@
 package org.apache.openjpa.persistence;
 
 import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -177,6 +175,9 @@ public class HintHandler  {
         } else if (QueryHints.HINT_IGNORE_PREPARED_QUERY.equals(key)) {
             plan.setHint(key, Filters.convert(value, Boolean.class));
             owner.ignorePreparedQuery();
+        } else if (QueryHints.HINT_USE_LITERAL_IN_SQL.equals(key)) {
+            Boolean convertedValue = (Boolean)Filters.convert(value, Boolean.class);
+            plan.setHint(key, convertedValue);
         } else { // default 
             plan.setHint(key, value);
         }

Modified: openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java?rev=1436491&r1=1436490&r2=1436491&view=diff
==============================================================================
--- openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java (original)
+++ openjpa/branches/2.2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java Mon Jan 21 17:13:14 2013
@@ -146,6 +146,7 @@ public class PersistenceProductDerivatio
         _hints.add(QueryHints.HINT_RECACHE_FINDER);
         _hints.add(QueryHints.HINT_RESULT_COUNT);
         _hints.add(QueryHints.HINT_SUBCLASSES);
+        _hints.add(QueryHints.HINT_USE_LITERAL_IN_SQL);
 
         _hints = Collections.unmodifiableSet(_hints);
     }