Commit 09e53557 authored by Antoine Millet's avatar Antoine Millet
Browse files

Implemented difference operator in TQL

parent a5b18e67
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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)

@@ -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):
@@ -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:
+8 −0
Original line number Diff line number Diff line
@@ -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).
+12 −8
Original line number Diff line number Diff line
@@ -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


@@ -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 = '%'
@@ -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'
@@ -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"""