X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=engine%2Fmanifoldquery.py;h=ab09bfe7c84ec0dd750f0301d980f0d2036bca62;hb=a39d44883f3424d04134e4105873e88336b00795;hp=b8f594e920d021c915745a4e8a7d58a2bf658bed;hpb=a222cef0a10a5517349f05cea0e382b35e3a14a6;p=unfold.git diff --git a/engine/manifoldquery.py b/engine/manifoldquery.py index b8f594e9..ab09bfe7 100644 --- a/engine/manifoldquery.py +++ b/engine/manifoldquery.py @@ -1,8 +1,8 @@ import json +import uuid -# xxx php has uniqid, need to find a module for that -counter=1 -def uniqid (): global counter; counter += 1; return counter +def uniqid (): + return uuid.uuid4().hex class ManifoldQuery: @@ -36,10 +36,110 @@ class ManifoldQuery: # xxx unique can be removed, but for now we pad the js structure unique=0 + aq = self.analyzed_query.to_json() if self.analyzed_query else 'null' # subqueries is a dictionary method:query - sq=", ".join ( [ "'%s':%s" % (method, subquery.to_json()) + if not self.subqueries: + sq="{}" + else: + sq=", ".join ( [ "'%s':%s" % (method, subquery.to_json()) for (method, subquery) in self.subqueries.iteritems()]) + sq="{%s}"%sq - aq = self.analyzed_query.to_json() if self.analyzed_query else 'null' - - return "new Query('%(a)s', '%(m)s', '%(t)s', %(f)s, %(p)s, %(c)s, %(unique)s, '%(uuid)s', %(aq)s, {{%(sq)s}})"%locals() + return """ new Query('%(a)s', '%(m)s', '%(t)s', %(f)s, %(p)s, %(c)s, %(unique)s, '%(uuid)s', %(aq)s, %(sq)s)"""%locals() + + # this builds a ManifoldQuery object from a dict as received from javascript through its ajax request + # e.g. here's what I captured from the server's output + # incoming POST + def fill_from_dict (self, d): + for key in d.keys(): + for arg in ['action', 'method', 'filters', 'fields', 'timestamp', 'params']: + if arg in key: + # dirty hack around fields; fields must be a list + if arg == 'fields': + setattr(self, arg, [d[key]]) + else: + setattr(self, arg, d[key]) + break + + + + def analyze_subqueries(self): + analyzed_query = ManifoldQuery() + analyzed_query.uuid = self.uuid + analyzed_query.action = self.action + analyzed_query.method = self.method + analyzed_query.timestamp = self.timestamp + + # analyse query filters + # filter syntax : ['key', 'oparation', 'value'] + for filter in self.filters: + key = filter[0] + operation = filter[1] + value = filter[2] + if '.' in key: + method = key.split('.')[0] + field = key.split('.')[1] + if not analyzed_query.subqueries[method]: + subquery = ManifoldQuery() + subquery.action = self.action + subquery.method = method + subquery.timestamp = self.timestamp + analyzed_query.subqueries[method] = subquery + + analyzed_query.subqueries[method].filters.append([field, operation, value]) + else: + analyzed_query.filters.append(filter) + + # analyse query params + # params syntax : params = {'param1': value1, 'param2': value2, ...} + for param in self.params.keys(): + if '.' in param: + method = param.split('.')[0] + field = param.split('.')[1] + if not analyzed_query.subqueries[method]: + subquery = ManifoldQuery() + subquery.action = self.action + subquery.method = method + subquery.timestamp = self.timestamp + analyzed_query.subqueries[method] = subquery + + analyzed_query.subqueries[method].params[field] = self.params[param] + else: + analyzed_query.params[param] = self.params[param] + + # analyse query fields + # fields syntax: fields = [element1, element2, ....] + for element in self.fields: + if '.' in element: + method = element.split('.')[0] + field = element.split('.')[1] + if not analyzed_query.subqueries[method]: + subquery = ManifoldQuery() + subquery.action = self.action + subquery.method = method + subquery.timestamp = self.timestamp + analyzed_query.subqueries[method] = subquery + + analyzed_query.subqueries[method].fields.append(field) + else: + analyzed_query.fields.append(element) + + + # default subqueries + if analyzed_query.method == 'slice': + if not analyzed_query.subqueries['resource']: + subquery = ManifoldQuery() + subquery.action = self.action + subquery.method = method + subquery.timestamp = self.timestamp + analyzed_query.subqueries['resource'] = subquery + + if not analyzed_query.subqueries['lease']: + subquery = ManifoldQuery() + subquery.action = self.action + subquery.method = method + subquery.timestamp = self.timestamp + analyzed_query.subqueries['lease'] = subquery + + + self.analyzed_query = analyzed_query