messages.debug ("<<<<< publish_result_rec " + query.object);
},
- setup_update_query: function(query, records) {
+ setup_update_query: function(query, records)
+ {
// We don't prepare an update query if the result has more than 1 entry
if (records.length != 1)
return;
break;
case TYPE_LIST_OF_RECORDS:
+ var new_state,cur_query_uuid;
+
+ cur_query_uuid = query.analyzed_query.subqueries['resource'].query_uuid;
+
// example: slice.resource
// - update_query_orig.params.resource = resources in slice before update
// - update_query.params.resource = resource requested in slice
var added_keys = $.grep(query_keys, function (x) { return $.inArray(x, update_keys) == -1 });
var removed_keys = $.grep(update_keys, function (x) { return $.inArray(x, query_keys) == -1 });
-
+ // Send events related to parent query
$.each(added_keys, function(i, key) {
- if ($.inArray(key, result_keys) == -1) {
- data = {
- state: STATE_SET,
- key : field,
- op : STATE_SET_IN_FAILURE,
- value: key
- }
- } else {
- data = {
- state: STATE_SET,
- key : field,
- op : STATE_SET_IN_SUCCESS,
- value: key
- }
- }
+ new_state = ($.inArray(key, result_keys) == -1) ? STATE_SET_IN_FAILURE : STATE_SET_IN_SUCCESS;
+
+ // Update record state for children queries
+ manifold.query_store.set_record_state(cur_query_uuid, field, STATE_SET, new_state);
+
+ data = { state: STATE_SET, key : field, op : new_state, value: key }
manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
});
$.each(removed_keys, function(i, key) {
- if ($.inArray(key, result_keys) == -1) {
- data = {
- state: STATE_SET,
- key : field,
- op : STATE_SET_OUT_SUCCESS,
- value: key
- }
- } else {
- data = {
- state: STATE_SET,
- key : field,
- op : STATE_SET_OUT_FAILURE,
- value: key
- }
- }
+ new_state = ($.inArray(key, result_keys) == -1) ? STATE_SET_OUT_SUCCESS : STATE_SET_OUT_FAILURE;
+
+ // Update record state for children queries
+ manifold.query_store.set_record_state(cur_query_uuid, field, STATE_SET, new_state);
+
+ data = { state: STATE_SET, key : field, op : new_state, value: key }
manifold.raise_record_event(query_uuid, FIELD_STATE_CHANGED, data);
});
+
+
+ // Send events related to children queries
+ // XXX
+
break;
}
query_ext.query_state = QUERY_STATE_DONE;
// Send DONE message to plugins
- manifold.raise_record_event(query.query_uuid, DONE);
+ query.iter_subqueries(function(sq, data, parent_query) {
+ manifold.raise_record_event(sq.query_uuid, DONE);
+ });
},
/**
* Event handler helpers
*/
- _get_next_state_add: function(prev_state, event_type)
+ _get_next_state_add: function(prev_state)
{
switch (prev_state) {
case STATE_SET_OUT:
return new_state;
},
- _get_next_state_remove: function(prev_state, event_type)
+ _get_next_state_remove: function(prev_state)
{
switch (prev_state) {
case STATE_SET_IN:
break;
case STATE_SET:
+ var prev_state, new_state;
+ var main_query, record, new_data, path;
+
+ // We only track state in the analyzed query
+ prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
+ if (prev_state === null)
+ prev_state = STATE_SET_OUT;
switch(data.op) {
case STATE_SET_ADD:
- var prev_state, new_state;
- var main_query, record, new_data;
-
- prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
- if (prev_state === null)
- prev_state = STATE_SET_OUT;
- new_state = this._get_next_state_add(prev_state, data.state);
-
- if (!data.key) {
- /* data.value containts the resource key */
- manifold.query_store.add_record(query_uuid, data.value, new_state);
- record = manifold.query_store.get_record(query_uuid, data.value);
- this._enforce_constraints(query_ext, record, data.value, STATE_SET_ADD);
-
- /* Inform the parent query: important for update */
- new_data = {
- state : STATE_SET,
- key : this._get_query_path(query_ext),
- op : STATE_SET_ADD,
- value : data.value,
- };
- main_query = query_ext.main_query_ext.query;
- this.raise_event(main_query.query_uuid, FIELD_STATE_CHANGED, new_data);
-
- new_data.op = new_state;
-
- } else {
- // mainquery: proceed to update
-
- //if ($.inArray(data.value, update_query_orig.params[data.key]) != -1)
- // value.request = FIELD_REQUEST_ADD_RESET;
-
- if (update_query.params[data.key] === undefined)
- update_query.params[data.key] = Array();
- update_query.params[data.key].push(data.value);
-
- new_data = {
- state : STATE_SET,
- key : this._get_query_path(query_ext),// null???
- op : new_state,
- value : data.value,
- }
- }
+ new_state = this._get_next_state_add(prev_state);
- /* Propagate the event to other plugins subscribed to the query */
- manifold.raise_query_event(query_uuid, event_type, new_data);
+ /* data.value containts the resource key */
+ manifold.query_store.add_record(query_uuid, data.value, new_state);
+ record = manifold.query_store.get_record(query_uuid, data.value);
+ this._enforce_constraints(query_ext, record, data.value, STATE_SET_ADD);
+
+ /* Process update query in parent */
+ path = this._get_query_path(query_ext);
+ if (update_query.params[path] === undefined)
+ update_query.params[path] = Array();
+ update_query.params[path].push(data.value);
break;
case STATE_SET_REMOVE:
- var prev_state, new_state;
- var main_query, record, new_data;
-
- prev_state = manifold.query_store.get_record_state(query_uuid, data.value, STATE_SET);
- if (prev_state === null)
- prev_state = STATE_SET_OUT;
- new_state = this._get_next_state_remove(prev_state, data.state);
-
- if (!data.key) {
- /* data.value contains the resource key */
- manifold.query_store.remove_record(query_uuid, data.value, new_state);
- record = manifold.query_store.get_record(query_uuid, data.value);
- this._enforce_constraints(query_ext, record, data.value, STATE_SET_REMOVE);
-
- /* Inform the parent query: important for update */
- new_data = {
- state : STATE_SET,
- key : this._get_query_path(query_ext),
- op : STATE_SET_REMOVE,
- value : data.value,
- };
- main_query = query_ext.main_query_ext.query;
- this.raise_event(main_query.query_uuid, FIELD_STATE_CHANGED, new_data);
-
- new_data.op = new_state
+ new_state = this._get_next_state_remove(prev_state);
+
+ /* data.value contains the resource key */
+ manifold.query_store.remove_record(query_uuid, data.value, new_state);
+ record = manifold.query_store.get_record(query_uuid, data.value);
+ this._enforce_constraints(query_ext, record, data.value, STATE_SET_REMOVE);
- } else {
- // main query: proceed to update
-
- //if ($.inArray(data.value, update_query_orig.params[data.key]) == -1)
- // value.request = FIELD_REQUEST_REMOVE_RESET;
-
- var arr = update_query.params[data.key];
- arr = $.grep(arr, function(x) { return x != data.value; });
- if (update_query.params[data.key] === undefined)
- update_query.params[data.key] = Array();
- update_query.params[data.key] = arr;
-
- new_data = {
- state : STATE_SET,
- key : this._get_query_path(query_ext),// null???
- op : new_state,
- value : data.value,
- }
- }
-
- /* Propagate the event to other plugins subscribed to the query */
- manifold.raise_query_event(query_uuid, event_type, new_data);
+ /* Process update query in parent */
+ path = this._get_query_path(query_ext);
+ arr = update_query.params[path];
+ arr = $.grep(arr, function(x) { return x != data.value; });
+ if (update_query.params[path] === undefined)
+ update_query.params[path] = Array();
+ update_query.params[path] = arr;
break;
}
+
+ /* Inform the parent query: important for update */
+ new_data = {
+ state : STATE_SET,
+ key : path,
+ op : new_state,
+ value : data.value,
+ };
+ main_query = query_ext.main_query_ext.query;
+ manifold.raise_record_event(main_query.query_uuid, event_type, new_data);
+ /* Propagate the event to other plugins subscribed to the query */
+ manifold.query_store.recount(query_uuid);
+ new_data.key = ''
+ manifold.raise_record_event(query_uuid, event_type, new_data);
+
break;
}
-
+/*
// 3. Inform others about the change
// a) the main query...
manifold.raise_record_event(query_uuid, event_type, data);
});
data.key = value_key;
}
-
- manifold.query_store.recount(cur_query.query_uuid);
manifold.raise_record_event(cur_query.query_uuid, event_type, data);
+*/
break;