def compfilterExpression(compfilter, fields): """ Create an expression for a single comp-filter element. @param compfilter: the L{ComponentFilter} element. @return: a L{baseExpression} for the expression tree. """ # Handle is-not-defined case if not compfilter.defined: # Test for TYPE != <<component-type name>> return expression.isnotExpression(fields["TYPE"], compfilter.filter_name, True) # Determine logical expression grouping logical = expression.andExpression if compfilter.filter_test == "allof" else expression.orExpression expressions = [] if isinstance(compfilter.filter_name, str) or isinstance(compfilter.filter_name, unicode): expressions.append(expression.isExpression(fields["TYPE"], compfilter.filter_name, True)) else: expressions.append(expression.inExpression(fields["TYPE"], compfilter.filter_name, True)) # Handle time-range if compfilter.qualifier and isinstance(compfilter.qualifier, TimeRange): start, end, startfloat, endfloat = getTimerangeArguments(compfilter.qualifier) expressions.append(expression.timerangeExpression(start, end, startfloat, endfloat)) # Handle properties - we can only do UID right now props = [] for p in [x for x in compfilter.filters if isinstance(x, PropertyFilter)]: props.append(propfilterExpression(p, fields)) if len(props) > 1: propsExpression = logical(props) elif len(props) == 1: propsExpression = props[0] else: propsExpression = None # Handle embedded components - we do not right now as our Index does not handle them comps = [] for _ignore in [x for x in compfilter.filters if isinstance(x, ComponentFilter)]: raise ValueError if len(comps) > 1: compsExpression = logical(comps) elif len(comps) == 1: compsExpression = comps[0] else: compsExpression = None # Now build compound expression if ((propsExpression is not None) and (compsExpression is not None)): expressions.append(logical([propsExpression, compsExpression])) elif propsExpression is not None: expressions.append(propsExpression) elif compsExpression is not None: expressions.append(compsExpression) # Now build return expression return expression.andExpression(expressions)
def compfilterExpression(compfilter, fields): """ Create an expression for a single comp-filter element. @param compfilter: the L{ComponentFilter} element. @return: a L{baseExpression} for the expression tree. """ # Handle is-not-defined case if not compfilter.defined: # Test for TYPE != <<component-type name>> return expression.isnotExpression(fields["TYPE"], compfilter.filter_name, True) # Determine logical expression grouping logical = expression.andExpression if compfilter.filter_test == "allof" else expression.orExpression expressions = [] if isinstance(compfilter.filter_name, str) or isinstance(compfilter.filter_name, unicode): expressions.append(expression.isExpression(fields["TYPE"], compfilter.filter_name, True)) else: expressions.append(expression.inExpression(fields["TYPE"], compfilter.filter_name, True)) # Handle time-range if compfilter.qualifier and isinstance(compfilter.qualifier, TimeRange): start, end, startfloat, endfloat = getTimerangeArguments(compfilter.qualifier) expressions.append(expression.timerangeExpression(start, end, startfloat, endfloat)) # Handle properties - we can only do UID right now props = [] for p in [x for x in compfilter.filters if isinstance(x, PropertyFilter)]: props.append(propfilterExpression(p, fields)) if len(props) > 1: propsExpression = logical(props) elif len(props) == 1: propsExpression = props[0] else: propsExpression = None # Handle embedded components - we do not right now as our Index does not handle them comps = [] for _ignore in [x for x in compfilter.filters if isinstance(x, ComponentFilter)]: raise ValueError if len(comps) > 1: compsExpression = logical(comps) elif len(comps) == 1: compsExpression = comps[0] else: compsExpression = None # Now build compound expression if ((propsExpression is not None) and (compsExpression is not None)): expressions.append(logical([propsExpression, compsExpression])) elif propsExpression is not None: expressions.append(propsExpression) elif compsExpression is not None: expressions.append(compsExpression) # Now build return expression return expression.andExpression(expressions)
def test_and_query(self): resource = self.FakeHomeChild() obj = resource._objectSchema expr = expression.andExpression(( expression.isExpression(obj.UID, 5678, False), expression.isnotExpression(obj.RESOURCE_NAME, "foobar.ics", False), )) select, args = SQLQueryGenerator(expr, resource, resource.id()).generate() self.assertEqual( select.toSQL(), SQLFragment( "select distinct RESOURCE_NAME, ICALENDAR_UID from CALENDAR_OBJECT where CALENDAR_RESOURCE_ID = ? and ICALENDAR_UID = ? and RESOURCE_NAME != ?", [1234, 5678, "foobar.ics"])) self.assertEqual(args, {})
def test_and_query(self): resource = self.FakeHomeChild() obj = resource._objectSchema expr = expression.andExpression(( expression.isExpression(obj.UID, 5678, False), expression.isnotExpression(obj.RESOURCE_NAME, "foobar.ics", False), )) select, args = SQLQueryGenerator(expr, resource, resource.id()).generate() self.assertEqual( select.toSQL(), SQLFragment( "select distinct RESOURCE_NAME, ICALENDAR_UID from CALENDAR_OBJECT where CALENDAR_RESOURCE_ID = ? and ICALENDAR_UID = ? and RESOURCE_NAME != ?", [1234, 5678, "foobar.ics"] ) ) self.assertEqual(args, {})