Beispiel #1
0
        /// <summary>
        /// Generates a Column Symbol (Used everywhere else)
        /// </summary>
        /// <param name="xoCurrentToken"></param>
        /// <param name="xoList"></param>
        /// <returns></returns>
        private static SyntaxNode FactoryCreateColumn(ParsingContext xoContext, Boolean xbIsAliasNeeded = false)
        {
            ISyntax xoCurrentToken = xoContext.List.Peek();

            // A Symbol consists of multiple parts
            Symbol oTable;
            Symbol oColumn;

            // If this is a literal Column
            if (SyntaxKindFacts.IsLiteral(xoCurrentToken.ExpectedType))
            {
                oColumn = new Symbol(xoContext.List.Pop(), NodeStrategyFactory.NULL_STRATEGY);

                // Assign the alias
                if (xbIsAliasNeeded)
                {
                    oColumn.Alias = SyntaxNodeFactory.ScanAheadForAlias(xoContext.List);
                }

                return(oColumn);
            }

            // Trailing item is . (table.column)
            if (xoContext.List.Peek(1).ExpectedType == SyntaxKind.DotToken)
            {
                oTable  = new Symbol(xoCurrentToken, NodeStrategyFactory.NULL_STRATEGY);
                oColumn = new Symbol(xoContext.List.Peek(2)); // Grab the Column
                oTable.Add(oColumn);
                xoContext.List.Pop(3);                        // Skip over the next 2
            }
            // Standalone Column
            else
            {
                oTable  = new Symbol(new SyntaxToken(SyntaxKind.IdentifierTableSymbol, String.Empty));
                oColumn = new Symbol(xoCurrentToken, NodeStrategyFactory.NULL_STRATEGY); // Grab the Column
                oTable.Add(oColumn);
                xoContext.List.Pop();                                                    // Skip over the next 1
            }

            // Assign the alias
            if (xbIsAliasNeeded)
            {
                oColumn.Alias = SyntaxNodeFactory.ScanAheadForAlias(xoContext.List);
            }

            oColumn.ExpectedType = SyntaxKind.IdentifierColumnSymbol;
            oTable.ExpectedType  = SyntaxKind.IdentifierTableSymbol;

            // Return the top level node
            return(oTable);
        }
Beispiel #2
0
        private static SyntaxNode FactoryCreateColumnFunction(ParsingContext xoContext)
        {
            // generate the item
            Symbol oColumnExp = new Symbol(xoContext.List.Pop());

            // Consume Ahead
            oColumnExp.TryConsumeFromContext(xoContext);

            // Assign the alias
            oColumnExp.Alias = SyntaxNodeFactory.ScanAheadForAlias(xoContext.List);

            // Return the column
            return(oColumnExp);
        }
Beispiel #3
0
        /// <summary>
        /// Generates a simple Table Symbol
        /// </summary>
        /// <param name="xoList"></param>
        /// <returns></returns>
        public static SyntaxNode FactoryCreateTable(ParsingContext xoContext)
        {
            ISyntax xoCurrentToken = xoContext.List.Peek();

            if (xoCurrentToken.ExpectedType == SyntaxKind.OpenParenthesisToken)
            {
                // Subquery start
                ISyntax oNextToken = xoContext.List.Pop();
                oNextToken.ExpectedType = SyntaxKind.IdentifierSubQuerySymbol; // give it a better type
                // Create a table symbol
                Symbol oSubquery = new Symbol(oNextToken);
                return(oSubquery);
            }

            SyntaxNode oDatabase;
            SyntaxNode oSchema;
            // A Symbol consists of multiple parts
            SyntaxNode oTable;

            int iSchemaLocation = 0;
            int iTableLocation  = 0;

            // Trailing item is a .. (Database)
            if (xoContext.List.Peek(1).ExpectedType == SyntaxKind.DotDotToken)
            {
                iSchemaLocation = -1;
                iTableLocation  = 2;
            }
            else if (xoContext.List.Peek(1).ExpectedType == SyntaxKind.DotToken)
            {
                iSchemaLocation = 2;
                iTableLocation  = 4;
            }
            // Standalone Table
            else
            {
                iSchemaLocation = -1;
                iTableLocation  = 0;
            }

            oDatabase = new Symbol(new SyntaxToken(SyntaxKind.IdentifierDatabaseSymbol,
                                                   iTableLocation != 0 ? xoCurrentToken.RawSQLText : String.Empty));

            // Generate the Schema Node
            oSchema = new Symbol(new SyntaxToken(SyntaxKind.IdentifierSchemaSymbol,
                                                 iSchemaLocation != -1 ? xoContext.List.Peek(iSchemaLocation).RawSQLText : String.Empty));

            oTable = new Symbol(new SyntaxToken(SyntaxKind.IdentifierTableSymbol, xoContext.List.Peek(iTableLocation).RawSQLText));

            // create the decorator obj
            oSchema.Add(oTable);
            oDatabase.Add(oSchema);

            // Pop the tokens
            xoContext.List.Pop(Math.Max(iSchemaLocation, iTableLocation) + 1);

            // Assign the alias
            ((Symbol)oTable).Alias = SyntaxNodeFactory.ScanAheadForAlias(xoContext.List);

            return(oDatabase);
        }