Exemple #1
0
        private void WrapSubquery()
        {
            var settingsModel = ConfigureSettings();

            if (!ExecutionContext.SettingsProvider.GetSettings())
            {
                return;
            }

            var tableAlias = settingsModel.Value;

            var formatOptions = OracleConfiguration.Configuration.Formatter.FormatOptions;

            var builder = new SqlTextBuilder();

            builder.AppendReservedWord("SELECT ");
            var objectQualifier = String.IsNullOrEmpty(tableAlias) ? null : $"{tableAlias}.";
            var columnList      = String.Join(", ", CurrentQueryBlock.Columns
                                              .Where(c => !c.IsAsterisk && !String.IsNullOrEmpty(c.NormalizedName))
                                              .Select(c => $"{objectQualifier}{OracleStatementFormatter.FormatTerminalValue(c.NormalizedName.ToSimpleIdentifier(), formatOptions.Identifier)}"));

            builder.AppendText(columnList);
            builder.AppendReservedWord(" FROM (");

            ExecutionContext.SegmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = CurrentQueryBlock.RootNode.SourcePosition.IndexStart,
                Length      = 0,
                Text        = builder.ToString()
            });

            var subqueryIndexEnd = CurrentQueryBlock.OrderByClause == null
                                ? CurrentQueryBlock.RootNode.SourcePosition.IndexEnd
                                : CurrentQueryBlock.OrderByClause.SourcePosition.IndexEnd;

            ExecutionContext.SegmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = subqueryIndexEnd + 1,
                Length      = 0,
                Text        = String.IsNullOrEmpty(tableAlias) ? ")" : $") {tableAlias}"
            });
        }
Exemple #2
0
        private void WrapSchemaObjectReference()
        {
            var formatOptions = OracleConfiguration.Configuration.Formatter.FormatOptions;

            var builder = new SqlTextBuilder();

            builder.AppendReservedWord("(SELECT ");
            var columnList = String.Join(", ", _dataObjectReference.Columns
                                         .Where(c => !c.Hidden)
                                         .Select(c => OracleStatementFormatter.FormatTerminalValue(c.Name.ToSimpleIdentifier(), formatOptions.Identifier)));

            builder.AppendText(columnList);
            builder.AppendReservedWord(" FROM ");

            var substringStart           = _dataObjectReference.RootNode.SourcePosition.IndexStart;
            var tableReferenceTextLength = _dataObjectReference.AliasNode == null
                                ? _dataObjectReference.RootNode.SourcePosition.Length
                                : _dataObjectReference.AliasNode.SourcePosition.IndexStart - substringStart;

            builder.AppendText(ExecutionContext.StatementText.Substring(substringStart, tableReferenceTextLength).Trim());

            builder.AppendText(")");

            if (!String.IsNullOrEmpty(_dataObjectReference.FullyQualifiedObjectName.Name))
            {
                builder.AppendText(" ");
                builder.AppendIdentifier(_dataObjectReference.FullyQualifiedObjectName.Name.ToSimpleIdentifier());
            }

            ExecutionContext.SegmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = substringStart,
                Length      = _dataObjectReference.RootNode.SourcePosition.Length,
                Text        = builder.ToString()
            });
        }
Exemple #3
0
        protected override void Execute()
        {
            var settingsModel = ConfigureSettings();

            if (!ExecutionContext.SettingsProvider.GetSettings())
            {
                return;
            }

            var tableAlias = settingsModel.Value;

            var queryBlock = SemanticModel.GetQueryBlock(CurrentNode);

            var lastCte = SemanticModel.MainQueryBlock
                          .AccessibleQueryBlocks
                          .OrderByDescending(qb => qb.RootNode.SourcePosition.IndexStart)
                          .FirstOrDefault();

            var builder    = new SqlTextBuilder();
            var startIndex = SemanticModel.Statement.RootNode.SourcePosition.IndexStart;

            if (lastCte == null)
            {
                builder.AppendReservedWord("WITH ");
            }
            else if (CurrentQueryBlock.Type == QueryBlockType.CommonTableExpression)
            {
                startIndex = CurrentQueryBlock.RootNode.GetAncestor(NonTerminals.CommonTableExpression).SourcePosition.IndexStart;
            }
            else
            {
                builder.AppendText(", ");
                startIndex = lastCte.RootNode.GetAncestor(NonTerminals.CommonTableExpression).SourcePosition.IndexEnd + 1;
            }

            builder.AppendText(tableAlias);
            builder.AppendKeyword(" AS (");
            var subqueryIndextStart = queryBlock.RootNode.SourcePosition.IndexStart;
            var subqueryIndexEnd    = CurrentQueryBlock.OrderByClause == null
                                ? CurrentQueryBlock.RootNode.SourcePosition.IndexEnd
                                : CurrentQueryBlock.OrderByClause.SourcePosition.IndexEnd;

            var subqueryLength = subqueryIndexEnd - subqueryIndextStart + 1;
            var subquery       = ExecutionContext.StatementText.Substring(subqueryIndextStart, subqueryLength);

            builder.AppendText(subquery);
            builder.AppendText(")");

            if (CurrentQueryBlock.Type == QueryBlockType.CommonTableExpression)
            {
                builder.AppendText(", ");
            }

            if (lastCte == null)
            {
                builder.AppendText(" ");
            }

            ExecutionContext.SegmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = startIndex,
                Text        = builder.ToString()
            });

            var formatOptions = OracleConfiguration.Configuration.Formatter.FormatOptions;

            builder = new SqlTextBuilder();
            builder.AppendReservedWord("SELECT ");
            var columnList = String.Join(", ", queryBlock.Columns
                                         .Where(c => !c.IsAsterisk && !String.IsNullOrEmpty(c.NormalizedName))
                                         .Select(c => $"{tableAlias}.{OracleStatementFormatter.FormatTerminalValue(c.NormalizedName.ToSimpleIdentifier(), formatOptions.Identifier)}"));

            builder.AppendText(columnList);
            builder.AppendReservedWord(" FROM ");
            builder.AppendText(tableAlias);

            ExecutionContext.SegmentsToReplace.Add(
                new TextSegment
            {
                IndextStart = subqueryIndextStart,
                Length      = subqueryLength,
                Text        = builder.ToString()
            });
        }