From ff322c50b654ad3a5389be55665df0375537ca44 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@stud.unibas.ch>
Date: Wed, 2 Jan 2013 17:13:51 +0100
Subject: [PATCH] evaluate special operator ',' before ':'

expressions like 'col_a=2.0:5.0,8.0:10.0' have to be split first,
before ':' can be evaluated.
---
 modules/base/pymod/table.py      | 82 ++++++++++++++++----------------
 modules/base/tests/test_table.py |  2 +
 2 files changed, 44 insertions(+), 40 deletions(-)

diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py
index aa8965d61..d1bd691a3 100644
--- a/modules/base/pymod/table.py
+++ b/modules/base/pymod/table.py
@@ -1005,6 +1005,48 @@ Statistics for column %(col)s
             if precedence[split_expression[i]]==precedence[split_expression[i+2]]:
               raise ValueError('Cannot Evaluate '+' '.join(split_expression[i:i+3])+' since both operators have same precedence!')
 
+
+        #handle , operator
+        #replaces an expression like 'rnum=1,2,3' with '(rnum=1 or rnum=2 or rnum=3)'
+
+        temp_split_expression=list()
+        skips=0
+
+        for i in range(len(split_expression)):
+          if skips>0:
+            skips-=1
+            continue
+          if ',' in split_expression[i]:
+
+            if split_expression[max(0,i-1)] != '=' and split_expression[min(i+1,len(split_expression)-1)] != '=':
+              raise ValueError('Can evaluate \',\' sign only in combination with \'=\'')
+
+            single_operands=split_expression[i].split(',')
+
+            if split_expression[max(0,i-1)]=='=':
+              if i-2<0:
+                raise ValueError('Does it really make sense to start with an \'=\'')
+              main_operand=split_expression[i-2]
+              temp_split_expression.pop()
+              temp_split_expression.pop()
+              skips=0
+
+            else:
+              if i+2>len(split_expression)-1:
+                raise ValueError('Does it really make sense to end with an \'=\'')
+              main_operand=split_expression[i+2]
+              skips=2
+
+            temp_expression=list(['('])
+            temp_expression+=' or '.join(['%s = %s'% (a,b) for (a,b) in zip(len(single_operands)*[main_operand],single_operands)]).split()
+            temp_expression.append(')')
+            temp_split_expression+=temp_expression
+            continue
+
+          temp_split_expression.append(split_expression[i])
+
+        split_expression=temp_split_expression
+
         #handle ':' operator
         #replaces an expression like 'col_a=x:y' with '(col_a>=x and col_a<=y)'
         
@@ -1053,46 +1095,6 @@ Statistics for column %(col)s
   
         split_expression=temp_split_expression
 
-        #handle , operator
-        #replaces an expression like 'rnum=1,2,3' with '(rnum=1 or rnum=2 or rnum=3)'
-
-        temp_split_expression=list()
-
-        for i in range(len(split_expression)):
-          if skips>0:
-            skips-=1
-            continue
-          if ',' in split_expression[i]:
-
-            if split_expression[max(0,i-1)] != '=' and split_expression[min(i+1,len(split_expression)-1)] != '=':
-              raise ValueError('Can evaluate \',\' sign only in combination with \'=\'')
-
-            single_operands=split_expression[i].split(',')
-
-            if split_expression[max(0,i-1)]=='=':
-              if i-2<0:
-                raise ValueError('Does it really make sense to start with an \'=\'')
-              main_operand=split_expression[i-2]
-              temp_split_expression.pop()
-              temp_split_expression.pop()
-              skips=0
-
-            else:
-              if i+2>len(split_expression)-1:
-                raise ValueError('Does it really make sense to end with an \'=\'')
-              main_operand=split_expression[i+2]
-              skips=2
-
-            temp_expression=list(['('])
-            temp_expression+=' or '.join(['%s = %s'% (a,b) for (a,b) in zip(len(single_operands)*[main_operand],single_operands)]).split()
-            temp_expression.append(')')
-            temp_split_expression+=temp_expression
-            continue
-
-          temp_split_expression.append(split_expression[i])
-
-        split_expression=temp_split_expression
-
         return split_expression
 
       token=expression[actual_position]
diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py
index fe97e693b..b3c1921d9 100644
--- a/modules/base/tests/test_table.py
+++ b/modules/base/tests/test_table.py
@@ -1765,11 +1765,13 @@ class TestTable(unittest.TestCase):
     query_two='a=2:9 and c'
     query_three='d=e,f,j and a!=4'
     query_four='(b=2.0:3.0 and c=False) or (b<1.0 and c)'
+    query_five='b=0.0:1.2,2.5:8.0'
 
     self.assertEqual([0,1,2,3], list(r[0] for r in tab.Select(query_one).rows))
     self.assertEqual([2,3], list(r[0] for r in tab.Select(query_two).rows))
     self.assertEqual([5,9], list(r[0] for r in tab.Select(query_three).rows))
     self.assertEqual([0,7], list(r[0] for r in tab.Select(query_four).rows))
+    self.assertEqual([0,1,2,3,8,9], list(r[0] for r in tab.Select(query_five).rows))
 
     
 if __name__ == "__main__":
-- 
GitLab