private static void AddColumnAliasNodesToReplace(ICollection <TextSegment> segmentsToReplace, OracleQueryBlock queryBlock, StatementGrammarNode currentNode)
        {
            var column = queryBlock.Columns.SingleOrDefault(c => c.HasExplicitDefinition && c.IsDirectReference && c.RootNode.Terminals.Any(t => t == currentNode));

            if (column == null)
            {
                return;
            }

            foreach (var terminal in FindUsagesCommand.GetParentQueryBlockColumnUsages(column))
            {
                segmentsToReplace.Add
                    (new TextSegment
                {
                    IndextStart = terminal.SourcePosition.IndexStart,
                    Length      = terminal.SourcePosition.Length,
                    Text        = currentNode.PrecedingTerminal.Token.Value
                });
            }

            segmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = currentNode.SourcePosition.IndexStart,
                Length      = currentNode.SourcePosition.Length,
                Text        = String.Empty
            });
        }
Exemple #2
0
        protected override void Execute()
        {
            var commandHelper = new AliasCommandHelper(ExecutionContext);

            foreach (var column in _unquotableColumns)
            {
                var unquotedColumnAlias = column.NormalizedName.Trim('"');
                if (column.HasExplicitAlias || String.Equals(column.NormalizedName.ToSimpleIdentifier(), unquotedColumnAlias))
                {
                    foreach (var terminal in FindUsagesCommand.GetParentQueryBlockColumnUsages(column))
                    {
                        ExecutionContext.SegmentsToReplace.Add(
                            new TextSegment
                        {
                            IndextStart = terminal.SourcePosition.IndexStart,
                            Length      = terminal.SourcePosition.Length,
                            Text        = unquotedColumnAlias
                        });
                    }

                    ExecutionContext.SegmentsToReplace.Add(
                        new TextSegment
                    {
                        IndextStart = column.AliasNode.SourcePosition.IndexStart,
                        Length      = column.AliasNode.SourcePosition.Length,
                        Text        = unquotedColumnAlias
                    });
                }
                else
                {
                    commandHelper.AddColumnAlias(column.RootNode, column.Owner, column.NormalizedName, unquotedColumnAlias);
                }
            }

            foreach (var unquotableObject in _unquotableObjects)
            {
                if (unquotableObject.AliasNode != null)
                {
                    var unquotedObjectAlias = unquotableObject.AliasNode.Token.Value.Trim('"');
                    ExecutionContext.SegmentsToReplace.Add(
                        new TextSegment
                    {
                        IndextStart = unquotableObject.AliasNode.SourcePosition.IndexStart,
                        Length      = unquotableObject.AliasNode.SourcePosition.Length,
                        Text        = unquotedObjectAlias
                    });

                    var columnReferences = unquotableObject.Owner == null
                                                ? unquotableObject.Container.ColumnReferences
                                                : unquotableObject.Owner.AllColumnReferences;

                    var referenceColumnObjectNodes = columnReferences
                                                     .Where(r => r.ObjectNode != null && r.ValidObjectReference == unquotableObject)
                                                     .Select(r => r.ObjectNode);

                    foreach (var objectNode in referenceColumnObjectNodes)
                    {
                        ExecutionContext.SegmentsToReplace.Add(
                            new TextSegment
                        {
                            IndextStart = objectNode.SourcePosition.IndexStart,
                            Length      = objectNode.SourcePosition.Length,
                            Text        = unquotedObjectAlias
                        });
                    }
                }
                else
                {
                    commandHelper.AddObjectAlias(unquotableObject, unquotableObject.ObjectNode.Token.Value.Trim('"'));
                }
            }
        }