protected override CommandCanExecuteResult CanExecute()
        {
            if (CurrentNode == null || CurrentQueryBlock == null || !CurrentNode.IsWithinSelectClause())
            {
                return(false);
            }

            _selectListColumn = CurrentQueryBlock.Columns.SingleOrDefault(c => c.HasExplicitDefinition && CurrentNode.HasAncestor(c.RootNode));
            return(_selectListColumn != null && !_selectListColumn.IsAsterisk && !_selectListColumn.IsReferenced && _selectListColumn.Owner != SemanticModel.MainQueryBlock);
        }
Beispiel #2
0
        private static IEnumerable <TerminalUsage> GetParentQueryBlockUsages(OracleSelectListColumn selectListColumn)
        {
            var usages = Enumerable.Empty <TerminalUsage>();

            if (selectListColumn == null)
            {
                return(usages);
            }

            var aliasNode = selectListColumn.ExplicitAliasNode ?? selectListColumn.AliasNode;

            if (aliasNode == null)
            {
                return(usages);
            }

            var parentQueryBlocks = selectListColumn.Owner.SemanticModel.QueryBlocks
                                    .Where(qb => qb.ObjectReferences.SelectMany(o => o.IncludeInnerReferences).SelectMany(o => o.QueryBlocks).Contains(selectListColumn.Owner));

            foreach (var parentQueryBlock in parentQueryBlocks)
            {
                var parentReferences = parentQueryBlock.AllColumnReferences
                                       .Where(c => c.ColumnNodeColumnReferences.Count == 1 && c.ColumnNodeObjectReferences.Count == 1 &&
                                              MatchesOwnerQueryBlock(c.ColumnNodeObjectReferences.First(), selectListColumn.Owner) &&
                                              String.Equals(c.NormalizedName, selectListColumn.NormalizedName))
                                       .ToArray();

                if (parentReferences.Length == 0)
                {
                    continue;
                }

                usages = parentReferences.Select(c => new TerminalUsage {
                    Terminal = c.ColumnNode, Option = DisplayOptions.Usage
                });
                if (parentQueryBlock.ExplicitColumnNameList != null)
                {
                    continue;
                }

                var parentColumnReferences = parentReferences.Where(c => c.SelectListColumn != null && c.SelectListColumn.IsDirectReference).ToArray();
                if (parentColumnReferences.Length == 1)
                {
                    var parentColumnReference = parentColumnReferences[0];
                    usages = usages
                             .Concat(parentColumnReferences.Where(c => c.SelectListColumn.HasExplicitAlias).Select(c => new TerminalUsage {
                        Terminal = c.SelectListColumn.AliasNode, Option = DisplayOptions.Definition
                    }))
                             .Concat(GetParentQueryBlockUsages(parentColumnReference.SelectListColumn));
                }
            }

            return(usages);
        }
        private static IToolTip BuildAsteriskToolTip(OracleQueryBlock queryBlock, StatementGrammarNode asteriskTerminal)
        {
            var asteriskColumn = queryBlock.AsteriskColumns.SingleOrDefault(c => c.RootNode.LastTerminalNode == asteriskTerminal);

            if (asteriskColumn == null)
            {
                return(null);
            }

            var columns = queryBlock.Columns.Where(c => c.AsteriskColumn == asteriskColumn)
                          .Select((c, i) =>
            {
                var validObjectReference = c.ColumnReferences[0].ValidObjectReference;
                var nullable             = validObjectReference.SchemaObject.GetTargetSchemaObject() is OracleView
                                                ? (bool?)null
                                                : c.ColumnDescription.Nullable;

                return
                (new OracleColumnModel
                {
                    Name = String.IsNullOrEmpty(c.ColumnDescription.Name)
                                                                ? OracleSelectListColumn.BuildNonAliasedOutputColumnName(c.RootNode.Terminals)
                                                                : c.ColumnDescription.Name,
                    FullTypeName = c.ColumnDescription.FullTypeName,
                    Nullable = nullable,
                    ColumnIndex = i + 1,
                    RowSourceName = validObjectReference?.FullyQualifiedObjectName.ToLabel()
                });
            }).ToArray();

            return(columns.Length == 0
                                ? null
                                : new ToolTipAsterisk {
                Columns = columns
            });
        }
        private string GetUnnestedColumnExpression(OracleColumnReference sourceColumnReference, OracleSelectListColumn column)
        {
            if (column.HasExplicitDefinition)
            {
                var isNonAliasedDirectReference = sourceColumnReference.SelectListColumn?.IsDirectReference == true && !sourceColumnReference.SelectListColumn.HasExplicitAlias;
                var rootExpressionNode          = column.RootNode.GetDescendantsWithinSameQueryBlock(isNonAliasedDirectReference ? NonTerminals.AliasedExpression : NonTerminals.Expression).First();
                var columnExpression            = rootExpressionNode.GetText(ExecutionContext.StatementText);
                var offset = column.RootNode.SourcePosition.IndexStart;

                foreach (var columnReference in column.ColumnReferences
                         .Where(c => c.ColumnNodeObjectReferences.Count == 1 && c.ObjectNode == null)
                         .OrderByDescending(c => c.ColumnNode.SourcePosition.IndexStart))
                {
                    var prefix = columnReference.ColumnNodeObjectReferences.First().FullyQualifiedObjectName.ToString();
                    if (!String.IsNullOrEmpty(prefix))
                    {
                        prefix = $"{prefix}.";
                    }

                    columnExpression = columnExpression.Remove(columnReference.ColumnNode.SourcePosition.IndexStart - offset, columnReference.ColumnNode.SourcePosition.Length).Insert(columnReference.ColumnNode.SourcePosition.IndexStart - offset, prefix + columnReference.Name);
                }

                return(columnExpression);
            }

            var objectName = column.ColumnReferences.Count == 1 && column.ColumnReferences[0].ColumnNodeObjectReferences.Count == 1
                                ? $"{column.ColumnReferences[0].ColumnNodeObjectReferences.First().FullyQualifiedObjectName}."
                                : null;

            return($"{objectName}{column.NormalizedName.ToSimpleIdentifier()}");
        }
Beispiel #5
0
 internal static IEnumerable <StatementGrammarNode> GetParentQueryBlockColumnUsages(OracleSelectListColumn selectListColumn)
 {
     return(GetParentQueryBlockUsages(selectListColumn).Select(u => u.Terminal));
 }
        public static OracleDataTypeReference CreateDataTypeReference(OracleQueryBlock queryBlock, OracleSelectListColumn selectListColumn, StatementPlacement placement, StatementGrammarNode typeIdentifier)
        {
            var dataTypeNode      = typeIdentifier.ParentNode.ParentNode;
            var dataTypeReference =
                new OracleDataTypeReference
            {
                RootNode         = dataTypeNode,
                Owner            = queryBlock,
                Container        = queryBlock,
                OwnerNode        = dataTypeNode[NonTerminals.SchemaDatatype, NonTerminals.SchemaPrefix, Terminals.SchemaIdentifier],
                ObjectNode       = typeIdentifier,
                DatabaseLinkNode = String.Equals(typeIdentifier.Id, Terminals.DataTypeIdentifier) ? GetDatabaseLinkFromIdentifier(typeIdentifier) : null,
                Placement        = placement,
                SelectListColumn = selectListColumn
            };

            ResolveTypeMetadata(dataTypeReference);

            ResolveSchemaType(dataTypeReference);

            return(dataTypeReference);
        }