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