5 return uuid.uuid4().hex
12 def __init__ (self, action=None, subject=None, timestamp='now',
13 filters=[], params=[], fields=[],
14 sort=None, limit=None, offset=None,
16 self.query_uuid=uniqid()
20 self.timestamp=timestamp
24 # xxx this is unused for now
28 # internal data - likewise, this is unused as of yet, although we have
29 # (untested) code below in analyze_subqueries to compute these..
30 self.analyzed_query=None
34 result="Q: id=%(query_uuid)s - %(action)s on %(subject)s "%self.__dict__
35 result += " with %d filters, %d fields"%(len(self.filters),len(self.params))
39 query_uuid=self.query_uuid
43 f=json.dumps (self.filters)
45 p=json.dumps (self.params)
46 c=json.dumps (self.fields)
47 # xxx unique can be removed, but for now we pad the js structure
50 aq = self.analyzed_query.to_json() if self.analyzed_query else 'null'
51 # subqueries is a dictionary subject:query
52 if not self.subqueries:
55 sq=", ".join ( [ "'%s':%s" % (subject, subquery.to_json())
56 for (subject, subquery) in self.subqueries.iteritems()])
59 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()
60 if debug: print 'ManifoldQuery.to_json:',result
63 # this builds a ManifoldQuery object from a dict as received from javascript through its ajax request
64 # e.g. here's what I captured from the server's output
65 # incoming POST <QueryDict: {u'query[subject]': [u'slice'], u'query[fields][]': [u'slice_hrn'], u'query[timestamp]': [u'latest'], u'query[action]': [u'get']}>
66 def fill_from_dict (self, d):
68 for arg in ['action', 'subject', 'filters', 'fields', 'timestamp', 'params']:
70 # dirty hack around fields; fields must be a list
72 setattr(self, arg, [d[key]])
74 setattr(self, arg, d[key])
78 def analyze_subqueries(self):
79 analyzed_query = ManifoldQuery()
80 analyzed_query.query_uuid = self.query_uuid
81 analyzed_query.action = self.action
82 analyzed_query.subject = self.subject
83 analyzed_query.timestamp = self.timestamp
85 # analyse query filters
86 # filter syntax : ['key', 'oparation', 'value']
87 for filter in self.filters:
95 if not analyzed_query.subqueries[subject]:
96 subquery = ManifoldQuery()
97 subquery.action = self.action
98 subquery.subject = subject
99 subquery.timestamp = self.timestamp
100 analyzed_query.subqueries[subject] = subquery
102 analyzed_query.subqueries[subject].filters.append([field, operation, value])
104 analyzed_query.filters.append(filter)
106 # analyse query params
107 # params syntax : params = {'param1': value1, 'param2': value2, ...}
108 for param in self.params.keys():
110 parts=param.split('.')
113 if not analyzed_query.subqueries[subject]:
114 subquery = ManifoldQuery()
115 subquery.action = self.action
116 subquery.subject = subject
117 subquery.timestamp = self.timestamp
118 analyzed_query.subqueries[subject] = subquery
120 analyzed_query.subqueries[subject].params[field] = self.params[param]
122 analyzed_query.params[param] = self.params[param]
124 # analyse query fields
125 # fields syntax: fields = [element1, element2, ....]
126 for element in self.fields:
128 parts=element.split('.')
131 if not analyzed_query.subqueries[subject]:
132 subquery = ManifoldQuery()
133 subquery.action = self.action
134 subquery.subject = subject
135 subquery.timestamp = self.timestamp
136 analyzed_query.subqueries[subject] = subquery
138 analyzed_query.subqueries[subject].fields.append(field)
140 analyzed_query.fields.append(element)
144 if analyzed_query.subject == 'slice':
145 if not analyzed_query.subqueries['resource']:
146 subquery = ManifoldQuery()
147 subquery.action = self.action
148 subquery.subject = subject
149 subquery.timestamp = self.timestamp
150 analyzed_query.subqueries['resource'] = subquery
152 if not analyzed_query.subqueries['lease']:
153 subquery = ManifoldQuery()
154 subquery.action = self.action
155 subquery.subject = subject
156 subquery.timestamp = self.timestamp
157 analyzed_query.subqueries['lease'] = subquery
160 self.analyzed_query = analyzed_query