details:   /erp/devel/pi/rev/3c1493c46cf4
changeset: 10910:3c1493c46cf4
user:      Martin Taal <martin.taal <at> openbravo.com>
date:      Mon Feb 28 15:50:23 2011 +0100
summary:   Fixes issue 15736: Backslash character (\) does not work for column 
filtering

diffstat:

 
modules/org.openbravo.service.json/src/org/openbravo/service/json/QueryBuilder.java
 |  35 +++++++--
 1 files changed, 26 insertions(+), 9 deletions(-)

diffs (73 lines):

diff -r d42fcc3691bd -r 3c1493c46cf4 
modules/org.openbravo.service.json/src/org/openbravo/service/json/QueryBuilder.java
--- 
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/QueryBuilder.java
       Mon Feb 28 15:48:39 2011 +0100
+++ 
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/QueryBuilder.java
       Mon Feb 28 15:50:23 2011 +0100
@@ -50,6 +50,7 @@
 
   private static final String PARAM_DELIMITER = "@";
   private static final String ALIAS_PREFIX = "alias_";
+  private static final char ESCAPE_CHAR = '!';
 
   public static enum TextMatching {
     startsWith, exact, substring
@@ -231,11 +232,13 @@
           sb.append(leftWherePart + " = " + getTypedParameterAlias());
           typedParameters.add(value);
         } else if (textMatching == TextMatching.startsWith) {
-          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias());
-          typedParameters.add(value.toUpperCase() + "%");
+          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias() + " escape '"
+              + ESCAPE_CHAR + "' ");
+          typedParameters.add(escapeLike(value.toUpperCase()) + "%");
         } else {
-          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias());
-          typedParameters.add("%" + value.toUpperCase().replaceAll(" ", "%") + 
"%");
+          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias() + " escape '"
+              + ESCAPE_CHAR + "' ");
+          typedParameters.add("%" + 
escapeLike(value.toUpperCase()).replaceAll(" ", "%") + "%");
         }
       } else if (!property.isPrimitive()) {
         // an in parameter use it...
@@ -256,11 +259,13 @@
           sb.append(leftWherePart + " = " + getTypedParameterAlias());
           typedParameters.add(value);
         } else if (textMatching == TextMatching.startsWith) {
-          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias());
-          typedParameters.add(value.toUpperCase() + "%");
+          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias() + " escape '"
+              + ESCAPE_CHAR + "' ");
+          typedParameters.add(escapeLike(value.toUpperCase()) + "%");
         } else {
-          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias());
-          typedParameters.add("%" + value.toUpperCase().replaceAll(" ", "%") + 
"%");
+          sb.append("upper(" + leftWherePart + ") like " + 
getTypedParameterAlias() + " escape '"
+              + ESCAPE_CHAR + "' ");
+          typedParameters.add("%" + 
escapeLike(value.toUpperCase()).replaceAll(" ", "%") + "%");
         }
       } else if (Boolean.class == property.getPrimitiveObjectType()) {
         final String alias = getTypedParameterAlias();
@@ -551,7 +556,9 @@
       } else {
         final List<Property> newIdentifierProperties = 
prop.getReferencedProperty().getEntity()
             .getIdentifierProperties();
-        sb.append(createIdentifierLeftClause(newIdentifierProperties, prefix + 
prop.getName() + "."));
+        sb
+            .append(createIdentifierLeftClause(newIdentifierProperties, prefix 
+ prop.getName()
+                + "."));
       }
     }
 
@@ -722,4 +729,14 @@
     }
   }
 
+  private String escapeLike(String value) {
+    if (value == null || value.trim().length() == 0) {
+      return value;
+    }
+    String localValue = value.replace(ESCAPE_CHAR + "", ESCAPE_CHAR + 
ESCAPE_CHAR + "");
+    localValue = localValue.replace("\\", ESCAPE_CHAR + "\\");
+    localValue = localValue.replace("_", ESCAPE_CHAR + "_");
+    localValue = localValue.replace("%", ESCAPE_CHAR + "%");
+    return localValue;
+  }
 }

------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in 
Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business 
insights. http://p.sf.net/sfu/splunk-dev2dev 
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to