X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=manifold%2Fjs%2Fmanifold-query.js;h=77925c4e6dd8d0f508f6d27a5f6ff374d9ee9a45;hb=4c7212bd04ddb65511c42aac5bae6fc3044cd846;hp=4e146ada1d657f516da8dc0dcd5b9feaf8a2e93c;hpb=928d9b692b74f7ebc2a6abaae24c00d9b2618acf;p=myslice.git diff --git a/manifold/js/manifold-query.js b/manifold/js/manifold-query.js index 4e146ada..77925c4e 100644 --- a/manifold/js/manifold-query.js +++ b/manifold/js/manifold-query.js @@ -1,8 +1,8 @@ -function ManifoldQuery(action, method, timestamp, filters, params, fields, unique, query_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... - var method; + var object; // timestamp, now, latest(cache) : date of the results queried var timestamp; // key(field),op(=<>),value @@ -23,12 +23,24 @@ function ManifoldQuery(action, method, timestamp, filters, params, fields, uniqu /*------------------------------------------------------------- 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); @@ -49,7 +61,8 @@ INSERT INTO method VALUES(field=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) { @@ -59,9 +72,9 @@ INSERT INTO method VALUES(field=value) 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; @@ -71,10 +84,10 @@ INSERT INTO method VALUES(field=value) 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; @@ -85,16 +98,36 @@ INSERT INTO method VALUES(field=value) 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) { + jQuery.each(query.subqueries, function(object, subquery) { + rec(subquery, callback, data, query); + }); + callback(query, data, parent_query); + }; + + if (this.analyzed_query !== undefined) + query = this.analyzed_query; + else + query = this; + + rec(query, callback, data, null); } + +// 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.query_uuid = this.query_uuid; q.action = this.action; - q.method = this.method; + q.object = this.object; q.timestamp = this.timestamp; /* Filters */ @@ -104,17 +137,17 @@ INSERT INTO method VALUES(field=value) 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); } }); @@ -122,15 +155,15 @@ INSERT INTO method VALUES(field=value) 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; } @@ -140,15 +173,15 @@ INSERT INTO method VALUES(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); } @@ -157,14 +190,50 @@ INSERT INTO method VALUES(field=value) } /* constructor */ - this.action = action; - this.method = method; - this.timestamp = timestamp; - this.filters = filters; - this.params = params; - this.fields = fields; - this.unique = unique; + 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; - this.analyzed_query = aq; - this.subqueries = sq; + + if (typeof aq == "undefined") + this.analyzed_query = null; + else + this.analyzed_query = aq; + + if (typeof sq == "undefined") + this.subqueries = {}; + else + this.subqueries = sq; }