From 89ba2620b76df5ef4e249c2c522eb8573307d115 Mon Sep 17 00:00:00 2001
From: Tristan Cavelier <tristan.cavelier@tiolive.com>
Date: Thu, 25 Jul 2013 15:21:07 +0200
Subject: [PATCH] erp5storage converts now js complex queries to erp5 queries

---
 src/jio.storage/erp5storage.js | 44 ++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/jio.storage/erp5storage.js b/src/jio.storage/erp5storage.js
index 6768f55..8a55a70 100644
--- a/src/jio.storage/erp5storage.js
+++ b/src/jio.storage/erp5storage.js
@@ -249,6 +249,47 @@ jIO.addStorageType("erp5", function (spec, my) {
     return jql;
   };
 
+  /**
+   * Use option object and converts a query to a compatible ERP5 Query.
+   *
+   * @param  {Object} option The command options
+   */
+  priv.convertToErp5Query = function (option) {
+    option.query = complex_queries.QueryFactory.create(option.query || "");
+    if (option.wildcard_character === undefined ||
+        (option.wildcard_character !== null &&
+         typeof option.wildcard_character !== 'string')) {
+      option.wildcard_character = '%';
+    } else {
+      option.wildcard_character = option.wildcard_character || '';
+    }
+    option.query.onParseSimpleQuery = function (object) {
+      if (option.wildcard_character.length === 1 &&
+          object.parsed.operator === '=') {
+        object.parsed.operator = 'like';
+        if (option.wildcard_character === '%') {
+          object.parsed.value =
+            object.parsed.value.replace(/_/g, '\\_');
+        } else if (option.wildcard_character === '_') {
+          object.parsed.value =
+            object.parsed.value.replace(/%/g, '\\%').replace(/_/g, '%');
+        } else {
+          object.parsed.value =
+            object.parsed.value.replace(
+                /([%_])/g,
+              '\\$1'
+            ).replace(
+              new RegExp(complex_queries.stringEscapeRegexpCharacters(
+                option.wildcard_character
+              ), 'g'),
+              '%'
+            );
+        }
+      }
+    };
+    option.query = option.query.parse();
+  };
+
   // ERP5 REQUESTS //
   /**
    * Sends a request to ERP5
@@ -305,8 +346,7 @@ jIO.addStorageType("erp5", function (spec, my) {
     if (complex_queries !== undefined &&
         method === 'allDocs' &&
         option.query) {
-      option.query =
-        complex_queries.QueryFactory.create(option.query || "").serialized();
+      priv.convertToErp5Query(option);
     }
     erp5.genericRequest(
       command.cloneDoc(),
-- 
2.30.9