Exemplo n.º 1
0
    def parseMFQL(self, content):
        '''
        parse a MFQL source file an return a list of Statements.
        @param content: the name of the file to be parsed or directly an file
                      object.
        @type content: string || file.
        @return: the list of statements.
        @rtype: list<Statement>
        '''
        
        if isinstance(content, str) or isinstance(content, unicode):
            stream = antlr3.ANTLRStringStream(content)
        else:
            stream = antlr3.ANTLRInputStream(content)

        lexer = MFQLLexer(stream)
        tokens = antlr3.CommonTokenStream(lexer)
        parser = MFQLParser(tokens)
        
        result = parser.stmts()
        parser.eof()
        
        validator = CompositeVisitor()
        validator.addComponent(IsKeyValidator())

        if isinstance(result, list):
            for elem in result:
                elem.walk(validator)
        else:
            result.walk(validator)
        
        return result
Exemplo n.º 2
0
    def _secondPassVisit(self, queryPlan, props):

        # debugging visitor
        #tracer      = TracingVisitor()

        filters     = FilterVisitor(self._relations, self._alu)
        secondPass = CompositeVisitor()
        #secondPass.addComponent(tracer)
        secondPass.addComponent(filters)
        for elem in queryPlan:
            #tracer.printSeparation()
            elem.walk(secondPass)
Exemplo n.º 3
0
    def parse(self, rule, inputStr):
        char_stream = antlr3.ANTLRStringStream(inputStr)
        lexer = MFQLLexer(char_stream)
        tokens = antlr3.CommonTokenStream(lexer)
        parser = MFQLParser(tokens)
        
        rule = getattr(parser, rule)
        result = rule()
        parser.eof()
        
        validator = CompositeVisitor()
        validator.addComponent(IsKeyValidator())

        if isinstance(result, list):
            for elem in result:
                elem.walk(validator)
        else:
            result.walk(validator)
        
        return result
Exemplo n.º 4
0
    def _firstPassVisit(self, queryPlan, props):
        '''
        go through the complete AST and extract all definitions
        @param queryPlan: the list of all queries the have been found by the
                          parser.
        @type queryPlan: list<Statement>
        '''
        # debugging visitor
        tracer      = TracingVisitor()
        # visitor that will find all streams
        streams     = StreamVisitor(self)
        # for index extraction
        
        # visitor that will find all relations
        joinBuilder = JoinBuilder()
        relations   = RelationVisitor(joinBuilder, self._alu)
        
        firstPass = CompositeVisitor()
        firstPass.addComponent(tracer)
        firstPass.addComponent(self)
        firstPass.addComponent(streams)
        firstPass.addComponent(joinBuilder)
        firstPass.addComponent(relations)
        for elem in queryPlan:
            tracer.printSeparation()
            elem.walk(firstPass)
        
        if len(self._istreams) == 0:
            raise IllegalCondition('remember what this system is about?')

        # now store what we have found
        self._relations = relations.getRelations()
        self._inserts   = relations.getInserts()