return query_ext.records.get(record_key);
}
+ this.del_record = function(query_uuid, record_key)
+ {
+ var query_ext = this.find_analyzed_query_ext(query_uuid);
+ return query_ext.records.remove(record_key);
+ }
+
this.add_record = function(query_uuid, record, new_state)
{
var query_ext, key, record_key;
} else {
record_key = record;
}
-
- manifold.query_store.set_record_state(query_uuid, record_key, STATE_SET, new_state);
+
+ if ((query_ext.query.object == 'lease') && (new_state == STATE_SET_OUT)) {
+ // Leases that are marked out are in fact leases from other slices
+ // We need to _remove_ leases that we mark as OUT
+ manifold.query_store.del_record(query_uuid, record_key);
+ } else {
+ manifold.query_store.set_record_state(query_uuid, record_key, STATE_SET, new_state);
+ }
}
this.iter_records = function(query_uuid, callback)
if (query_ext.set_query_ext) {
// We have a domain query
// The results are stored in the corresponding set_query
- if (query.object == 'lease') {
- // temp fix for leases_all
- manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records, STATE_SET_IN);
- } else {
- manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
- }
+ manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
} else if (query_ext.domain_query_ext) {
// We have a set query, it is only used to determine which objects are in the set, we should only retrieve the key
// Has it a domain query, and has it completed ?
- if (query.object == 'lease') {
- $.noop(); // slice leases should be included in the results from the domain query lease_all
- } else {
- $.each(records, function(i, record) {
- var key = manifold.metadata.get_key(query.object);
- var record_key = manifold.record_get_value(record, key);
- manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
- });
- }
+ $.each(records, function(i, record) {
+ var key = manifold.metadata.get_key(query.object);
+ var record_key = manifold.record_get_value(record, key);
+ manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
+ });
} else {
// We have a normal query
data = { state: STATE_SET, key : field, op : new_state, value: added_key }
manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
+
+ // Inform subquery also
+ data.key = '';
+ manifold.raise_record_event(cur_query_uuid, FIELD_STATE_CHANGED, data);
+ // XXX Passing no parameters so that they can redraw everything would
+ // be more efficient but is currently not supported
+ // XXX We could also need to inform plugins about nodes IN (not pending) that are no more, etc.
+ // XXX refactor all this when suppressing update_queries, and relying on state instead !
});
$.each(removed_keys, function(i, removed_key) {
new_state = (manifold._in_array(removed_key, result_keys, key)) ? STATE_SET_OUT_FAILURE : STATE_SET_OUT_SUCCESS;
data = { state: STATE_SET, key : field, op : new_state, value: removed_key }
manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
+
+ // Inform subquery also
+ data.key = '';
+ manifold.raise_record_event(cur_query_uuid, FIELD_STATE_CHANGED, data);
});
break;
var query_ext = manifold.query_store.find_query_ext(query.query_uuid);
query_ext.query_state = QUERY_STATE_DONE;
+
// Send DONE message to plugins
query.iter_subqueries(function(sq, data, parent_query) {
manifold.raise_record_event(sq.query_uuid, DONE);
}
},
- _enforce_constraints: function(query_ext, record, resource_key, event_type)
+ _enforce_constraints: function(query_ext, record, record_key, event_type)
{
var query, data;
// XXX Not always a resource
var is_reservable = (record.exclusive == true);
if (is_reservable) {
- var warnings = manifold.query_store.get_record_state(query.query_uuid, resource_key, STATE_WARNINGS);
+ var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
if (event_type == STATE_SET_ADD) {
// We should have a lease_query associated
var lease_query = query_ext.parent_query_ext.query.subqueries['lease']; // in options
var lease_query_ext = manifold.query_store.find_analyzed_query_ext(lease_query.query_uuid);
// Do we have lease records (in) with this resource
- var lease_records = $.grep(lease_query_ext.records.entries(), this._grep_active_lease_callback(lease_query, resource_key));
+ var lease_records = $.grep(lease_query_ext.records.entries(), this._grep_active_lease_callback(lease_query, record_key));
if (lease_records.length == 0) {
// Sets a warning
// XXX Need for a better function to manage warnings
delete warnings[CONSTRAINT_RESERVABLE_LEASE];
}
- manifold.query_store.set_record_state(query.query_uuid, resource_key, STATE_WARNINGS, warnings);
+ manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
}
/* This was redundant */
// Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
data = {
state: STATE_WARNINGS,
- key : resource_key,
+ key : record_key,
op : null,
value : warnings
}
break;
case 'lease':
- var resource_key = record.resource;
+ var resource_key = record_key.resource;
var resource_query = query_ext.parent_query_ext.query.subqueries['resource'];
var warnings = manifold.query_store.get_record_state(resource_query.query_uuid, resource_key, STATE_WARNINGS);
// XXX how do we handle status reset ?
// Jordan : I don't understand this. I added this test otherwise we have string = ""..."" double quoted twice.
- if (typeof(data.value) !== "string")
- data.value = JSON.stringify(data.value);
data.selected_resources = this.selected_resources;
row = this.find_row(data.value);
- newline = [action, data.key, data.value, msg, button];
+ if (typeof(data.value) !== "string")
+ newline = [action, data.key, JSON.stringify(data.value), msg, button];
+ else
+ newline = [action, data.key, data.value, msg, button];
if (!row) {
// XXX second parameter refresh = false can improve performance. todo in querytable also
this.table.fnAddData(newline);
cursor: not-allowed;\r
}\r
\r
+#scheduler-reservation-table tbody tr td.success {\r
+ content: "✓";\r
+}\r
+#scheduler-reservation-table tbody tr td.failure {\r
+ content: "✗";\r
+}\r
+\r
#scheduler-reservation-table tbody tr td.maintenance {\r
background: url("../img/tools-15.png") no-repeat scroll 50% 50% #EDA428;\r
}\r
var self = this;\r
var scope = this._get_scope();\r
\r
- var leases = manifold.query_store.get_records(this.options.query_lease_uuid);\r
- $.each(leases, function(i, lease) {\r
+ manifold.query_store.iter_records(this.options.query_lease_uuid, function(lease_key, lease) {\r
\r
- console.log("SET LEASES", new Date(lease.start_time* 1000));\r
- console.log(" ", new Date(lease.end_time* 1000));\r
+ console.log("SET LEASES", lease.resource, new Date(lease.start_time* 1000), new Date(lease.end_time* 1000));\r
// XXX We should ensure leases are correctly merged, otherwise our algorithm won't work\r
\r
// Populate leases by resource array: this will help us merging leases later\r
scope._leases_by_resource[lease.resource] = [];\r
scope._leases_by_resource[lease.resource].push(lease);\r
\r
- var resource = self.scope_resources_by_key[lease.resource];\r
- var day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
+ self._set_lease_slots(lease_key, lease);\r
\r
- var id_start = (lease.start_time - day_timestamp) / resource.granularity;\r
-\r
- /* Some leases might be in the past */\r
- if (id_start < 0)\r
- id_start = 0;\r
- /* Leases in the future: ignore */\r
- if (id_start >= self._all_slots.length)\r
- return true; // ~ continue\r
- \r
- var id_end = (lease.end_time - day_timestamp) / resource.granularity - 1;\r
- var colspan_lease = resource.granularity / self._granularity; //eg. 3600 / 1800 => 2 cells\r
- if (id_end >= self._all_slots.length / colspan_lease) {\r
- /* Limit the display to the current day */\r
- id_end = self._all_slots.length / colspan_lease\r
- }\r
-\r
- for (i = id_start; i <= id_end; i++)\r
- // the same slots might be affected multiple times.\r
- // PENDING_IN + PENDING_OUT => IN \r
- //\r
- // RESERVED vs SELECTED !\r
- //\r
- // PENDING !!\r
- resource.leases[i].status = 'selected'; \r
});\r
},\r
\r
on_leases_filter_removed: function(filter) { this._get_scope().$apply(); },\r
on_leases_filter_clear: function() { this._get_scope().$apply(); },\r
\r
+ on_field_state_changed: function(data)\r
+ {\r
+ /*\r
+ this._set_lease_slots(lease_key, lease);\r
+\r
+ switch(data.state) {\r
+ case STATE_SET:\r
+ switch(data.op) {\r
+ case STATE_SET_IN:\r
+ case STATE_SET_IN_SUCCESS:\r
+ case STATE_SET_OUT_FAILURE:\r
+ this.set_checkbox_from_data(data.value, true);\r
+ this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_RESET);\r
+ break; \r
+ case STATE_SET_OUT:\r
+ case STATE_SET_OUT_SUCCESS:\r
+ case STATE_SET_IN_FAILURE:\r
+ this.set_checkbox_from_data(data.value, false);\r
+ this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_RESET);\r
+ break;\r
+ case STATE_SET_IN_PENDING:\r
+ this.set_checkbox_from_data(data.key, true);\r
+ this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_ADDED);\r
+ break; \r
+ case STATE_SET_OUT_PENDING:\r
+ this.set_checkbox_from_data(data.key, false);\r
+ this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_REMOVED);\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case STATE_WARNINGS:\r
+ this.change_status(data.key, data.value);\r
+ break;\r
+ }\r
+ */\r
+ },\r
+\r
+\r
/* INTERNAL FUNCTIONS */\r
\r
+ _set_lease_slots: function(lease_key, lease)\r
+ {\r
+ var resource, lease_status, lease_class;\r
+ var day_timestamp, id_start, id_end, colspan_lease;\r
+\r
+ resource = this.scope_resources_by_key[lease.resource];\r
+ day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
+ id_start = (lease.start_time - day_timestamp) / resource.granularity;\r
+\r
+ /* Some leases might be in the past */\r
+ if (id_start < 0)\r
+ id_start = 0;\r
+ /* Leases in the future: ignore */\r
+ if (id_start >= this._all_slots.length)\r
+ return true; // ~ continue\r
+\r
+ id_end = (lease.end_time - day_timestamp) / resource.granularity - 1;\r
+ colspan_lease = resource.granularity / this._granularity; //eg. 3600 / 1800 => 2 cells\r
+ if (id_end >= this._all_slots.length / colspan_lease) {\r
+ /* Limit the display to the current day */\r
+ id_end = this._all_slots.length / colspan_lease\r
+ }\r
+\r
+ for (i = id_start; i <= id_end; i++) {\r
+ // the same slots might be affected multiple times.\r
+ // PENDING_IN + PENDING_OUT => IN \r
+ //\r
+ // RESERVED vs SELECTED !\r
+ //\r
+ // PENDING !!\r
+ lease_status = manifold.query_store.get_record_state(this.options.query_lease_uuid, lease_key, STATE_SET);\r
+ switch(lease_status) {\r
+ case STATE_SET_IN:\r
+ lease_class = 'selected'; // my leases\r
+ lease_success = '';\r
+ break;\r
+ case STATE_SET_IN_SUCCESS:\r
+ lease_class = 'selected'; // my leases\r
+ lease_success = 'success';\r
+ case STATE_SET_OUT_FAILURE:\r
+ lease_class = 'selected'; // my leases\r
+ lease_success = 'failure';\r
+ break;\r
+ case STATE_SET_OUT:\r
+ lease_class = 'reserved'; // other leases\r
+ lease_success = '';\r
+ break;\r
+ case STATE_SET_OUT_SUCCESS:\r
+ lease_class = 'reserved'; // other leases\r
+ lease_success = 'success';\r
+ break;\r
+ case STATE_SET_IN_FAILURE:\r
+ lease_class = 'reserved'; // other leases\r
+ lease_success = 'failure';\r
+ break;\r
+ case STATE_SET_IN_PENDING:\r
+ lease_class = 'pendingin';\r
+ lease_success = '';\r
+ break;\r
+ case STATE_SET_OUT_PENDING:\r
+ lease_class = 'pendingout';\r
+ lease_success = '';\r
+ break;\r
+ \r
+ }\r
+ resource.leases[i].status = lease_class;\r
+ resource.leases[i].success = lease_success;\r
+ }\r
+ },\r
+\r
/* XXX IN TEMPLATE XXX\r
if (SchedulerDataViewData.length == 0) {\r
$("#plugin-scheduler").hide();\r
data-slotid="{[{ lease.id }]}" \r
data-groupid="{[{ lease.groupid }]}" \r
ng-class="{{ 'lease.status' }}"\r
+ ng-class="{{ 'lease.success' }}"\r
colspan="{[{resource.granularity / granularity}]}"\r
ng-click="select(from+$index, lease, $parent.resource)">\r
</td>\r