-function ManifoldQuery(action, method, timestamp, filters, params, fields, unique, uuid, aq, sq)
-{
+function ManifoldQuery(action, object, timestamp, filters, params, fields, unique, query_uuid, aq, sq) {
// get, update, delete, create
var action;
-
- // slice, user, network... : Metadata
- var method;
-
+ // slice, user, network...
+ var object;
// timestamp, now, latest(cache) : date of the results queried
var timestamp;
-
// key(field),op(=<>),value
var filters;
-
// todo
var params;
-
- // hostname, ip,... : Metadata
+ // hostname, ip,...
var fields;
-
// 0,1 : list of element of an object or single object
var unique;
-
- // uuid : unique identifier of a query
- var uuid;
-
+ // query_uuid : unique identifier of a query
+ var query_uuid;
// Query : root query (no sub-Query)
var analyzed_query;
-
// {} : Assoc Table of sub-queries ["resources"->subQ1, "users"->subQ2]
var subqueries;
/*-------------------------------------------------------------
Query properties are SQL like :
---------------------------------------------------------------
-SELECT fields FROM method WHERE filter;
-UPDATE method SET field=value WHERE filter; / returns SELECT
-DELETE FROM method WHERE filter
-INSERT INTO method VALUES(field=value)
+SELECT fields FROM object WHERE filter;
+UPDATE object SET field=value WHERE filter; / returns SELECT
+DELETE FROM object WHERE filter
+INSERT INTO object VALUES(field=value)
-------------------------------------------------------------*/
+ this.__repr = function () {
+ res = "ManifoldQuery ";
+ res += " id=" + this.query_uuid;
+ res += " a=" + this.action;
+ res += " o=" + this.object;
+ res += " ts=" + this.timestamp;
+ res += " flts=" + this.filters;
+ res += " flds=" + this.fields;
+ res += " prms=" + this.params;
+ return res;
+ }
+
this.clone = function() {
q = new ManifoldQuery();
return jQuery.extend(true, q, this);
}
+
this.add_filter = function(key, op, value) {
this.filters.push(new Array(key, op, value));
}
}
this.filters.push(new Array(key, op, value));
}
- this.remove_filter = function (key,op,value){
+
+ this.remove_filter = function (key,op,value) {
// if operator is null then remove all occurences of this key
if(!op){
this.filters = jQuery.grep(this.filters, function(val, i) {
this.filters = jQuery.grep(this.filters, function(val, i) {return (val[0] != key || val[1] != op);});
}
}
+
// FIXME These functions computing diff's between queries are meant to be shared
- this.diff_fields = function (otherQuery)
- {
+ this.diff_fields = function(otherQuery) {
var f1 = this.fields;
var f2 = otherQuery.fields;
var removed = jQuery.grep(f1, function (x) { return jQuery.inArray(x, f2) == -1 });
return {'added':added, 'removed':removed};
- }
+ }
+
// FIXME Modify filter to filters
- this.diff_filter = function (otherQuery)
- {
+ this.diff_filter = function(otherQuery) {
var f1 = this.filters;
var f2 = otherQuery.filters;
return {'added':added, 'removed':removed};
}
- this.to_hash = function() {
- return {'action': this.action, 'method': this.method, 'timestamp': this.timestamp,
- 'filters': this.filters, 'params': this.params, 'fields': this.fields};
+
+ // Callaback received 3 parameters: query, data, parent_query
+ this.iter_subqueries = function(callback, data)
+ {
+ rec = function(query, callback, data, parent_query) {
+ callback(query, data, parent_query);
+ jQuery.each(query.subqueries, function(object, subquery) {
+ rec(subquery, callback, data, query);
+ });
+ };
+
+ if (this.analyzed_query !== undefined)
+ query = this.analyzed_query;
+ else
+ query = this;
+
+ rec(query, callback, data, null);
}
+
+ this.select = function(field)
+ {
+ this.fields.push(field);
+ }
+
+ this.unselect = function(field)
+ {
+ this.fields = $.grep(this.fields, function(x) { return x != field; });
+ }
+
+// we send queries as a json string now
+// this.as_POST = function() {
+// return {'action': this.action, 'object': this.object, 'timestamp': this.timestamp,
+// 'filters': this.filters, 'params': this.params, 'fields': this.fields};
+// }
this.analyze_subqueries = function() {
/* adapted from the PHP function in com_tophat/includes/query.php */
var q = new ManifoldQuery();
- q.uuid = this.uuid;
+ q.query_uuid = this.query_uuid;
q.action = this.action;
- q.method = this.method;
+ q.object = this.object;
q.timestamp = this.timestamp;
/* Filters */
var v = filter[2];
var pos = k.indexOf('.');
if (pos != -1) {
- var method = k.substr(0, pos);
+ var object = k.substr(0, pos);
var field = k.substr(pos+1);
- if (jQuery.inArray(this.method, q.subqueries) == -1) {
- q.subqueries[this.method] = new ManifoldQuery();
- q.subqueries[this.method].action = this.action;
- q.subqueries[this.method].method = this.method;
- q.subqueries[this.method].timestamp = this.timestamp;
+ if (!q.subqueries[object]) {
+ q.subqueries[object] = new ManifoldQuery();
+ q.subqueries[object].action = q.action;
+ q.subqueries[object].object = object;
+ q.subqueries[object].timestamp = q.timestamp;
}
- q.subqueries[this.method].filters.push(Array(field, op, v));
+ q.subqueries[object].filters.push(Array(field, op, v));
} else {
- q.filters.push(this.filter);
+ q.filters.push(filter);
}
});
jQuery.each(this.params, function(param, value) {
var pos = param.indexOf('.');
if (pos != -1) {
- var method = param.substr(0, pos);
+ var object = param.substr(0, pos);
var field = param.substr(pos+1);
- if (jQuery.inArray(this.method, q.subqueries) == -1) {
- q.subqueries[this.method] = new ManifoldQuery();
- q.subqueries[this.method].action = this.action;
- q.subqueries[this.method].method = this.method;
- q.subqueries[this.method].timestamp = this.timestamp;
+ if (!q.subqueries[object]) {
+ q.subqueries[object] = new ManifoldQuery();
+ q.subqueries[object].action = q.action;
+ q.subqueries[object].object = object;
+ q.subqueries[object].timestamp = q.timestamp;
}
- q.subqueries[this.method].params[field] = value;
+ q.subqueries[object].params[field] = value;
} else {
q.params[field] = value;
}
jQuery.each(this.fields, function(i, v) {
var pos = v.indexOf('.');
if (pos != -1) {
- var method = v.substr(0, pos);
+ var object = v.substr(0, pos);
var field = v.substr(pos+1);
- if (jQuery.inArray(this.method, q.subqueries) == -1) {
- q.subqueries[this.method] = new ManifoldQuery();
- q.subqueries[this.method].action = this.action;
- q.subqueries[this.method].method = this.method;
- q.subqueries[this.method].timestamp = this.timestamp;
+ if (!q.subqueries[object]) {
+ q.subqueries[object] = new ManifoldQuery();
+ q.subqueries[object].action = q.action;
+ q.subqueries[object].object = object;
+ q.subqueries[object].timestamp = q.timestamp;
}
- q.subqueries[this.method].fields.push(field);
+ q.subqueries[object].fields.push(field);
} else {
q.fields.push(v);
}
}
/* constructor */
- this.action = action;
- this.method = method;
- this.timestamp = timestamp;
- this.filters = filters;
- this.params = params;
- this.fields = fields;
- this.unique = unique;
- this.uuid = uuid;
- this.analyzed_query = aq;
- this.subqueries = sq;
+ if (typeof action == "undefined")
+ this.action = "get";
+ else
+ this.action = action;
+
+ if (typeof object == "undefined")
+ this.object = null;
+ else
+ this.object = object;
+
+ if (typeof timestamp == "undefined")
+ this.timestamp = "now";
+ else
+ this.timestamp = timestamp;
+
+ if (typeof filters == "undefined")
+ this.filters = [];
+ else
+ this.filters = filters;
+
+ if (typeof params == "undefined")
+ this.params = {};
+ else
+ this.params = params;
+
+ if (typeof fields == "undefined")
+ this.fields = [];
+ else
+ this.fields = fields;
+
+ if (typeof unique == "undefined")
+ this.unique = false;
+ else
+ this.unique = unique;
+
+ this.query_uuid = query_uuid;
+
+ if (typeof aq == "undefined")
+ this.analyzed_query = null;
+ else
+ this.analyzed_query = aq;
+
+ if (typeof sq == "undefined")
+ this.subqueries = {};
+ else
+ this.subqueries = sq;
}