コード例 #1
0
        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);
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
		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
					});
		}
コード例 #5
0
 private static StatementGrammarNode GetObjectNode(OracleObjectWithColumnsReference dataObjectReference)
 {
     return(dataObjectReference.Type == ReferenceType.CommonTableExpression && dataObjectReference.QueryBlocks.Count == 1
                         ? dataObjectReference.QueryBlocks.First().AliasNode
                         : dataObjectReference.ObjectNode);
 }
コード例 #6
0
        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);
        }
コード例 #7
0
 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));
 }
コード例 #8
0
		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;
		}
コード例 #9
0
		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;
		}
コード例 #10
0
		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));
		}
コード例 #11
0
		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);
		}
コード例 #12
0
		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);
		}