X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=manifold%2Fmanifoldquery.py;h=da3bbc5ddbae84c0ceabe3ef4fd5d3067a82a676;hb=5e1a278283582937b13f5f757d88dd50b37e52ed;hp=9881f41d04fcaab424de10a091aa356d04ede545;hpb=d2ab222245b6311d81f9465cde3f48761c077168;p=myslice.git diff --git a/manifold/manifoldquery.py b/manifold/manifoldquery.py index 9881f41d..da3bbc5d 100644 --- a/manifold/manifoldquery.py +++ b/manifold/manifoldquery.py @@ -4,31 +4,41 @@ import uuid def uniqid (): return uuid.uuid4().hex +debug=False +debug=True + class ManifoldQuery: - def __init__ (self, action=None, method=None, timestamp='now', + def __init__ (self, action=None, subject=None, timestamp='now', filters=[], params=[], fields=[], sort=None, limit=None, offset=None, ): self.query_uuid=uniqid() # settable self.action=action - self.method=method + self.subject=subject self.timestamp=timestamp self.filters=filters self.params=params self.fields=fields + # xxx these are unused for now.... self.sort=sort self.limit=limit self.offset=offset - # internal data + # internal data - likewise, this is unused as of yet, although we have + # (untested) code below in analyze_subqueries to compute these.. self.analyzed_query=None self.subqueries = {} + def __repr__ (self): + result="Q: id=%(query_uuid)s - %(action)s on %(subject)s "%self.__dict__ + result += " with %d filters, %d fields"%(len(self.filters),len(self.params)) + return result + def to_json (self): query_uuid=self.query_uuid a=self.action - m=self.method + s=self.subject t=self.timestamp f=json.dumps (self.filters) p=json.dumps (self.params) @@ -37,37 +47,40 @@ class ManifoldQuery: unique=0 aq = self.analyzed_query.to_json() if self.analyzed_query else 'null' - # subqueries is a dictionary method:query + # subqueries is a dictionary subject:query if not self.subqueries: sq="{}" else: - sq=", ".join ( [ "'%s':%s" % (method, subquery.to_json()) - for (method, subquery) in self.subqueries.iteritems()]) + sq=", ".join ( [ "'%s':%s" % (subject, subquery.to_json()) + for (subject, subquery) in self.subqueries.iteritems()]) sq="{%s}"%sq - return """ new ManifoldQuery('%(a)s', '%(m)s', '%(t)s', %(f)s, %(p)s, %(c)s, %(unique)s, '%(query_uuid)s', %(aq)s, %(sq)s)"""%locals() + result= """ new ManifoldQuery('%(a)s', '%(s)s', '%(t)s', %(f)s, %(p)s, %(c)s, %(unique)s, '%(query_uuid)s', %(aq)s, %(sq)s)"""%locals() + if debug: print 'ManifoldQuery.to_json:',result + return result # this builds a ManifoldQuery object from a dict as received from javascript through its ajax request + # we use a json-encoded string - see manifold.js for the sender part # 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 - - - + # manifoldproxy.proxy: request.POST + def fill_from_POST (self, POST_dict): + try: + json_string=POST_dict['json'] + dict=json.loads(json_string) + for (k,v) in dict.iteritems(): + setattr(self,k,v) + except: + print "Could not decode incoming ajax request as a Query, POST=",POST_dict + if (debug): + import traceback + traceback.print_exc() + + # not used yet .. def analyze_subqueries(self): analyzed_query = ManifoldQuery() analyzed_query.query_uuid = self.query_uuid analyzed_query.action = self.action - analyzed_query.method = self.method + analyzed_query.subject = self.subject analyzed_query.timestamp = self.timestamp # analyse query filters @@ -77,16 +90,17 @@ class ManifoldQuery: operation = filter[1] value = filter[2] if '.' in key: - method = key.split('.')[0] - field = key.split('.')[1] - if not analyzed_query.subqueries[method]: + parts=key.split('.') + subject = parts[0] + field = parts[1] + if not analyzed_query.subqueries[subject]: subquery = ManifoldQuery() subquery.action = self.action - subquery.method = method + subquery.subject = subject subquery.timestamp = self.timestamp - analyzed_query.subqueries[method] = subquery + analyzed_query.subqueries[subject] = subquery - analyzed_query.subqueries[method].filters.append([field, operation, value]) + analyzed_query.subqueries[subject].filters.append([field, operation, value]) else: analyzed_query.filters.append(filter) @@ -94,16 +108,17 @@ class ManifoldQuery: # 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]: + parts=param.split('.') + subject = parts[0] + field = parts[1] + if not analyzed_query.subqueries[subject]: subquery = ManifoldQuery() subquery.action = self.action - subquery.method = method + subquery.subject = subject subquery.timestamp = self.timestamp - analyzed_query.subqueries[method] = subquery + analyzed_query.subqueries[subject] = subquery - analyzed_query.subqueries[method].params[field] = self.params[param] + analyzed_query.subqueries[subject].params[field] = self.params[param] else: analyzed_query.params[param] = self.params[param] @@ -111,33 +126,34 @@ class ManifoldQuery: # 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]: + parts=element.split('.') + subject = parts[0] + field = parts[1] + if not analyzed_query.subqueries[subject]: subquery = ManifoldQuery() subquery.action = self.action - subquery.method = method + subquery.subject = subject subquery.timestamp = self.timestamp - analyzed_query.subqueries[method] = subquery + analyzed_query.subqueries[subject] = subquery - analyzed_query.subqueries[method].fields.append(field) + analyzed_query.subqueries[subject].fields.append(field) else: analyzed_query.fields.append(element) # default subqueries - if analyzed_query.method == 'slice': + if analyzed_query.subject == 'slice': if not analyzed_query.subqueries['resource']: subquery = ManifoldQuery() subquery.action = self.action - subquery.method = method + subquery.subject = subject 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.subject = subject subquery.timestamp = self.timestamp analyzed_query.subqueries['lease'] = subquery