Esempio n. 1
0
		private OracleColumnReference GetCurrentColumnReference()
		{
			return _currentColumnReference = CurrentQueryBlock.Columns
				.Where(c => c.IsDirectReference)
				.SelectMany(c => c.ColumnReferences)
				.FirstOrDefault(c => c.ColumnNode == CurrentNode && c.SelectListColumn.AliasNode == CurrentNode && c.ColumnNodeColumnReferences.Count == 1);
		}
        public void VisitColumnReference(OracleColumnReference columnReference)
        {
            var matchedColumns = columnReference.ValidObjectReference?.Columns.Where(c => String.Equals(columnReference.NormalizedName, c.Name)).ToArray();

            if (matchedColumns?.Length != 1)
            {
                return;
            }

            var dataType = matchedColumns[0].DataType;

            if (dataType.IsDynamicCollection)
            {
                _columns.Add(OracleColumn.BuildColumnValueColumn(OracleDataType.Empty));
            }
            else
            {
                var semanticModel = columnReference.Owner.SemanticModel;
                if (semanticModel.HasDatabaseModel)
                {
                    var schemaObject = semanticModel.DatabaseModel.GetFirstSchemaObject <OracleTypeCollection>(dataType.FullyQualifiedName);
                    if (schemaObject != null)
                    {
                        _columns.Add(OracleColumn.BuildColumnValueColumn(((OracleTypeCollection)schemaObject).ElementDataType));
                    }
                }
            }
        }
Esempio n. 3
0
		public void VisitColumnReference(OracleColumnReference columnReference)
		{
			if (TryBuildSchemaTooltip(columnReference))
			{
				return;
			}

			if (columnReference.ObjectNode == _terminal)
			{
				columnReference.ValidObjectReference?.Accept(this);
				return;
			}

			if (columnReference.ColumnDescription == null)
			{
				return;
			}

			var validObjectReference = columnReference.ValidObjectReference;
			var isSchemaObject = validObjectReference.Type == ReferenceType.SchemaObject;
			var targetSchemaObject = isSchemaObject ? validObjectReference.SchemaObject.GetTargetSchemaObject() : null;
			var databaseModel = columnReference.Container.SemanticModel.DatabaseModel;

			if (isSchemaObject)
			{
				ColumnDetailsModel dataModel;
				switch (targetSchemaObject.Type)
				{
					case OracleObjectType.Table:
					case OracleObjectType.MaterializedView:
						dataModel = BuildColumnDetailsModel(databaseModel, columnReference);
						ToolTip = columnReference.ColumnDescription.IsPseudocolumn
							? (IToolTip)new ToolTipViewColumn(dataModel)
							: new ToolTipColumn(dataModel);

						return;

					case OracleObjectType.View:
						dataModel = BuildColumnDetailsModel(databaseModel, columnReference);
						ToolTip = new ToolTipViewColumn(dataModel);
						return;
				}
			}

			var objectPrefix = columnReference.ObjectNode == null && !String.IsNullOrEmpty(validObjectReference.FullyQualifiedObjectName.Name)
				? $"{validObjectReference.FullyQualifiedObjectName.ToLabel()}."
				: null;

			var qualifiedColumnName = isSchemaObject && String.Equals(targetSchemaObject.Type, OracleObjectType.Sequence)
				? null
				: $"{objectPrefix}{columnReference.NormalizedName.ToSimpleIdentifier()}";

			var labelBuilder = new ToolTipLabelBuilder();
			labelBuilder.AddElement(qualifiedColumnName);
			labelBuilder.AddElement(columnReference.ColumnDescription.FullTypeName);
			labelBuilder.AddElement($"{(columnReference.ColumnDescription.Nullable ? null : "NOT ")}NULL");

			ToolTip = new ToolTipObject { DataContext = labelBuilder.ToString() };
		}
Esempio n. 4
0
		protected override CommandCanExecuteResult CanExecute()
		{
			if (CurrentNode == null || CurrentQueryBlock == null || CurrentNode.Id != OracleGrammarDescription.Terminals.Identifier)
				return false;

			_missingColumn = CurrentQueryBlock.AllColumnReferences.SingleOrDefault(c => c.ColumnNode == CurrentNode);
			if (_missingColumn == null)
				return false;

			_table = GetSingleObjectReference(_missingColumn);
			return _missingColumn.ColumnNodeColumnReferences.Count == 0 && _missingColumn.ColumnNodeObjectReferences.Count <= 1 &&
			       _table != null && _table.Type == OracleObjectType.Table;
		}
Esempio n. 5
0
		private static OracleDataObject GetSingleObjectReference(OracleColumnReference column)
		{
			OracleSchemaObject dataObject = null;
			if (column.Owner.ObjectReferences.Count == 1)
			{
				dataObject = column.Owner.ObjectReferences.First().SchemaObject.GetTargetSchemaObject();
			}

			if (dataObject == null)
			{
				var schemaObjectReference = column.ValidObjectReference;
				if (schemaObjectReference != null)
				{
					dataObject = schemaObjectReference.SchemaObject.GetTargetSchemaObject();
				}
			}

			return dataObject != null && dataObject.Type == OracleObjectType.Table
				? (OracleDataObject)dataObject
				: null;
		}
Esempio n. 6
0
		private static bool IsCommonTableExpressionColumnReference(OracleQueryBlock cteQueryBlock, OracleColumnReference columnReference)
		{
			var objectReference = columnReference.ValidObjectReference;
			return objectReference.QueryBlocks.Count == 1 && (objectReference as OracleDataObjectReference)?.AliasNode == null && objectReference.QueryBlocks.First() == cteQueryBlock;
		}
Esempio n. 7
0
		private static ColumnDetailsModel BuildColumnDetailsModel(OracleDatabaseModelBase databaseModel, OracleColumnReference columnReference)
		{
			var columnOwner = columnReference.ValidObjectReference.SchemaObject.GetTargetSchemaObject().FullyQualifiedName;

			var dataModel =
				new ColumnDetailsModel
				{
					Owner = columnOwner.ToString(),
					Name = OracleCodeCompletionProvider.GetPrettyColumnName(columnReference.ColumnDescription.Name),
					Nullable = columnReference.ColumnDescription.Nullable,
					Invisible = columnReference.ColumnDescription.Hidden,
					Virtual = columnReference.ColumnDescription.Virtual,
					IsSystemGenerated = columnReference.ColumnDescription.UserGenerated == false,
					DataType = columnReference.ColumnDescription.FullTypeName,
					DefaultValue = BuildDefaultValuePreview(columnReference.ColumnDescription.DefaultValue)
				};

			databaseModel.UpdateColumnDetailsAsync(columnOwner, columnReference.ColumnDescription.Name, dataModel, CancellationToken.None);

			return dataModel;
		}
Esempio n. 8
0
		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()}";
		}
Esempio n. 9
0
		private string GetUnnestedColumnExpression(OracleColumnReference columnReference)
		{
			return CurrentQueryBlock.Columns
				.Where(c => !c.IsAsterisk && String.Equals(c.NormalizedName, columnReference.NormalizedName))
				.Select(c => GetUnnestedColumnExpression(columnReference, c))
				.FirstOrDefault();
		}
Esempio n. 10
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;
		}
Esempio n. 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);
		}