private static SubProduction GetSelectRule() { return(new SubProduction ( new List <ExpressionDefinition> { new TerminalExpressionDefinition { TokenType = TokenType.Select }, new NonTerminalExpressionDefinition { Identifier = ParserConstants.Top }, new NonTerminalExpressionDefinition { Identifier = ParserConstants.SelectColumns }, new TerminalExpressionDefinition { TokenType = TokenType.From }, new NonTerminalExpressionDefinition { Identifier = ParserConstants.Identifier }, new NonTerminalExpressionDefinition { Identifier = ParserConstants.Join }, new NonTerminalExpressionDefinition { Identifier = ParserConstants.Where }, new SemanticActionDefinition((ParsingNode node) => { IdentifierASTNode identifier = node.GetAttributeForKey <IdentifierASTNode>(ParserConstants.Identifier, ParserConstants.SyntaxTreeNode); BooleanExpressionASTNode condition = node.GetAttributeForKey <BooleanExpressionASTNode>(ParserConstants.Where, ParserConstants.SyntaxTreeNode); JoinASTNode join = node.GetAttributeForKey <JoinASTNode>(ParserConstants.Join, ParserConstants.SyntaxTreeNode); TopASTNode top = node.GetAttributeForKey <TopASTNode>(ParserConstants.Top, ParserConstants.SyntaxTreeNode); FromASTNode from = new FromASTNode() { Identifier = identifier }; node.Attributes.Add(ParserConstants.SyntaxTreeNode, new SelectASTNode() { From = from, Condition = condition, Join = join, Top = top, SelectColumns = node.GetAttributeForKey <List <FactorASTNode> >(ParserConstants.SelectColumns, ParserConstants.SyntaxTreeNodes) }); }) } )); }
private Join JoinNodeToJoin(TableDefinition joinTable, JoinASTNode join) { if (join == null) { return(null); } TableDefinition leftTable = GetTableDefinitionFromJoinString(join.LeftColumn.Identifier); TableDefinition rightTable = GetTableDefinitionFromJoinString(join.RightColumn.Identifier); AttributeDefinition leftColumn = GetColumnFromJoinString(leftTable, join.LeftColumn.Identifier); AttributeDefinition rightColumn = GetColumnFromJoinString(rightTable, join.RightColumn.Identifier); bool doSwitch = leftTable != joinTable; return(new Join { LeftTable = doSwitch ? rightTable : leftTable, LeftColumn = doSwitch ? rightColumn : leftColumn, RightTable = doSwitch ? leftTable : rightTable, RightColumn = doSwitch ? leftColumn : rightColumn, }); }
private static SubProduction GetJoinRule() { return(new SubProduction ( new List <ExpressionDefinition> { new TerminalExpressionDefinition { TokenType = TokenType.Join }, new NonTerminalExpressionDefinition { Key = "Identifier1", Identifier = ParserConstants.Identifier }, new TerminalExpressionDefinition { TokenType = TokenType.On }, new NonTerminalExpressionDefinition { Key = "Identifier2", Identifier = ParserConstants.Identifier }, new TerminalExpressionDefinition { TokenType = TokenType.RelOp }, new NonTerminalExpressionDefinition { Key = "Identifier3", Identifier = ParserConstants.Identifier }, new SemanticActionDefinition((ParsingNode node) => { JoinASTNode astNode = new JoinASTNode(); astNode.TargetTable = node.GetAttributeForKey <IdentifierASTNode>("Identifier1", ParserConstants.SyntaxTreeNode); astNode.LeftColumn = node.GetAttributeForKey <IdentifierASTNode>("Identifier2", ParserConstants.SyntaxTreeNode); astNode.RightColumn = node.GetAttributeForKey <IdentifierASTNode>("Identifier3", ParserConstants.SyntaxTreeNode); node.Attributes.Add(ParserConstants.SyntaxTreeNode, astNode); }) } )); }