miscell cosmetic
[myslice.git] / manifold / static / js / manifold.js
index 11fad7d..1bb5b97 100644 (file)
@@ -106,7 +106,7 @@ function QueryStore() {
 
     this.insert = function(query) {
         // We expect only main_queries are inserted
-       
+        
         /* If the query has not been analyzed, then we analyze it */
         if (query.analyzed_query == null) {
             query.analyze_subqueries();
@@ -323,9 +323,9 @@ var manifold = {
      * \brief We use js function closure to be able to pass the query (array)
      * to the callback function used when data is received
      */
-    success_closure: function(query, publish_uuid, callback /*domid*/) {
+    success_closure: function(query, publish_uuid, callback) {
         return function(data, textStatus) {
-            manifold.asynchroneous_success(data, query, publish_uuid, callback /*domid*/);
+            manifold.asynchroneous_success(data, query, publish_uuid, callback);
         }
     },
 
@@ -341,29 +341,22 @@ var manifold = {
         //    manifold.raise_record_event(sq.query_uuid, IN_PROGRESS);
         //});
 
-        $.post(manifold.proxy_url, {'json': query_json} , manifold.success_closure(query, null, callback /*domid*/));
+        $.post(manifold.proxy_url, {'json': query_json} , manifold.success_closure(query, null, callback));
     },
 
-    // Executes all async. queries
-    // input queries are specified as a list of {'query_uuid': <query_uuid>, 'id': <possibly null>}
-    asynchroneous_exec : function (query_publish_dom_tuples) {
-        // start spinners
-
-        // in case the spin stuff was not loaded, let's make sure we proceed to the exit 
-        //try {
-        //    if (manifold.asynchroneous_debug) 
-        //   messages.debug("Turning on spin with " + jQuery(".need-spin").length + " matches for .need-spin");
-        //    jQuery('.need-spin').spin(manifold.spin_presets);
-        //} catch (err) { messages.debug("Cannot turn on spins " + err); }
+    // Executes all async. queries - intended for the javascript header to initialize queries
+    // input queries are specified as a list of {'query_uuid': <query_uuid> }
+    // each plugin is responsible for managing its spinner through on_query_in_progress
+    asynchroneous_exec : function (query_exec_tuples) {
         
         // Loop through input array, and use publish_uuid to publish back results
-        jQuery.each(query_publish_dom_tuples, function(index, tuple) {
+        $.each(query_exec_tuples, function(index, tuple) {
             var query=manifold.find_query(tuple.query_uuid);
             var query_json=JSON.stringify (query);
             var publish_uuid=tuple.publish_uuid;
             // by default we publish using the same uuid of course
             if (publish_uuid==undefined) publish_uuid=query.query_uuid;
-            if (manifold.asynchroneous_debug) {
+            if (manifold.publish_result_debug) {
                 messages.debug("sending POST on " + manifold.proxy_url + query.__repr());
             }
 
@@ -373,8 +366,8 @@ var manifold = {
 
             // not quite sure what happens if we send a string directly, as POST data is named..
             // this gets reconstructed on the proxy side with ManifoldQuery.fill_from_POST
-            jQuery.post(manifold.proxy_url, {'json':query_json}, 
-                       manifold.success_closure(query, publish_uuid, tuple.callback /*domid*/));
+            $.post(manifold.proxy_url, {'json':query_json}, 
+                   manifold.success_closure(query, publish_uuid, tuple.callback));
         })
     },
 
@@ -382,13 +375,11 @@ var manifold = {
      * \brief Forward a query to the manifold backend
      * \param query (dict) the query to be executed asynchronously
      * \param callback (function) the function to be called when the query terminates
-     * Deprecated:
-     * \param domid (string) the domid to be notified about the results (null for using the pub/sub system
      */
-    forward: function(query, callback /*domid*/) {
+    forward: function(query, callback) {
         var query_json = JSON.stringify(query);
         $.post(manifold.proxy_url, {'json': query_json} , 
-              manifold.success_closure(query, query.query_uuid, callback/*domid*/));
+               manifold.success_closure(query, query.query_uuid, callback));
     },
 
     /*!
@@ -418,22 +409,27 @@ var manifold = {
 
         // NEW PLUGIN API
         manifold.raise_record_event(query.query_uuid, CLEAR_RECORDS);
-        if (manifold.publish_result_debug) messages.debug(".. publish_result (1) ");
-       var count=0;
+        if (manifold.publish_result_debug)
+            messages.debug(".. publish_result (1) ");
+        var count=0;
         $.each(result, function(i, record) {
             manifold.raise_record_event(query.query_uuid, NEW_RECORD, record);
-           count += 1;
+            count += 1;
         });
-        if (manifold.publish_result_debug) messages.debug(".. publish_result NEW API (2) count=" + count);
+        if (manifold.publish_result_debug) 
+            messages.debug(".. publish_result NEW API (2) count=" + count);
         manifold.raise_record_event(query.query_uuid, DONE);
 
         // OLD PLUGIN API BELOW
         /* Publish an update announce */
         var channel="/results/" + query.query_uuid + "/changed";
-        if (manifold.publish_result_debug) messages.debug(".. publish_result OLD API (3) " + channel);
-        jQuery.publish(channel, [result, query]);
+        if (manifold.publish_result_debug) 
+            messages.debug(".. publish_result OLD API (3) " + channel);
+
+        $.publish(channel, [result, query]);
 
-       if (manifold.publish_result_debug) messages.debug(".. publish_result - END (4) q=" + query.__repr());
+        if (manifold.publish_result_debug) 
+            messages.debug(".. publish_result - END (4) q=" + query.__repr());
     },
 
     /*!
@@ -442,23 +438,30 @@ var manifold = {
      * \memberof Manifold
      * \param ManifoldQuery query Query which has received result
      * \param array result result corresponding to query
+     *
+     * Note: this function works on the analyzed query
      */
     publish_result_rec: function(query, result) {
         /* If the result is not unique, only publish the top query;
          * otherwise, publish the main object as well as subqueries
          * XXX how much recursive are we ?
          */
-       if (manifold.publish_result_debug) messages.debug (">>>>> publish_result_rec " + query.object);
+        if (manifold.publish_result_debug)
+            messages.debug (">>>>> publish_result_rec " + query.object);
         if (manifold.query_expects_unique_result(query)) {
             /* Also publish subqueries */
-            jQuery.each(query.subqueries, function(object, subquery) {
+            $.each(query.subqueries, function(object, subquery) {
                 manifold.publish_result_rec(subquery, result[0][object]);
                 /* TODO remove object from result */
             });
         }
-       if (manifold.publish_result_debug) messages.debug ("===== publish_result_rec " + query.object);
+        if (manifold.publish_result_debug) 
+            messages.debug ("===== publish_result_rec " + query.object);
+
         manifold.publish_result(query, result);
-       if (manifold.publish_result_debug) messages.debug ("<<<<< publish_result_rec " + query.object);
+
+        if (manifold.publish_result_debug) 
+            messages.debug ("<<<<< publish_result_rec " + query.object);
     },
 
     setup_update_query: function(query, records) {
@@ -509,7 +512,7 @@ var manifold = {
         this.setup_update_query(query, records);
 
         /* Publish full results */
-        tmp_query = manifold.find_query(query.query_uuid);
+        var tmp_query = manifold.find_query(query.query_uuid);
         manifold.publish_result_rec(tmp_query.analyzed_query, records);
     },
 
@@ -693,35 +696,25 @@ var manifold = {
         }
     },
 
-    // if set domid allows the result to be directed to just one plugin
+    // if set callback is provided it is called
     // most of the time publish_uuid will be query.query_uuid
     // however in some cases we wish to publish the result under a different uuid
     // e.g. an updater wants to publish its result as if from the original (get) query
-    asynchroneous_success : function (data, query, publish_uuid, callback /*domid*/) {
+    asynchroneous_success : function (data, query, publish_uuid, callback) {
         // xxx should have a nicer declaration of that enum in sync with the python code somehow
-       
-       var start = new Date();
-       if (manifold.asynchroneous_debug)
-           messages.debug(">>>>>>>>>> asynchroneous_success query.object=" + query.object);
-
-        /* If a callback has been specified, we redirect results to it */
-        if (!!callback) { 
-           callback(data); 
-           if (manifold.asynchroneous_debug) {
-               duration=new Date()-start;
-               messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- callback ended " + duration + " ms");
-           }
-           return; 
-       }
+        
+        var start = new Date();
+        if (manifold.asynchroneous_debug)
+            messages.debug(">>>>>>>>>> asynchroneous_success query.object=" + query.object);
 
         if (data.code == 2) { // ERROR
             // We need to make sense of error codes here
             alert("Your session has expired, please log in again");
             window.location="/logout/";
-           if (manifold.asynchroneous_debug) {
-               duration=new Date()-start;
-               messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- error returned - logging out " + duration + " ms");
-           }
+            if (manifold.asynchroneous_debug) {
+                duration=new Date()-start;
+                messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- error returned - logging out " + duration + " ms");
+            }
             return;
         }
         if (data.code == 1) { // WARNING
@@ -730,18 +723,20 @@ var manifold = {
             if (publish_uuid)
                 $.publish("/results/" + publish_uuid + "/failed", [data.code, data.description] );
 
-/* DEMO - Debug Messages desactivated
-            $("#notifications").notify("create", "sticky", {
-              title: 'Warning',
-              text: data.description
-            },{
-              expires: false,
-              speed: 1000
-            });
-*/
         }
-       if (manifold.asynchroneous_debug) 
-           messages.debug ("========== asynchroneous_success " + query.object + " -- before process_query_records");
+
+        // If a callback has been specified, we redirect results to it 
+        if (!!callback) { 
+            callback(data); 
+            if (manifold.asynchroneous_debug) {
+                duration=new Date()-start;
+                messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- callback ended " + duration + " ms");
+            }
+            return; 
+        }
+
+        if (manifold.asynchroneous_debug) 
+            messages.debug ("========== asynchroneous_success " + query.object + " -- before process_query_records");
 
         // once everything is checked we can use the 'value' part of the manifoldresult
         var result=data.value;
@@ -753,10 +748,10 @@ var manifold = {
             //tmp_query = manifold.find_query(query.query_uuid);
             //manifold.publish_result_rec(tmp_query.analyzed_query, result);
         }
-       if (manifold.asynchroneous_debug) {
-           duration=new Date()-start;
-           messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- done " + duration + " ms");
-       }
+        if (manifold.asynchroneous_debug) {
+            duration=new Date()-start;
+            messages.debug ("<<<<<<<<<< asynchroneous_success " + query.object + " -- done " + duration + " ms");
+        }
 
     },
 
@@ -767,15 +762,23 @@ var manifold = {
     raise_event_handler: function(type, query_uuid, event_type, value) {
         if ((type != 'query') && (type != 'record'))
             throw 'Incorrect type for manifold.raise_event()';
+        // xxx we observe quite a lot of incoming calls with an undefined query_uuid
+        // this should be fixed upstream
+        if (query_uuid === undefined) {
+            messages.warning("undefined query in raise_event_handler");
+            return;
+        }
 
+        // notify the change to objects that either listen to this channel specifically,
+        // or to the wildcard channel
         var channels = [ manifold.get_channel(type, query_uuid), manifold.get_channel(type, '*') ];
 
         $.each(channels, function(i, channel) {
             if (value === undefined) {
                 $('.plugin').trigger(channel, [event_type]);
-           } else {
+            } else {
                 $('.plugin').trigger(channel, [event_type, value]);
-           }
+            }
         });
     },
 
@@ -808,11 +811,15 @@ var manifold = {
 
                 switch(value.request) {
                     case FIELD_REQUEST_CHANGE:
+                        if (update_query.params[value.key] === undefined)
+                            update_query.params[value.key] = Array();
                         update_query.params[value.key] = value.value;
                         break;
                     case FIELD_REQUEST_ADD:
                         if ($.inArray(value.value, update_query_orig.params[value.key]) != -1)
                             value.request = FIELD_REQUEST_ADD_RESET;
+                        if (update_query.params[value.key] === undefined)
+                            update_query.params[value.key] = Array();
                         update_query.params[value.key].push(value.value);
                         break;
                     case FIELD_REQUEST_REMOVE:
@@ -821,6 +828,8 @@ var manifold = {
 
                         var arr = update_query.params[value.key];
                         arr = $.grep(arr, function(x) { return x != value.value; });
+                        if (update_query.params[value.key] === undefined)
+                            update_query.params[value.key] = Array();
                         update_query.params[value.key] = arr;
 
                         break;
@@ -893,7 +902,7 @@ var manifold = {
                 // NOTE : parts of a query might not be started (eg slice.measurements, how to handle ?)
 
                 // if everything is done right, update_query should not be null. 
-               // It is updated when we received results from the get query
+                // It is updated when we received results from the get query
                 // object = the same as get
                 // filter = key : update a single object for now
                 // fields = the same as get