private static bool MatchesOwnerQueryBlock(OracleObjectWithColumnsReference objectReference, OracleQueryBlock ownerQueryBlock) { Func <OracleObjectWithColumnsReference, bool> ownerQueryBlockPredicate = r => r.QueryBlocks.Count == 1 && r.QueryBlocks.First() == ownerQueryBlock; var dataObjectReference = objectReference as OracleDataObjectReference; var matchesOwnerQueryBlock = dataObjectReference?.IncludeInnerReferences.Any(ownerQueryBlockPredicate) ?? ownerQueryBlockPredicate(objectReference); var matchesOwnSelectColumn = objectReference.Owner != null && objectReference.QueryBlocks.FirstOrDefault() == objectReference.Owner; return(matchesOwnerQueryBlock || matchesOwnSelectColumn); }
private static bool IsObjectReferenceMatched(OracleObjectWithColumnsReference columnObjectReference, OracleObjectWithColumnsReference selectedObjectReference) { var isSelectedObjectReferencePivotOrModel = selectedObjectReference is OraclePivotTableReference || selectedObjectReference is OracleSqlModelReference; var isColumnObjectReferencePivorOrModel = columnObjectReference is OraclePivotTableReference || columnObjectReference is OracleSqlModelReference; return(columnObjectReference == selectedObjectReference || (isSelectedObjectReferencePivotOrModel && ((OracleDataObjectReference)selectedObjectReference).IncludeInnerReferences.Any(o => o == selectedObjectReference)) || (isColumnObjectReferencePivorOrModel && ((OracleDataObjectReference)columnObjectReference).IncludeInnerReferences.Any(o => o == selectedObjectReference))); }
private IEnumerable <TerminalUsage> GetObjectReferenceUsage(OracleObjectWithColumnsReference objectReference) { var nodes = new List <StatementGrammarNode>(); if (objectReference.Type != ReferenceType.InlineView) { nodes.Add(objectReference.ObjectNode); } var dataObjectReference = objectReference as OracleDataObjectReference; if (dataObjectReference?.AliasNode != null) { nodes.Add(dataObjectReference.AliasNode); } if (objectReference.QueryBlocks.Count == 1 && objectReference.Type == ReferenceType.CommonTableExpression) { var referencedQueryBlock = objectReference.QueryBlocks.First(); if (referencedQueryBlock.PrecedingConcatenatedQueryBlock != null && referencedQueryBlock.PrecedingConcatenatedQueryBlock.IsRecursive) { nodes.Add(referencedQueryBlock.PrecedingConcatenatedQueryBlock.AliasNode); } else { nodes.Add(referencedQueryBlock.AliasNode); } if (referencedQueryBlock.FollowingConcatenatedQueryBlock != null) { var recursiveQueryBlockReferences = referencedQueryBlock.FollowingConcatenatedQueryBlock.ObjectReferences.Where(r => r.Type == ReferenceType.CommonTableExpression && r.QueryBlocks.Count == 1 && r.QueryBlocks.First() == referencedQueryBlock.FollowingConcatenatedQueryBlock); nodes.AddRange(recursiveQueryBlockReferences.Select(r => r.ObjectNode)); } } var queryBlock = objectReference.Owner; var columnReferences = queryBlock.AllColumnReferences.Where(c => c.ObjectNode != null && c.ObjectNodeObjectReferences.Count == 1 && c.ObjectNodeObjectReferences.First() == objectReference); foreach (var correlatedQueryBlock in _semanticModel.QueryBlocks.Where(qb => qb.OuterCorrelatedQueryBlock == queryBlock)) { var correlatedColumnReferences = correlatedQueryBlock.AllColumnReferences .Where(c => c.ObjectNode != null && c.ValidObjectReference == objectReference); columnReferences = columnReferences.Concat(correlatedColumnReferences); } return(columnReferences .Select(c => c.ObjectNode) .Concat(nodes) .Select(CreateStandardTerminalUsage)); }
private static IEnumerable<ICodeCompletionItem> GenerateSimpleColumnItems(OracleObjectWithColumnsReference targetDataObject, OracleCodeCompletionType completionType) { return targetDataObject.Columns .Where(c => !String.Equals(completionType.TerminalValueUnderCursor.ToQuotedIdentifier(), c.Name) && CodeCompletionSearchHelper.IsMatch(c.Name, completionType.TerminalValuePartUntilCaret)) .Select(c => new OracleCodeCompletionItem { Name = c.Name.ToSimpleIdentifier(), Text = c.Name.ToSimpleIdentifier(), Category = OracleCodeCompletionCategory.Column, StatementNode = completionType.ReferenceIdentifier.IdentifierUnderCursor }); }
private static StatementGrammarNode GetObjectNode(OracleObjectWithColumnsReference dataObjectReference) { return(dataObjectReference.Type == ReferenceType.CommonTableExpression && dataObjectReference.QueryBlocks.Count == 1 ? dataObjectReference.QueryBlocks.First().AliasNode : dataObjectReference.ObjectNode); }
private static IEnumerable <TerminalUsage> GetChildQueryBlockColumnReferences(OracleObjectWithColumnsReference objectReference, OracleColumnReference columnReference, bool onlyAliasOrigin) { var usages = Enumerable.Empty <TerminalUsage>(); var dataObjectReference = objectReference as OracleDataObjectReference; var sourceObjectReferences = dataObjectReference == null?Enumerable.Repeat(objectReference, 1) : dataObjectReference.IncludeInnerReferences; foreach (var reference in sourceObjectReferences) { if (reference.QueryBlocks.Count != 1) { continue; } var childQueryBlock = reference.QueryBlocks.First(); var childColumn = childQueryBlock.Columns.SingleOrDefault(c => String.Equals(c.NormalizedName, columnReference.NormalizedName)); if (childColumn == null) { continue; } if (childColumn.AliasNode != null && (!onlyAliasOrigin || childColumn.HasExplicitAlias)) { usages = usages.Concat(Enumerable.Repeat(CreateStandardTerminalUsage(childColumn.AliasNode), 1)); } if (childColumn.IsDirectReference && childColumn.ColumnReferences.Count > 0 && childColumn.ColumnReferences.All(cr => cr.ColumnNodeColumnReferences.Count == 1)) { var childColumnReference = childColumn.ColumnReferences.Single(); if (onlyAliasOrigin) { var childColumnObjectReference = childColumnReference.ValidObjectReference; if (childColumnObjectReference == null || childColumnObjectReference.QueryBlocks.Count != 1 || !String.Equals(childColumnReference.NormalizedName, childColumn.NormalizedName)) { continue; } } var childSelectColumnReferences = childQueryBlock.Columns .SelectMany(c => c.ColumnReferences) .Where(c => !c.ReferencesAllColumns && c.ColumnNodeObjectReferences.Count == 1 && String.Equals(c.SelectListColumn.NormalizedName, columnReference.NormalizedName) && c.ColumnNode != childColumn.AliasNode) .Select(c => new TerminalUsage { Terminal = c.ColumnNode, Option = DisplayOptions.Usage }); usages = usages.Concat(childSelectColumnReferences); var childColumnReferences = childQueryBlock.ColumnReferences .Where(c => c.ColumnNodeObjectReferences.Count == 1 && c.ColumnNodeObjectReferences.Single() == childColumnReference.ColumnNodeObjectReferences.Single() && String.Equals(c.NormalizedName, childColumnReference.NormalizedName)) .Select(c => new TerminalUsage { Terminal = c.ColumnNode, Option = DisplayOptions.Usage }); usages = usages.Concat(childColumnReferences); if (childColumnReference.ColumnNodeObjectReferences.Count == 1) { usages = usages.Concat(GetChildQueryBlockColumnReferences(childColumnReference.ColumnNodeObjectReferences.Single(), childColumnReference, onlyAliasOrigin)); } } } return(usages); }
private static bool IsValidReference(OracleColumnReference columnReference, OracleColumnReference selectedColumnReference, OracleObjectWithColumnsReference selectedObjectReference) { return (columnReference.ColumnNodeObjectReferences.Count == 1 && IsObjectReferenceMatched(columnReference.ColumnNodeObjectReferences.First(), selectedObjectReference) && String.Equals(columnReference.NormalizedName, selectedColumnReference.NormalizedName)); }
private static bool MatchesOwnerQueryBlock(OracleObjectWithColumnsReference objectReference, OracleQueryBlock ownerQueryBlock) { Func<OracleObjectWithColumnsReference, bool> ownerQueryBlockPredicate = r => r.QueryBlocks.Count == 1 && r.QueryBlocks.First() == ownerQueryBlock; var dataObjectReference = objectReference as OracleDataObjectReference; var matchesOwnerQueryBlock = dataObjectReference?.IncludeInnerReferences.Any(ownerQueryBlockPredicate) ?? ownerQueryBlockPredicate(objectReference); var matchesOwnSelectColumn = objectReference.Owner != null && objectReference.QueryBlocks.FirstOrDefault() == objectReference.Owner; return matchesOwnerQueryBlock || matchesOwnSelectColumn; }
private static IEnumerable<TerminalUsage> GetChildQueryBlockColumnReferences(OracleObjectWithColumnsReference objectReference, OracleColumnReference columnReference, bool onlyAliasOrigin) { var usages = Enumerable.Empty<TerminalUsage>(); var dataObjectReference = objectReference as OracleDataObjectReference; var sourceObjectReferences = dataObjectReference == null ? Enumerable.Repeat(objectReference, 1) : dataObjectReference.IncludeInnerReferences; foreach (var reference in sourceObjectReferences) { if (reference.QueryBlocks.Count != 1) { continue; } var childQueryBlock = reference.QueryBlocks.First(); var childColumn = childQueryBlock.Columns.SingleOrDefault(c => String.Equals(c.NormalizedName, columnReference.NormalizedName)); if (childColumn == null) { continue; } if (childColumn.AliasNode != null && (!onlyAliasOrigin || childColumn.HasExplicitAlias)) { usages = usages.Concat(Enumerable.Repeat(CreateStandardTerminalUsage(childColumn.AliasNode), 1)); } if (childColumn.IsDirectReference && childColumn.ColumnReferences.Count > 0 && childColumn.ColumnReferences.All(cr => cr.ColumnNodeColumnReferences.Count == 1)) { var childColumnReference = childColumn.ColumnReferences.Single(); if (onlyAliasOrigin) { var childColumnObjectReference = childColumnReference.ValidObjectReference; if (childColumnObjectReference == null || childColumnObjectReference.QueryBlocks.Count != 1 || !String.Equals(childColumnReference.NormalizedName, childColumn.NormalizedName)) { continue; } } var childSelectColumnReferences = childQueryBlock.Columns .SelectMany(c => c.ColumnReferences) .Where(c => !c.ReferencesAllColumns && c.ColumnNodeObjectReferences.Count == 1 && String.Equals(c.SelectListColumn.NormalizedName, columnReference.NormalizedName) && c.ColumnNode != childColumn.AliasNode) .Select(c => new TerminalUsage { Terminal = c.ColumnNode, Option = DisplayOptions.Usage }); usages = usages.Concat(childSelectColumnReferences); var childColumnReferences = childQueryBlock.ColumnReferences .Where(c => c.ColumnNodeObjectReferences.Count == 1 && c.ColumnNodeObjectReferences.Single() == childColumnReference.ColumnNodeObjectReferences.Single() && String.Equals(c.NormalizedName, childColumnReference.NormalizedName)) .Select(c => new TerminalUsage { Terminal = c.ColumnNode, Option = DisplayOptions.Usage }); usages = usages.Concat(childColumnReferences); if (childColumnReference.ColumnNodeObjectReferences.Count == 1) { usages = usages.Concat(GetChildQueryBlockColumnReferences(childColumnReference.ColumnNodeObjectReferences.Single(), childColumnReference, onlyAliasOrigin)); } } } return usages; }
private static bool IsObjectReferenceMatched(OracleObjectWithColumnsReference columnObjectReference, OracleObjectWithColumnsReference selectedObjectReference) { var isSelectedObjectReferencePivotOrModel = selectedObjectReference is OraclePivotTableReference || selectedObjectReference is OracleSqlModelReference; var isColumnObjectReferencePivorOrModel = columnObjectReference is OraclePivotTableReference || columnObjectReference is OracleSqlModelReference; return columnObjectReference == selectedObjectReference || (isSelectedObjectReferencePivotOrModel && ((OracleDataObjectReference)selectedObjectReference).IncludeInnerReferences.Any(o => o == selectedObjectReference)) || (isColumnObjectReferencePivorOrModel && ((OracleDataObjectReference)columnObjectReference).IncludeInnerReferences.Any(o => o == selectedObjectReference)); }
private static bool IsValidReference(OracleColumnReference columnReference, OracleColumnReference selectedColumnReference, OracleObjectWithColumnsReference selectedObjectReference) { return columnReference.ColumnNodeObjectReferences.Count == 1 && IsObjectReferenceMatched(columnReference.ColumnNodeObjectReferences.First(), selectedObjectReference) && String.Equals(columnReference.NormalizedName, selectedColumnReference.NormalizedName); }
private IEnumerable<TerminalUsage> GetObjectReferenceUsage(OracleObjectWithColumnsReference objectReference) { var nodes = new List<StatementGrammarNode>(); if (objectReference.Type != ReferenceType.InlineView) { nodes.Add(objectReference.ObjectNode); } var dataObjectReference = objectReference as OracleDataObjectReference; if (dataObjectReference?.AliasNode != null) { nodes.Add(dataObjectReference.AliasNode); } if (objectReference.QueryBlocks.Count == 1 && objectReference.Type == ReferenceType.CommonTableExpression) { var referencedQueryBlock = objectReference.QueryBlocks.First(); if (referencedQueryBlock.PrecedingConcatenatedQueryBlock != null && referencedQueryBlock.PrecedingConcatenatedQueryBlock.IsRecursive) { nodes.Add(referencedQueryBlock.PrecedingConcatenatedQueryBlock.AliasNode); } else { nodes.Add(referencedQueryBlock.AliasNode); } if (referencedQueryBlock.FollowingConcatenatedQueryBlock != null) { var recursiveQueryBlockReferences = referencedQueryBlock.FollowingConcatenatedQueryBlock.ObjectReferences.Where(r => r.Type == ReferenceType.CommonTableExpression && r.QueryBlocks.Count == 1 && r.QueryBlocks.First() == referencedQueryBlock.FollowingConcatenatedQueryBlock); nodes.AddRange(recursiveQueryBlockReferences.Select(r => r.ObjectNode)); } } var queryBlock = objectReference.Owner; var columnReferences = queryBlock.AllColumnReferences.Where(c => c.ObjectNode != null && c.ObjectNodeObjectReferences.Count == 1 && c.ObjectNodeObjectReferences.First() == objectReference); foreach (var correlatedQueryBlock in _semanticModel.QueryBlocks.Where(qb => qb.OuterCorrelatedQueryBlock == queryBlock)) { var correlatedColumnReferences = correlatedQueryBlock.AllColumnReferences .Where(c => c.ObjectNode != null && c.ValidObjectReference == objectReference); columnReferences = columnReferences.Concat(correlatedColumnReferences); } return columnReferences .Select(c => c.ObjectNode) .Concat(nodes) .Select(CreateStandardTerminalUsage); }