updated scheduler plugin
authorJordan Augé <jordan.auge@lip6.fr>
Fri, 29 Nov 2013 09:27:39 +0000 (10:27 +0100)
committerJordan Augé <jordan.auge@lip6.fr>
Fri, 29 Nov 2013 09:27:39 +0000 (10:27 +0100)
manifold/static/js/manifold.js
plugins/scheduler/static/js/scheduler.js
plugins/scheduler/template/scheduler.html

index b5085fb..e4b7db9 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();
@@ -367,7 +367,7 @@ 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
             $.post(manifold.proxy_url, {'json':query_json}, 
-                  manifold.success_closure(query, publish_uuid, tuple.callback));
+                   manifold.success_closure(query, publish_uuid, tuple.callback));
         })
     },
 
@@ -379,7 +379,7 @@ var manifold = {
     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));
+               manifold.success_closure(query, query.query_uuid, callback));
     },
 
     /*!
@@ -409,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);
+        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());
     },
 
     /*!
@@ -433,13 +438,16 @@ 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 */
             $.each(query.subqueries, function(object, subquery) {
@@ -447,9 +455,13 @@ var manifold = {
                 /* 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) {
@@ -500,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);
     },
 
@@ -690,19 +702,19 @@ var manifold = {
     // e.g. an updater wants to publish its result as if from the original (get) query
     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);
+        
+        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
@@ -715,16 +727,16 @@ var manifold = {
 
         // 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; 
-       }
+            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");
+        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;
@@ -736,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");
+        }
 
     },
 
@@ -750,23 +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
+        // 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]);
-           }
+            }
         });
     },
 
@@ -890,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
index 6f6908c..0929157 100644 (file)
@@ -78,7 +78,7 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             this.min_granularity = this.default_granularity;
 
             // the data contains slice names, and lease_id, we need this to find our own leases (mine)
-            this.paper=null;
+            this._paper=null;
 
 
             /* XXX Events */
@@ -173,6 +173,10 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
          * All resources
          * ------------------------------------------------------------------ */
 
+        on_all_resources_query_in_progress: function() {
+            console.log("all resources query in progress");
+        },
+
         on_all_resources_new_record: function(record)
         {
             if ((typeof record.exclusive != 'undefined') && (record.exclusive)) {
@@ -196,20 +200,27 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
 
         on_lease_field_state_changed: function(data)
         {
+            var lease = data.value;
+            var urn = lease[0];
+            var start_time = lease[1];
+
+            var lease_element = this._lease_element_find(urn, start_time);
+            if (!lease_element) {
+                console.log("Alert: lease element not found");
+                return;
+            }
+
             switch(data.request) {
                 case FIELD_REQUEST_ADD:
                 case FIELD_REQUEST_ADD_RESET:
                     this._leases.push(data.value);
-                    /* XXX Not optimal, we could only redraw the right cell */
-                    /* We need a mapping between the lease and the cell */
-                    /* How is it done in d3 ? based on key */
-                    this._draw();
+                    this._lease_init_mine(lease_element);
                     break;
                 case FIELD_REQUEST_REMOVE:
                 case FIELD_REQUEST_REMOVE_RESET:
                     // We remove data.value (aka keep those leases different from data.value
                     this._leases = $.grep(this._leases, function(x) { return x != data.value; });
-                    this._draw();
+                    this._lease_init_free(lease_element);
                     break;
                 default:
                     break;
@@ -271,6 +282,19 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             return result;
         },
 
+        /* Iterative search through raphael.js objects, no forEach, no getById in the current version */
+        _lease_element_find: function(urn, start_time)
+        {
+            var date = new Date(start_time*1000);
+            var pos = this._paper.top; 
+            while (pos) { 
+                 if (pos.key == urn + "-" + date)
+                    return pos;
+                 pos = pos.prev; 
+            } 
+            return null;
+        },
+
         /**
          * @brief Draw
          */
@@ -287,17 +311,17 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
 
             /* reuse for paper if exists with same size, or (re-)create otherwise */
             var paper;
-            if (this.paper == null) {
+            if (this._paper == null) {
                 paper = Raphael (canvas_id, total_width + o.x_sep, total_height);
-            } else if (this.paper.width==total_width && this.paper.height==total_height) {
-                paper=this.paper;
+            } else if (this._paper.width==total_width && this._paper.height==total_height) {
+                paper=this._paper;
                 paper.clear();
             } else {
                 $("#"+canvas_id)[0].innerHTML="";
                 //this.elmt().html();
                 paper = Raphael (canvas_id, total_width + o.x_sep, total_height);
             }
-            this.paper = paper;
+            this._paper = paper;
 
             /* the path for the triangle-shaped buttons */
             var timebutton_path = "M1,0L"+(this.options.leases_w-1)+",0L"+(this.options.leases_w/2)+","+o.y_header+"L1,0";
@@ -416,7 +440,6 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
                     lease.nodename  = nodename;
                     lease.urn       = urn;
                     lease.nodelabel = nodelabel;
-                    lease.id        = 0; /* XXX how to use CSS selector to find a given lease... */ 
 
                     if (slicename == "") {
                         lease.initial = "free";
@@ -428,9 +451,14 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
                         lease.initial = "other";
                         this._lease_init_other(lease, slicename);
                     }
+
                     lease.from_time = axisx[grain % this.nb_grains()][0];
                     grain += duration;
                     lease.until_time = axisx[grain % this.nb_grains()][0];
+
+                    /* We set a key to the lease element to find it later in the paper thanks to this._lease_element_find() */
+                    lease.key        = urn + '-' + lease.from_time;
+
                     // and vice versa
                     this._lease_elements.push(lease);
                     // move on with the loop
@@ -601,11 +629,12 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             //this.urn
             //this.until_time
             var urn        = this.urn
-            var start_time = new Date(this.from_time).getTime() / 1000;        
-            var end_time   = new Date(this.until_time).getTime() / 1000;
+            var start_time = this.from_time.getTime() / 1000;        
+            var end_time   = this.until_time.getTime() / 1000;
             var duration   = (end_time - start_time) / 1800; // XXX HARDCODED LEASE GRAIN
 
             /* Add a new lease : XXX should be replaced by a dictionary */
+            /*
             // Do we have a lease with the same urn  just before or just after ?
             //var removeIdBefore = null;
             //var removeIdAfter  = null;
@@ -646,10 +675,12 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             var new_lease = [this.urn, start_time, duration];
 
             // We send events, manifold will inform us about the change and we will react accordingly
+            /*
             if (remove_lease_before != null)
                 manifold.raise_event(scheduler.options.query_lease_uuid, SET_REMOVED, remove_lease_before);
             if (remove_lease_after != null)
                 manifold.raise_event(scheduler.options.query_lease_uuid, SET_REMOVED, remove_lease_after);
+            */
             manifold.raise_event(scheduler.options.query_lease_uuid, SET_ADD,     new_lease);
             //scheduler._leases.push([this.urn, start_time, duration]);
 
@@ -657,6 +688,7 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             //jQuery.publish('/update-set/' + scheduler.options.query_uuid, [scheduler._leases]);
 
             /* We need to inform manifold about the whole diff, in addition to maintaining our own structure */
+            event.preventDefault();
         },
 
         _lease_init_mine: function (lease, unclick) 
@@ -677,6 +709,7 @@ var txt_otherslice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-s
             // we free just this lease
             //console.log('this is mine');
             scheduler._lease_init_free(this, scheduler._lease_click_mine);
+            event.preventDefault();
         },
 
 
index b7b00c8..cd2e9c8 100644 (file)
@@ -1,4 +1,4 @@
-<div id="{{domid}}__scheduler" class='plugin scrollx scrolly'>
+<div id="{{domid}}__scheduler" class='scrollx scrolly'>
 <!--
 <p>
   You have attached one or more reservable nodes to your slice.  Reservable nodes