Loading cloudcontrol/common/tql/db/db.py +8 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ from cloudcontrol.common.datastructures.ordereddict import OrderedDict from cloudcontrol.common.tql.parser.ast import (Filter, FilterPresence, UnionOperator, IntersectionOperator, DifferenceOperator, ShowOperator, LimitOperator, SortOperator) Loading Loading @@ -380,6 +381,8 @@ class TqlDatabase(object): return self._evaluate_union(objects, expression) elif isinstance(expression, IntersectionOperator): return self._evaluate_intersection(objects, expression) elif isinstance(expression, DifferenceOperator): return self._evaluate_difference(objects, expression) elif isinstance(expression, ShowOperator): return self._evaluate_show(objects, expression) elif isinstance(expression, SortOperator): Loading Loading @@ -408,6 +411,11 @@ class TqlDatabase(object): right = self._evaluate_expression(objects, intersection.right_expression) return left & right def _evaluate_difference(self, objects, difference): left = self._evaluate_expression(objects, difference.left_expression) right = self._evaluate_expression(objects, difference.right_expression) return left - right def _evaluate_show(self, objects, show): objects = self._evaluate_expression(objects, show.expression) for obj in objects: Loading cloudcontrol/common/tql/parser/ast.py +8 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,14 @@ class IntersectionOperator(BinaryOperator): SYMBOL = '&' class DifferenceOperator(BinaryOperator): """ A difference operator (eg: expr/expr). """ SYMBOL = '/' class ShowOperator(object): """ A show operator (eg: $tag). Loading cloudcontrol/common/tql/parser/parser.py +12 −8 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import ply.lex as lex import ply.yacc as yacc from ast import (TqlAst, Filter, FilterPresence, UnionOperator, IntersectionOperator, ShowOperator, SortOperator, LimitOperator) IntersectionOperator, DifferenceOperator, ShowOperator, SortOperator, LimitOperator) from errors import ParsingError Loading Loading @@ -61,12 +61,13 @@ class TqlLexer(object): # Tokens # tokens = ('UNION', 'INTERSECTION', 'CIRCUMFLEX', 'DOLLAR', 'PERCENT', 'EQUAL', 'COLON', 'TILDE', 'GT', 'GTE', 'LT', 'LTE', 'NOT', 'WORD', 'TEXT', 'LEFT_PAR', 'RIGHT_PAR', 'EOL') tokens = ('UNION', 'INTERSECTION', 'DIFFERENCE', 'CIRCUMFLEX', 'DOLLAR', 'PERCENT', 'EQUAL', 'COLON', 'TILDE', 'GT', 'GTE', 'LT', 'LTE', 'NOT', 'WORD', 'TEXT', 'LEFT_PAR', 'RIGHT_PAR', 'EOL') t_UNION = '\|' t_INTERSECTION = '&' t_DIFFERENCE = '/' t_CIRCUMFLEX = '\^' t_DOLLAR = '\$' t_PERCENT = '%' Loading @@ -78,7 +79,7 @@ class TqlLexer(object): t_LT = '<' t_LTE = '<=' t_NOT = '!' t_WORD = '[^ |&^$%=:~>>=<<=!()]+' t_WORD = '[^ |&^$%=:~>>=<<=!()/]+' t_LEFT_PAR = '\(' t_RIGHT_PAR = '\)' t_ignore = ' \t' Loading Loading @@ -195,11 +196,14 @@ class TqlParser(object): def p_expression_binary(self, p): """expression : expression UNION expression | expression INTERSECTION expression""" | expression INTERSECTION expression | expression DIFFERENCE expression""" if p[2] == '|': p[0] = UnionOperator(p[1], p[3]) else: elif p[2] == '&': p[0] = IntersectionOperator(p[1], p[3]) else: p[0] = DifferenceOperator(p[1], p[3]) def p_expression_show(self, p): """expression : expression DOLLAR WORD""" Loading Loading
cloudcontrol/common/tql/db/db.py +8 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ from cloudcontrol.common.datastructures.ordereddict import OrderedDict from cloudcontrol.common.tql.parser.ast import (Filter, FilterPresence, UnionOperator, IntersectionOperator, DifferenceOperator, ShowOperator, LimitOperator, SortOperator) Loading Loading @@ -380,6 +381,8 @@ class TqlDatabase(object): return self._evaluate_union(objects, expression) elif isinstance(expression, IntersectionOperator): return self._evaluate_intersection(objects, expression) elif isinstance(expression, DifferenceOperator): return self._evaluate_difference(objects, expression) elif isinstance(expression, ShowOperator): return self._evaluate_show(objects, expression) elif isinstance(expression, SortOperator): Loading Loading @@ -408,6 +411,11 @@ class TqlDatabase(object): right = self._evaluate_expression(objects, intersection.right_expression) return left & right def _evaluate_difference(self, objects, difference): left = self._evaluate_expression(objects, difference.left_expression) right = self._evaluate_expression(objects, difference.right_expression) return left - right def _evaluate_show(self, objects, show): objects = self._evaluate_expression(objects, show.expression) for obj in objects: Loading
cloudcontrol/common/tql/parser/ast.py +8 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,14 @@ class IntersectionOperator(BinaryOperator): SYMBOL = '&' class DifferenceOperator(BinaryOperator): """ A difference operator (eg: expr/expr). """ SYMBOL = '/' class ShowOperator(object): """ A show operator (eg: $tag). Loading
cloudcontrol/common/tql/parser/parser.py +12 −8 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import ply.lex as lex import ply.yacc as yacc from ast import (TqlAst, Filter, FilterPresence, UnionOperator, IntersectionOperator, ShowOperator, SortOperator, LimitOperator) IntersectionOperator, DifferenceOperator, ShowOperator, SortOperator, LimitOperator) from errors import ParsingError Loading Loading @@ -61,12 +61,13 @@ class TqlLexer(object): # Tokens # tokens = ('UNION', 'INTERSECTION', 'CIRCUMFLEX', 'DOLLAR', 'PERCENT', 'EQUAL', 'COLON', 'TILDE', 'GT', 'GTE', 'LT', 'LTE', 'NOT', 'WORD', 'TEXT', 'LEFT_PAR', 'RIGHT_PAR', 'EOL') tokens = ('UNION', 'INTERSECTION', 'DIFFERENCE', 'CIRCUMFLEX', 'DOLLAR', 'PERCENT', 'EQUAL', 'COLON', 'TILDE', 'GT', 'GTE', 'LT', 'LTE', 'NOT', 'WORD', 'TEXT', 'LEFT_PAR', 'RIGHT_PAR', 'EOL') t_UNION = '\|' t_INTERSECTION = '&' t_DIFFERENCE = '/' t_CIRCUMFLEX = '\^' t_DOLLAR = '\$' t_PERCENT = '%' Loading @@ -78,7 +79,7 @@ class TqlLexer(object): t_LT = '<' t_LTE = '<=' t_NOT = '!' t_WORD = '[^ |&^$%=:~>>=<<=!()]+' t_WORD = '[^ |&^$%=:~>>=<<=!()/]+' t_LEFT_PAR = '\(' t_RIGHT_PAR = '\)' t_ignore = ' \t' Loading Loading @@ -195,11 +196,14 @@ class TqlParser(object): def p_expression_binary(self, p): """expression : expression UNION expression | expression INTERSECTION expression""" | expression INTERSECTION expression | expression DIFFERENCE expression""" if p[2] == '|': p[0] = UnionOperator(p[1], p[3]) else: elif p[2] == '&': p[0] = IntersectionOperator(p[1], p[3]) else: p[0] = DifferenceOperator(p[1], p[3]) def p_expression_show(self, p): """expression : expression DOLLAR WORD""" Loading