From 371ac3cd748e44a973ec81eebc3d2ac69c34ccf1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jordan=20Aug=C3=A9?= Date: Fri, 29 Nov 2013 10:27:39 +0100 Subject: [PATCH] updated scheduler plugin --- manifold/static/js/manifold.js | 104 ++++++++++++---------- plugins/scheduler/static/js/scheduler.js | 59 +++++++++--- plugins/scheduler/template/scheduler.html | 2 +- 3 files changed, 105 insertions(+), 60 deletions(-) diff --git a/manifold/static/js/manifold.js b/manifold/static/js/manifold.js index b5085fbe..e4b7db9b 100644 --- a/manifold/static/js/manifold.js +++ b/manifold/static/js/manifold.js @@ -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 diff --git a/plugins/scheduler/static/js/scheduler.js b/plugins/scheduler/static/js/scheduler.js index 6f6908c0..0929157e 100644 --- a/plugins/scheduler/static/js/scheduler.js +++ b/plugins/scheduler/static/js/scheduler.js @@ -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(); }, diff --git a/plugins/scheduler/template/scheduler.html b/plugins/scheduler/template/scheduler.html index b7b00c8f..cd2e9c8e 100644 --- a/plugins/scheduler/template/scheduler.html +++ b/plugins/scheduler/template/scheduler.html @@ -1,4 +1,4 @@ -
+