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}" }); }
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() }); }
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() }); }