changeset 5:ca30cf0e810d

fix bugs in ZDBInlineSearch.
author root@xserve09.mpiwg-berlin.mpg.de
date Tue, 15 Feb 2011 20:39:48 +0100
parents 0ade331198de
children 1b25a85a2165
files ZDBInterfaceFolder.py
diffstat 1 files changed, 43 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/ZDBInterfaceFolder.py	Tue Feb 15 19:59:07 2011 +0100
+++ b/ZDBInterfaceFolder.py	Tue Feb 15 20:39:48 2011 +0100
@@ -34,7 +34,7 @@
         self.connection_id = connection_id
 
 
-    def getSQLQuery(self, table=None, argv):
+    def getSQLQuery(self, table, argv):
         """returns dict with SQL query string and args"""
         logging.debug("getSQLquery table=%s argv=%s"%(table,argv))
         args = []
@@ -43,19 +43,51 @@
         wheres = []
         whereOp = "AND"
         done = {}
+
+        def doOp(op, param, val):
+            # handles comparison operations in WHERE clause
+            if isinstance(val, list): 
+                # join multiple parameters with spaces (makes sense with checkbox and -op=all)
+                val = " ".join(val)
+            logging.debug("doop op=%s param=%s val=%s"%(op,param,val))
+            if op == "eq":
+                wheres.append(param + " = %s")
+                args.append(val)
+            elif op == "lt":
+                wheres.append(param + " < %s")
+                args.append(val)
+            elif op == "gt":
+                wheres.append(param + " > %s")
+                args.append(val)
+            elif op == "bw":
+                wheres.append(param + " LIKE %s")
+                args.append("%" + val)
+            elif op == "ew":
+                wheres.append(param + " LIKE %s")
+                args.append(val + "%")
+            elif op == "ct":
+                wheres.append(param + " LIKE %s")
+                args.append("%" + val + "%")
+            elif op == "all":
+                words = []
+                for word in val.split(" "):
+                    words.append(param + " LIKE %s")
+                    args.append("%" + word + "%")
+                wheres.append("(" + " AND ".join(words) + ")")
+            else:
+                logging.error("getSQLquery: unknown op=%s!"%op)
+                
+            return
+
         # evaluate argv
         for (key, val) in argv.items():
             if key in done:
                 # parameter has been processed
                 continue
             
-            if isinstance(val, list): 
-                # join multiple parameters with spaces (makes sense with checkbox and -op=all)
-                val = " ".join(val)
-
             # beginning of a command should always be "_"
             if key[0] == "-":
-                key[0] = "_"
+                key = "_" + key[1:]
       
             if key == "_select":
                 # SELECT expression
@@ -69,8 +101,9 @@
             elif key[:3] == "_op":
                 # operation parameters _op_param=option
                 param = sqlName(key[4:])
+                logging.debug("param=%s key=%s val=%s"%(param,key,val))
                 if param in argv:
-                    doOp(op, param)
+                    doOp(val, param, argv[param])
                     done[param] = True
                 else:
                     # no corresponding parameter
@@ -78,10 +111,10 @@
                 
         # process remaining parameters (without _op)
         for (key, val) in argv.items():
-            if key not in done:
+            if key not in done and key[0] not in ("_", "-"):
                 param = sqlName(key)
                 # default is begins-with
-                doOp("bw", param)
+                doOp("bw", param, val)
 
         # join it all
         query = "SELECT %s FROM %s"%(select, table)
@@ -92,36 +125,10 @@
             query += " ORDER BY " + order
 
         return {'query' : query, 'args' : args}
-                
-        def doOp(op, param):
-            # handles comparison operations in WHERE clause
-            if op == "eq":
-                wheres.append(param + " = %s")
-                args.append(argv[param])
-            elif op == "lt":
-                wheres.append(param + " < %s")
-                args.append(argv[param])
-            elif op == "gt":
-                wheres.append(param + " > %s")
-                args.append(argv[param])
-            elif op == "bw":
-                wheres.append(param + " LIKE %s")
-                args.append("%" + argv[param])
-            elif op == "ew":
-                wheres.append(param + " LIKE %s")
-                args.append(argv[param] + "%")
-            elif op == "ct":
-                wheres.append(param + " LIKE %s")
-                args.append("%" + argv[param] + "%")
-            else:
-                logging.error("getSQLquery: unknown op=%s!"%op)
-                
-            return
-                
 
     def ZDBInlineSearch(self, _table=None, **argv):
         """returns result set from search"""
-        query = self.getSQLQuery(_table=_table, argv)
+        query = self.getSQLQuery(_table, argv)
         result = self.executeZSQL(query['query'], query['args'])
         return result