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();
// 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));
})
},
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));
},
/*!
// 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());
},
/*!
* \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) {
/* 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) {
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);
},
// 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
// 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;
//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");
+ }
},
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]);
- }
+ }
});
},
// 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
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 */
* 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)) {
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;
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
*/
/* 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";
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";
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
//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;
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]);
//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)
// we free just this lease
//console.log('this is mine');
scheduler._lease_init_free(this, scheduler._lease_click_mine);
+ event.preventDefault();
},