hazelnut expects the initial columns to be passed to its constructor
[myslice.git] / manifold / manifoldquery.py
index 9881f41..da3bbc5 100644 (file)
@@ -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 <QueryDict: {u'query[method]': [u'slice'], u'query[fields][]': [u'slice_hrn'], u'query[timestamp]': [u'latest'], u'query[action]': [u'get']}>
-    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 <QueryDict: {u'json': [u'{"action":"get","subject":"resource","timestamp":"latest","filters":[["slice_hrn","=","ple.inria.omftest"]],"params":[],"fields":["hrn","hostname"],"unique":0,"query_uuid":"436aae70a48141cc826f88e08fbd74b1","analyzed_query":null,"subqueries":{}}']}>
+    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