/// <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); }
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); }
/// <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); }