Merge branch 'jordan' of ssh://git.onelab.eu/git/myslice into jordan
[myslice.git] / manifold / js / manifold.js
index 6862523..826ea32 100644 (file)
@@ -51,7 +51,8 @@ var SET_REMOVED    = 202;
 var FIELD_REQUEST_CHANGE  = 301;
 var FIELD_REQUEST_ADD     = 302;
 var FIELD_REQUEST_REMOVE  = 303;
-var FIELD_REQUEST_RESET   = 304;
+var FIELD_REQUEST_ADD_RESET = 304;
+var FIELD_REQUEST_REMOVE_RESET = 305;
 // status
 var FIELD_REQUEST_PENDING = 401;
 var FIELD_REQUEST_SUCCESS = 402;
@@ -461,54 +462,56 @@ var manifold = {
         manifold.publish_result(query, result);
     },
 
-    process_get_query_records: function(query, records)
+    setup_update_query: function(query, records)
     {
-        /* This consists in managing the update query */
-
         // We don't prepare an update query if the result has more than 1 entry
-        if (records.length == 1) {
-            var query_ext = manifold.query_store.find_query_ext(query.query_uuid);
-
-            var record = records[0];
-
-            var update_query_ext = query_ext.update_query_ext;
-            var update_query = update_query_ext.query;
-            var update_query_ext = query_ext.update_query_ext;
-            var update_query_orig = query_ext.update_query_orig_ext.query;
-
-            // Testing whether the result has subqueries (one level deep only)
-            // iif the query has subqueries
-            var count = 0;
-            var obj = query.analyzed_query.subqueries;
-            for (method in obj) {
-                if (obj.hasOwnProperty(method)) {
-                    var key = manifold.metadata.get_key(method);
-                    if (!key)
-                        continue;
-                    if (key.length > 1)
-                        continue;
-                    key = key[0];
-                    var sq_keys = [];
-                    var subrecords = record[method];
-                    if (!subrecords)
-                        continue
-                    $.each(subrecords, function (i, subrecord) {
-                        sq_keys.push(subrecord[key]);
-                    });
-                    update_query.params[method] = sq_keys;
-                    update_query_orig.params[method] = sq_keys.slice();
-                    count++;
-                }
-            }
+        if (records.length != 1)
+            return;
+        var query_ext = manifold.query_store.find_query_ext(query.query_uuid);
+
+        var record = records[0];
 
-            if (count > 0) {
-                update_query_ext.disabled = false;
-                update_query_orig_ext.disabled = false;
+        var update_query_ext = query_ext.update_query_ext;
+        var update_query = update_query_ext.query;
+        var update_query_ext = query_ext.update_query_ext;
+        var update_query_orig = query_ext.update_query_orig_ext.query;
+
+        // Testing whether the result has subqueries (one level deep only)
+        // iif the query has subqueries
+        var count = 0;
+        var obj = query.analyzed_query.subqueries;
+        for (method in obj) {
+            if (obj.hasOwnProperty(method)) {
+                var key = manifold.metadata.get_key(method);
+                if (!key)
+                    continue;
+                if (key.length > 1)
+                    continue;
+                key = key[0];
+                var sq_keys = [];
+                var subrecords = record[method];
+                if (!subrecords)
+                    continue
+                $.each(subrecords, function (i, subrecord) {
+                    sq_keys.push(subrecord[key]);
+                });
+                update_query.params[method] = sq_keys;
+                update_query_orig.params[method] = sq_keys.slice();
+                count++;
             }
         }
 
-        /* Publish results */
-        // NOTE: this is redundant only for Get queries
+        if (count > 0) {
+            update_query_ext.disabled = false;
+            update_query_orig_ext.disabled = false;
+        }
+    },
+
+    process_get_query_records: function(query, records)
+    {
+        this.setup_update_query(query, records);
+
+        /* Publish full results */
         tmp_query = manifold.find_query(query.query_uuid);
         manifold.publish_result_rec(tmp_query.analyzed_query, records);
     },
@@ -681,6 +684,9 @@ var manifold = {
                     break;
             }
         }
+        
+        // XXX Now we need to adapt 'update' and 'update_orig' queries as if we had done a get
+        this.setup_update_query(query, records);
     },
 
     process_query_records: function(query, records)
@@ -790,19 +796,20 @@ var manifold = {
                         break;
                     case FIELD_REQUEST_ADD:
                         if ($.inArray(value.value, update_query_orig.params[value.key]) != -1)
-                            value.request = FIELD_REQUEST_RESET;
+                            value.request = FIELD_REQUEST_ADD_RESET;
                         update_query.params[value.key].push(value.value);
                         break;
                     case FIELD_REQUEST_REMOVE:
                         if ($.inArray(value.value, update_query_orig.params[value.key]) == -1)
-                            value.request = FIELD_REQUEST_RESET;
+                            value.request = FIELD_REQUEST_REMOVE_RESET;
 
                         var arr = update_query.params[value.key];
                         arr = $.grep(arr, function(x) { return x != value.value; });
                         update_query.params[value.key] = arr;
 
                         break;
-                    case FIELD_REQUEST_RESET:
+                    case FIELD_REQUEST_ADD_RESET:
+                    case FIELD_REQUEST_REMOVE_RESET:
                         // XXX We would need to keep track of the original query
                         throw "Not implemented";
                         break;
@@ -813,6 +820,21 @@ var manifold = {
                 manifold.raise_record_event(query_uuid, event_type, value);
 
                 // b) subqueries eventually (dot in the key)
+                // Let's unfold 
+                var path_array = value.key.split('.');
+                var value_key = value.key.split('.');
+
+                var cur_query = query;
+                if (cur_query.analyzed_query)
+                    cur_query = cur_query.analyzed_query;
+                $.each(path_array, function(i, method) {
+                    cur_query = cur_query.subqueries[method];
+                    value_key.shift(); // XXX check that method is indeed shifted
+                });
+                value.key = value_key;
+
+                manifold.raise_record_event(cur_query.query_uuid, event_type, value);
+
                 // XXX make this DOT a global variable... could be '/'
                 break;