Example #1
0
        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]);
Example #2
0
 public static QsiDerivedTableNode CreateAliasedTableNode(QsiTableNode node, QsiAliasNode alias)
 {
     return(new()
     {
         Source =
         {
             Value = node
         },
         Alias =
         {
             Value = alias
         },
Example #3
0
        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);
            }));
        }
Example #4
0
        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);
        }
Example #5
0
 public static QsiDerivedTableNode CreateAliasedTableNode(QsiTableNode node, QsiIdentifier alias)
 {
     return(CreateAliasedTableNode(node, new QsiAliasNode {
         Name = alias
     }));
 }