private void AddColumnToQueryBlock(OracleQueryBlock queryBlock, string columnName)
        {
            foreach (var parentDataObjectReference in AliasCommandHelper.GetParentObjectReferences(queryBlock))
            {
                var parentQueryBlock = parentDataObjectReference.Owner;
                if (parentQueryBlock.ModelReference?.MeasureExpressionList?.LastTerminalNode != null)
                {
                    ExecutionContext.SegmentsToReplace.Add(
                        new TextSegment
                    {
                        IndextStart = parentQueryBlock.ModelReference.MeasureExpressionList.LastTerminalNode.Id == Terminals.RightParenthesis
                                                                ? parentQueryBlock.ModelReference.MeasureExpressionList.LastTerminalNode.SourcePosition.IndexStart
                                                                : parentQueryBlock.ModelReference.MeasureExpressionList.LastTerminalNode.SourcePosition.IndexEnd + 1,
                        Text = ", " + columnName
                    });
                }

                var isNotReferencedByAsterisk = parentQueryBlock.AsteriskColumns.Count == 0;
                if (isNotReferencedByAsterisk)
                {
                    var lastColumn = parentQueryBlock.Columns.LastOrDefault(c => c.HasExplicitDefinition);
                    if (lastColumn != null)
                    {
                        ExecutionContext.SegmentsToReplace.Add(
                            new TextSegment
                        {
                            IndextStart = lastColumn.RootNode.SourcePosition.IndexEnd + 1,
                            Text        = ", " + columnName
                        });
                    }
                }

                AddColumnToQueryBlock(parentQueryBlock, columnName);
            }
        }
Beispiel #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('"'));
                }
            }
        }