Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
[myslice.git] / manifoldapi / static / js / manifold.js
index 02b342d..2d94a3a 100644 (file)
@@ -1070,7 +1070,8 @@ var manifold = {
             messages.debug ("<<<<< publish_result_rec " + query.object);
     },
 
-    setup_update_query: function(query, records) {
+    setup_update_query: function(query, records) 
+    {
         // We don't prepare an update query if the result has more than 1 entry
         if (records.length != 1)
             return;
@@ -1263,6 +1264,10 @@ var manifold = {
 
                     break;
                 case TYPE_LIST_OF_RECORDS:
+                    var new_state,cur_query_uuid;
+
+                    cur_query_uuid = query.analyzed_query.subqueries['resource'].query_uuid;
+
                     // example: slice.resource
                     //  - update_query_orig.params.resource = resources in slice before update
                     //  - update_query.params.resource = resource requested in slice
@@ -1284,44 +1289,31 @@ var manifold = {
                     var added_keys   = $.grep(query_keys, function (x) { return $.inArray(x, update_keys) == -1 });
                     var removed_keys = $.grep(update_keys, function (x) { return $.inArray(x, query_keys) == -1 });
 
-
+                    // Send events related to parent query
                     $.each(added_keys, function(i, key) {
-                        if ($.inArray(key, result_keys) == -1) {
-                            data = {
-                                state: STATE_SET,
-                                key  : field,
-                                op   : STATE_SET_IN_FAILURE,
-                                value: key
-                            }
-                        } else {
-                            data = {
-                                state: STATE_SET,
-                                key  : field,
-                                op   : STATE_SET_IN_SUCCESS,
-                                value: key
-                            }
-                        }
+                        new_state = ($.inArray(key, result_keys) == -1) ? STATE_SET_IN_FAILURE : STATE_SET_IN_SUCCESS;
+
+                        // Update record state for children queries
+                        manifold.query_store.set_record_state(cur_query_uuid, field, STATE_SET, new_state);
+
+                        data = { state: STATE_SET, key  : field, op   : new_state, value: key }
                         manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
                     });
                     $.each(removed_keys, function(i, key) {
-                        if ($.inArray(key, result_keys) == -1) {
-                            data = {
-                                state: STATE_SET,
-                                key  : field,
-                                op   : STATE_SET_OUT_SUCCESS,
-                                value: key
-                            }
-                        } else {
-                            data = {
-                                state: STATE_SET,
-                                key  : field,
-                                op   : STATE_SET_OUT_FAILURE,
-                                value: key
-                            }
-                        }
+                        new_state = ($.inArray(key, result_keys) == -1) ? STATE_SET_OUT_SUCCESS : STATE_SET_OUT_FAILURE;
+
+                        // Update record state for children queries
+                        manifold.query_store.set_record_state(cur_query_uuid, field, STATE_SET, new_state);
+
+                        data = { state: STATE_SET, key  : field, op   : new_state, value: key }
                         manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
                     });
 
+                    
+                    
+                    // Send events related to children queries
+                    // XXX
+
 
                     break;
             }
@@ -1334,7 +1326,9 @@ var manifold = {
         query_ext.query_state = QUERY_STATE_DONE;
 
         // Send DONE message to plugins
-        manifold.raise_record_event(query.query_uuid, DONE);
+        query.iter_subqueries(function(sq, data, parent_query) {
+            manifold.raise_record_event(sq.query_uuid, DONE);
+        });
 
     },
 
@@ -1449,7 +1443,7 @@ var manifold = {
     /**
      * Event handler helpers
      */
-    _get_next_state_add: function(prev_state, event_type)
+    _get_next_state_add: function(prev_state)
     {
         switch (prev_state) {
             case STATE_SET_OUT:
@@ -1472,7 +1466,7 @@ var manifold = {
         return new_state;
     },
 
-    _get_next_state_remove: function(prev_state, event_type)
+    _get_next_state_remove: function(prev_state)
     {
         switch (prev_state) {
             case STATE_SET_IN:
@@ -1677,96 +1671,66 @@ var manifold = {
                         break;
 
                     case STATE_SET:
+                        var prev_state, new_state;
+                        var main_query, record, new_data, path;
+        
+                        // We only track state in the analyzed query
+                        prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
+                        if (prev_state === null)
+                            prev_state = STATE_SET_OUT;
 
                         switch(data.op) {
                             case STATE_SET_ADD:
-                                if (!data.key) {
-                                    var prev_state, new_state;
-                                    var main_query, record, new_data;
-                    
-                                    prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
-                                    if (prev_state === null)
-                                        prev_state = STATE_SET_OUT;
-                                    new_state = this._get_next_state_add(prev_state, data.state);
-                    
-                                    /* data.value containts the resource key */
-                                    manifold.query_store.add_record(query_uuid, data.value, new_state);
-                                    record = manifold.query_store.get_record(query_uuid, data.value);
-                                    this._enforce_constraints(query_ext, record, data.value, STATE_SET_ADD);
-                    
-                                    /* Inform the parent query: important for update */
-                                    new_data = {
-                                        state : STATE_SET,
-                                        key   : this._get_query_path(query_ext),
-                                        op    : STATE_SET_ADD,
-                                        value : data.value,
-                                    };
-                                    main_query = query_ext.main_query_ext.query;
-                                    this.raise_event(main_query.query_uuid, FIELD_STATE_CHANGED, new_data);
-                    
-                                    /*
-                                     * Propagate the event to other plugins subscribed to the query
-                                     */
-                                    new_data.op = new_state;
-                                    manifold.raise_query_event(query_uuid, event_type, new_data);
-                                } else {
-                                    // mainquery: proceed to update
-
-                                    //if ($.inArray(data.value, update_query_orig.params[data.key]) != -1)
-                                    //    value.request = FIELD_REQUEST_ADD_RESET;
-
-                                    if (update_query.params[data.key] === undefined)
-                                        update_query.params[data.key] = Array();
-                                    update_query.params[data.key].push(data.value);
-                                }
+                                new_state = this._get_next_state_add(prev_state);
+
+                                /* data.value containts the resource key */
+                                manifold.query_store.add_record(query_uuid, data.value, new_state);
+                                record = manifold.query_store.get_record(query_uuid, data.value);
+                                this._enforce_constraints(query_ext, record, data.value, STATE_SET_ADD);
+                
+                                /* Process update query in parent */
+                                path =  this._get_query_path(query_ext);
+                                if (update_query.params[path] === undefined)
+                                    update_query.params[path] = Array();
+                                update_query.params[path].push(data.value);
+
                                 break;
 
                             case STATE_SET_REMOVE:
-                                if (!data.key) {
-                                    var prev_state, new_state;
-                                    var main_query, record, new_data;
-                    
-                                    prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
-                                    if (prev_state === null)
-                                        prev_state = STATE_SET_OUT;
-                                    new_state = this._get_next_state_remove(prev_state, data.state);
-                    
-                                    /* data.value contains the resource key */
-                                    manifold.query_store.remove_record(query_uuid, data.value, new_state);
-                                    record = manifold.query_store.get_record(query_uuid, data.value);
-                                    this._enforce_constraints(query_ext, record, data.value, STATE_SET_REMOVE);
-                    
-                                    /* Inform the parent query: important for update */
-                                    new_data = {
-                                        state : STATE_SET,
-                                        key   : this._get_query_path(query_ext),
-                                        op    : STATE_SET_REMOVE,
-                                        value : data.value,
-                                    };
-                                    main_query = query_ext.main_query_ext.query;
-                                    this.raise_event(main_query.query_uuid, FIELD_STATE_CHANGED, new_data);
-                    
-                                    /* Propagate the event to other plugins subscribed to the query */
-                                    new_data.op = new_state
-                                    manifold.raise_query_event(query_uuid, event_type, new_data);
+                                new_state = this._get_next_state_remove(prev_state);
+
+                                /* data.value contains the resource key */
+                                manifold.query_store.remove_record(query_uuid, data.value, new_state);
+                                record = manifold.query_store.get_record(query_uuid, data.value);
+                                this._enforce_constraints(query_ext, record, data.value, STATE_SET_REMOVE);
                     
-                                } else {
-                                    // main query: proceed to update
-
-                                    //if ($.inArray(data.value, update_query_orig.params[data.key]) == -1)
-                                    //    value.request = FIELD_REQUEST_REMOVE_RESET;
-
-                                    var arr = update_query.params[data.key];
-                                    arr = $.grep(arr, function(x) { return x != data.value; });
-                                    if (update_query.params[data.key] === undefined)
-                                        update_query.params[data.key] = Array();
-                                    update_query.params[data.key] = arr;
-                                }
+                                /* Process update query in parent */
+                                path =  this._get_query_path(query_ext);
+                                arr = update_query.params[path];
+                                arr = $.grep(arr, function(x) { return x != data.value; });
+                                if (update_query.params[path] === undefined)
+                                    update_query.params[path] = Array();
+                                update_query.params[path] = arr;
                                 break;
                         }
+
+                        /* Inform the parent query: important for update */
+                        new_data = {
+                            state : STATE_SET,
+                            key   : path,
+                            op    : new_state,
+                            value : data.value,
+                        };
+                        main_query = query_ext.main_query_ext.query;
+                        manifold.raise_record_event(main_query.query_uuid, event_type, new_data);
+                        /* Propagate the event to other plugins subscribed to the query */
+                        manifold.query_store.recount(query_uuid);
+                        new_data.key = ''
+                        manifold.raise_record_event(query_uuid, event_type, new_data);
+
                         break;
                 }
-
+/*
                 // 3. Inform others about the change
                 // a) the main query...
                 manifold.raise_record_event(query_uuid, event_type, data);
@@ -1787,9 +1751,8 @@ var manifold = {
                     });
                     data.key = value_key;
                 }
-
-                manifold.query_store.recount(cur_query.query_uuid);
                 manifold.raise_record_event(cur_query.query_uuid, event_type, data);
+*/
 
                 break;