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)
                    });
                })
            }
                   ));
        }
示例#2
0
        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);
                })
            }
                   ));
        }