var IN_PROGRESS = 101;
var DONE = 102;
+/* Update requests from plugins */
var SET_ADD = 201;
var SET_REMOVED = 202;
+/* Query status */
+var STATUS_NONE = 500; // Query has not been started yet
+var STATUS_GET_IN_PROGRESS = 501; // Query has been sent, no result has been received
+var STATUS_GET_RECEIVED = 502; // Success
+var STATUS_GET_ERROR = 503; // Error
+var STATUS_UPDATE_PENDING = 504;
+var STATUS_UPDATE_IN_PROGRESS = 505;
+var STATUS_UPDATE_RECEIVED = 506;
+var STATUS_UPDATE_ERROR = 507;
+// outdated ?
+
// A structure for storing queries
+
+
function QueryExt(query, parent_query, main_query) {
/* Constructor */
if (typeof query == "undefined")
throw "Must pass a query in QueryExt constructor";
- this.query = query
- this.parent_query = (typeof parent_query == "undefined") ? false : parent_query
- this.main_query = (typeof main_query == "undefined") ? false : main_query
-
- // How to link to an update query ? they both have the same UUID !!
-
+ this.query = query
+ this.parent_query_ext = (typeof parent_query == "undefined") ? false : parent_query
+ this.main_query_ext = (typeof main_query == "undefined") ? false : main_query
+
+ this.status = null;
+ this.results = null;
+ this.update_query = null; // null unless we are a main_query (aka parent_query == null); only main_query_fields can be updated...
}
function QueryStore() {
- var main_queries = {};
- var analyzed_queries = {};
+ this.main_queries = {};
+ this.analyzed_queries = {};
/* Insertion */
query.analyze_subqueries();
}
- query_ext = QueryExt(query, null, null)
+ query_ext = new QueryExt(query, null, null)
manifold.query_store.main_queries[query.query_uuid] = query_ext;
// We also need to insert all queries and subqueries from the analyzed_query
+ // XXX We need the root of all subqueries
query.iter_subqueries(function(sq, data, parent_query) {
- parent_query_ext = this.find_analyzed_query_ext(parent_query.query_uuid);
- sq_ext = QueryExt(sq, parent_query_ext, query_ext)
- this.analyzed_queries[sq.query_uuid] = sq_ext;
+ if (parent_query)
+ parent_query_ext = manifold.query_store.find_analyzed_query_ext(parent_query.query_uuid);
+ else
+ parent_query_ext = null;
+ // XXX parent_query_ext == false
+ // XXX main.subqueries = {} # Normal, we need analyzed_query
+ sq_ext = new QueryExt(sq, parent_query_ext, query_ext)
+ manifold.query_store.analyzed_queries[sq.query_uuid] = sq_ext;
});
}
* Query management
**************************************************************************/
- query_store: QueryStore(),
+ query_store: new QueryStore(),
// XXX Remaining functions are deprecated since they are replaced by the query store
* \param ManifoldQuery query Query to be added
*/
insert_query : function (query) {
+ // NEW API
+ manifold.query_store.insert(query);
+
+ // FORMER API
if (query.analyzed_query == null) {
query.analyze_subqueries();
}
raise_event: function(query_uuid, event_type, value)
{
+ // Query uuid has been updated with the key of a new element
+ query_ext = manifold.query_store.find_analyzed_query_ext(query_uuid);
+ query = query_ext.query;
+
switch(event_type) {
case SET_ADD:
- // Query uuid has been updated with the key of a new element
- query = manifold.find_query(query_uuid);
+ // update is only possible is the query is not pending, etc
+ // CHECK status !
+
+ // XXX we can only update subqueries of the main query. Check !
+ // assert query_ext.parent_query == query_ext.main_query
+ update_query = query_ext.parent_query_ext.update_query;
+
+ // NOTE: update might modify the fields in Get
+ // NOTE : we have to modify all child queries
+ // 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
+ // object = the same as get
+ // filter = key : update a single object for now
+ // fields = the same as get
- // XXX We need to find the parent to update the property
- // XXX We need to find the non-analyzed query so that it can be updated also
break;
case SET_REMOVED:
// Query uuid has been updated with the key of a removed element
break;
+ case FILTER_ADDED:
+ break;
+ case FILTER_REMOVED:
+ break;
+ case FIELD_ADDED:
+ main_query = query_ext.main_query_ext.query;
+ main_update_query = query_ext.main_query_ext.update_query;
+ query.select(value);
+
+ // Here we need the full path through all subqueries
+ path = ""
+ // XXX We might need the query name in the QueryExt structure
+ main_query.select(value);
+
+ // XXX When is an update query associated ?
+ // XXX main_update_query.select(value);
+
+ // We need to inform about changes in these queries to the respective plugins
+ // Note: query, main_query & update_query have the same UUID
+ manifold.raise_query_event(query_uuid, event_type, value);
+ // We are targeting the same object with get and update
+ // The notion of query is bad, we should have a notion of destination, and issue queries on the destination
+ // NOTE: Editing a subquery == editing a local view on the destination
+ break;
+
+ case FIELD_REMOVED:
+ query = query_ext.query;
+ main_query = query_ext.main_query_ext.query;
+ main_update_query = query_ext.main_query_ext.update_query;
+ query.unselect(value);
+ main_query.unselect(value);
+
+ // We need to inform about changes in these queries to the respective plugins
+ // Note: query & main_query have the same UUID
+ manifold.raise_query_event(query_uuid, event_type, value);
+ break;
}
+ // XXX We might need to run the new query again and manage the plugins in the meantime with spinners...
+ // For the time being, we will collect all columns during the first query
},
/* Publish/subscribe channels for internal use */