}
this.clone = function() {
- q = new ManifoldQuery();
- return jQuery.extend(true, q, this);
+ //
+ var q = new ManifoldQuery();
+ q.action = this.action;
+ q.object = this.object;
+ q.timestamp = this.timestamp;
+ q.filters = this.filters.slice();
+ q.fields = this.fields.slice();
+ q.query_uuid = this.query_uuid;
+
+ if (this.analyzed_query)
+ q.analyzed_query = this.analyzed_query.clone();
+ else
+ q.analyzed_query = null;
+
+ if (this.subqueries) {
+ q.subqueries = {}
+ for (method in this.subqueries)
+ q.subqueries[method] = this.subqueries[method].clone();
+ }
+
+ // deep extend not working for custom objects
+ // $.extend(true, q, this);
+ return q;
}
+
this.add_filter = function(key, op, value) {
this.filters.push(new Array(key, op, value));
}
}
// 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;
}
// 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};
}
+
+ // 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,