protected override async ValueTask <IQsiAnalysisResult> OnExecute(IAnalyzerContext context) { var identifierSet = new HashSet <QsiIdentifier>(IdentifierComparer); QsiQualifiedIdentifier tableIdentifier = null; QsiTableNode node = (context.Tree as QsiDerivedTableNode); bool isCountFunction = false; while (node is QsiDerivedTableNode tableNode) { IEnumerable <QsiQualifiedIdentifier> columns = tableNode .Columns.Value .FindAscendants <QsiDeclaredColumnNode>() .Select(c => c.Name); var hasCountFunction = tableNode .Columns.Value .FindAscendants <QsiDerivedColumnNode>() .Any(c => c.Expression.Value is QsiInvokeExpressionNode invokeExpressionNode && invokeExpressionNode.Member.Value.Identifier[^ 1].Value.EqualsIgnoreCase("COUNT")); if (hasCountFunction) { isCountFunction = true; } foreach (var column in columns) { identifierSet.Add(column[^ 1]);
public static QsiDerivedTableNode CreateAliasedTableNode(QsiTableNode node, QsiAliasNode alias) { return(new() { Source = { Value = node }, Alias = { Value = alias },
public static QsiTableNode VisitAtomTableItem(AtomTableItemContext context) { QsiTableNode node = VisitTableName(context.tableName()); if (context.alias == null) { return(node); } return(TreeHelper.Create <QsiDerivedTableNode>(n => { n.Columns.SetValue(TreeHelper.CreateAllColumnsDeclaration()); n.Source.SetValue(node); n.Alias.SetValue(CreateAliasNode(context.alias)); PrimarSqlTree.PutContextSpan(n, context); })); }
public static IQsiDefinitionNode VisitCreateViewStatement(CreateTableStatement statement) { var node = new PViewDefinitionNode { Identifier = IdentifierVisitor.Visit(statement.TableName) }; if (statement.ColumnDefs.Any()) { node.DynamicColumns = new QsiColumnsDeclarationNode(); node.DynamicColumns.Columns.AddRange(statement.ColumnDefs.Select(TableVisitor.VisitDynamicColumn)); } QsiTableNode tableNode = TreeHelper.Create <QsiTableReferenceNode>(n => { n.Identifier = IdentifierVisitor.Visit(statement.BaseTableName); PTree.RawNode[n] = statement.BaseTableName; }); if (statement.WhereClause != null) { var derivedTableNode = new QsiDerivedTableNode(); derivedTableNode.Columns.Value = TreeHelper.CreateAllColumnsDeclaration(); derivedTableNode.Where.Value = ExpressionVisitor.VisitWhere(statement.WhereClause); derivedTableNode.Source.Value = tableNode; node.Source.Value = derivedTableNode; } else { node.Source.Value = tableNode; } PTree.RawNode[node] = statement; return(node); }
public static QsiDerivedTableNode CreateAliasedTableNode(QsiTableNode node, QsiIdentifier alias) { return(CreateAliasedTableNode(node, new QsiAliasNode { Name = alias })); }