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