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
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)
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
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()