Пример #1
0
        protected override CommandCanExecuteResult CanExecute()
        {
            if (CurrentNode == null)
            {
                return(false);
            }

            _objectReference = SemanticModel.GetReference <OracleDataObjectReference>(CurrentNode);
            _view            = _objectReference?.SchemaObject.GetTargetSchemaObject() as OracleView;
            return(_view != null);
        }
Пример #2
0
		private OracleDataObjectReference BuildSelfObjectReference()
		{
			_selfObjectReference =
				new OracleDataObjectReference(ReferenceType.InlineView)
				{
					AliasNode = AliasNode,
					Owner = this
				};

			_selfObjectReference.QueryBlocks.Add(this);

			return _selfObjectReference;
		}
Пример #3
0
        public void AddObjectAlias(OracleDataObjectReference dataObjectReference, string alias)
        {
            var prefixedColumnReferences = dataObjectReference.Owner.AllColumnReferences
                                           .Where(c => (c.OwnerNode != null || c.ObjectNode != null) && c.ObjectNodeObjectReferences.Count == 1 && c.ObjectNodeObjectReferences.First() == dataObjectReference);

            foreach (var columnReference in prefixedColumnReferences)
            {
                var firstPrefixNode = columnReference.OwnerNode ?? columnReference.ObjectNode;

                _executionContext.SegmentsToReplace.Add(
                    new TextSegment
                {
                    IndextStart = firstPrefixNode.SourcePosition.IndexStart,
                    Length      = columnReference.ColumnNode.SourcePosition.IndexStart - firstPrefixNode.SourcePosition.IndexStart,
                    Text        = alias + "."
                });
            }

            var         currentName  = dataObjectReference.FullyQualifiedObjectName.NormalizedName;
            var         isUnquotable = !String.Equals(alias, currentName) && String.Equals(alias.ToQuotedIdentifier(), currentName);
            TextSegment textSegment;

            if (isUnquotable)
            {
                textSegment =
                    new TextSegment
                {
                    IndextStart = dataObjectReference.ObjectNode.SourcePosition.IndexStart,
                    Length      = dataObjectReference.ObjectNode.SourcePosition.Length,
                    Text        = alias
                };
            }
            else
            {
                textSegment =
                    new TextSegment
                {
                    IndextStart = (dataObjectReference.FlashbackClauseNode ?? dataObjectReference.DatabaseLinkNode ?? dataObjectReference.ObjectNode).SourcePosition.IndexEnd + 1,
                    Length      = 0,
                    Text        = $" {alias}"
                };
            }

            _executionContext.SegmentsToReplace.Add(textSegment);
        }
Пример #4
0
        private bool CanWrapSchemaObjectReference()
        {
            if (!CurrentNode.Id.In(Terminals.ObjectIdentifier, Terminals.ObjectAlias, Terminals.XmlTable, Terminals.JsonTable, Terminals.Table))
            {
                return(false);
            }

            var dataObjectReference = SemanticModel.AllReferenceContainers
                                      .SelectMany(c => c.ObjectReferences)
                                      .SingleOrDefault(
                r => (r.ObjectNode == CurrentNode || r.AliasNode == CurrentNode ||
                      (r.RootNode.FirstTerminalNode == CurrentNode && r.RootNode.FirstTerminalNode.Id.In(Terminals.XmlTable, Terminals.JsonTable, Terminals.Table))) &&
                r.Columns.Count > 0);

            if (dataObjectReference != null &&
                (dataObjectReference.Type.In(ReferenceType.TableCollection, ReferenceType.XmlTable, ReferenceType.JsonTable, ReferenceType.CommonTableExpression) || dataObjectReference.SchemaObject != null))
            {
                _dataObjectReference = dataObjectReference;
            }

            return(_dataObjectReference != null);
        }
Пример #5
0
        protected override CommandCanExecuteResult CanExecute()
        {
            if (CurrentNode == null || CurrentQueryBlock == null)
            {
                return(false);
            }

            if (CurrentNode.Id == Terminals.ObjectIdentifier)
            {
                var objectReferences = CurrentQueryBlock.ObjectReferences
                                       .SelectMany(o => o.IncludeInnerReferences)
                                       .Where(o => o.ObjectNode == CurrentNode)
                                       .ToArray();

                return(objectReferences.Length == 1 && (_currentObjectReference = objectReferences[0]).AliasNode == null);
            }

            if (CurrentNode.Id == Terminals.Identifier)
            {
                return(GetCurrentColumnReference() != null);
            }

            return(false);
        }
Пример #6
0
		protected override CommandCanExecuteResult CanExecute()
		{
			if (CurrentNode == null || CurrentQueryBlock == null)
			{
				return false;
			}
			
			if (CurrentNode.Id == Terminals.ObjectIdentifier)
			{
				var objectReferences = CurrentQueryBlock.ObjectReferences
					.SelectMany(o => o.IncludeInnerReferences)
					.Where(o => o.ObjectNode == CurrentNode)
					.ToArray();
				
				return objectReferences.Length == 1 && (_currentObjectReference = objectReferences[0]).AliasNode == null;
			}

			if (CurrentNode.Id == Terminals.Identifier)
			{
				return GetCurrentColumnReference() != null;
			}

			return false;
		}
Пример #7
0
		private static IEnumerable<ColumnDescriptionItem> GetPseudocolumns(OracleDataObjectReference reference)
		{
			return reference.Pseudocolumns.Select(c => GetExpandedColumn(reference, c, true));
		}
Пример #8
0
		private static IEnumerable<OracleCodeCompletionItem> GenerateTablePartitionItems(OracleDataObjectReference tableReference, OracleCodeCompletionType completionType, bool subPartitions)
		{
			var table = tableReference.SchemaObject.GetTargetSchemaObject() as OracleTable;
			if (table == null)
			{
				return Enumerable.Empty<OracleCodeCompletionItem>();
			}

			var sourcePartitions = subPartitions
				? table.Partitions.Values.SelectMany(p => p.SubPartitions.Values)
				: (IEnumerable<OraclePartitionBase>)table.Partitions.Values;

			var quotedTerminalValueUnderCursor = completionType.TerminalValueUnderCursor.ToQuotedIdentifier();
			var partitions = sourcePartitions
				.Where(p => (String.IsNullOrEmpty(completionType.TerminalValueUnderCursor) || !String.Equals(quotedTerminalValueUnderCursor, p.Name)) &&
				            CodeCompletionSearchHelper.IsMatch(p.Name, completionType.TerminalValuePartUntilCaret))
				.Select(l =>
					new OracleCodeCompletionItem
					{
						Name = l.Name.ToSimpleIdentifier(),
						Text = l.Name.ToSimpleIdentifier(),
						Category = subPartitions ? OracleCodeCompletionCategory.Subpartition : OracleCodeCompletionCategory.Partition,
						StatementNode = completionType.ReferenceIdentifier.IdentifierUnderCursor
					});
			
			return partitions;
		}
Пример #9
0
		private static OracleObjectIdentifier GetJoinedObjectIdentifier(OracleDataObjectReference objectReference, int cursorPosition)
		{
			return objectReference.AliasNode == null || objectReference.AliasNode.SourcePosition.IndexEnd < cursorPosition
				? objectReference.FullyQualifiedObjectName
				: OracleObjectIdentifier.Create(objectReference.OwnerNode, objectReference.ObjectNode, null);
		}
Пример #10
0
		private static IEnumerable<ICodeCompletionItem> GenerateJoinConditionSuggestionItems(OracleDataObjectReference parentSchemaObject, OracleDataObjectReference joinedSchemaObject, OracleCodeCompletionType completionType, int insertOffset)
		{
			var suggestionItems = new List<ICodeCompletionItem>();
			var skipOnTerminal = String.Equals(completionType.EffectiveTerminal.Id, Terminals.On);

			var parentObject = parentSchemaObject.SchemaObject.GetTargetSchemaObject() as OracleDataObject;
			var joinedObject = joinedSchemaObject.SchemaObject.GetTargetSchemaObject() as OracleDataObject;

			var effectiveJoinedObjectIdentifier = GetJoinedObjectIdentifier(joinedSchemaObject, completionType.CursorPosition);
			var referenceConstraintJoinConditionFound = false;
			if (parentObject != null && joinedObject != null && (parentObject.ReferenceConstraints.Any() || joinedObject.ReferenceConstraints.Any()))
			{
				var joinedToParentKeys = parentObject.ReferenceConstraints.Where(k => k.TargetObject == joinedObject)
					.Select(k => GenerateJoinConditionSuggestionItem(parentSchemaObject.FullyQualifiedObjectName, effectiveJoinedObjectIdentifier, k.Columns, k.ReferenceConstraint.Columns, OracleCodeCompletionCategory.JoinConditionByReferenceConstraint, false, skipOnTerminal, insertOffset, 0));

				suggestionItems.AddRange(joinedToParentKeys);

				var parentToJoinedKeys = joinedObject.ReferenceConstraints.Where(k => k.TargetObject == parentObject)
					.Select(k => GenerateJoinConditionSuggestionItem(effectiveJoinedObjectIdentifier, parentSchemaObject.FullyQualifiedObjectName, k.Columns, k.ReferenceConstraint.Columns, OracleCodeCompletionCategory.JoinConditionByReferenceConstraint, true, skipOnTerminal, insertOffset, 0));

				suggestionItems.AddRange(parentToJoinedKeys);
				referenceConstraintJoinConditionFound = suggestionItems.Any();
			}
			
			if (!referenceConstraintJoinConditionFound)
			{
				var columnNameJoinConditions = parentSchemaObject.Columns
					.Where(c => !String.IsNullOrEmpty(c.Name)).Select(c => c.Name)
					.Intersect(
						joinedSchemaObject.Columns
						.Where(c => !String.IsNullOrEmpty(c.Name)).Select(c => c.Name))
					.Select(c => GenerateJoinConditionSuggestionItem(parentSchemaObject.FullyQualifiedObjectName, effectiveJoinedObjectIdentifier, new[] { c }, new[] { c }, OracleCodeCompletionCategory.JoinConditionByName, false, skipOnTerminal, insertOffset, 1));

				suggestionItems.AddRange(columnNameJoinConditions);
			}

			return suggestionItems;
		}
Пример #11
0
 private static IEnumerable <ColumnDescriptionItem> GetPseudocolumns(OracleDataObjectReference reference)
 {
     return(reference.Pseudocolumns.Select(c => GetExpandedColumn(reference, c, true)));
 }
Пример #12
0
		public void VisitDataObjectReference(OracleDataObjectReference objectReference)
		{
			if (TryBuildSchemaTooltip(objectReference))
			{
				return;
			}

			if (objectReference.Type == ReferenceType.SchemaObject)
			{
				var schemaObject = objectReference.SchemaObject.GetTargetSchemaObject();
				if (schemaObject == null)
				{
					return;
				}

				TableDetailsModel dataModel;

				var databaseModel = objectReference.Container.SemanticModel.DatabaseModel;
				var toolTipText = GetFullSchemaObjectToolTip(objectReference.SchemaObject);

				switch (schemaObject.Type)
				{
					case OracleObjectType.MaterializedView:
						var materializedView = (OracleMaterializedView)schemaObject;
						dataModel =
							new MaterializedViewDetailsModel
							{
								MaterializedViewTitle = toolTipText,
								Title = GetObjectTitle(OracleObjectIdentifier.Create(materializedView.Owner, materializedView.TableName), OracleObjectType.Table.ToLower()),
								MaterializedView = materializedView
							};

						SetPartitionKeys(dataModel);

						databaseModel.UpdateTableDetailsAsync(schemaObject.FullyQualifiedName, dataModel, CancellationToken.None);
						ToolTip =
							new ToolTipMaterializedView
							{
								ScriptExtractor = databaseModel.ObjectScriptExtractor,
								DataContext = dataModel
							};

						break;

					case OracleObjectType.Table:
						dataModel =
							new TableDetailsModel
							{
								Title = toolTipText,
								Table = (OracleTable)schemaObject
							};

						SetPartitionKeys(dataModel);

						databaseModel.UpdateTableDetailsAsync(schemaObject.FullyQualifiedName, dataModel, CancellationToken.None);

						ToolTip =
							new ToolTipTable
							{
								ScriptExtractor = databaseModel.ObjectScriptExtractor,
								DataContext = dataModel
							};

						break;

					case OracleObjectType.View:
						var objectDetailModel =
							new ObjectDetailsModel
							{
								Title = toolTipText,
								Object = schemaObject
							};

						DocumentationDataDictionaryObject documentation;
						if (TryGetDataDictionaryObjectDocumentation(schemaObject.FullyQualifiedName, out documentation) && !String.IsNullOrWhiteSpace(documentation.Value))
						{
							objectDetailModel.Comment = documentation.Value;
						}
						else
						{
							databaseModel.UpdateViewDetailsAsync(schemaObject.FullyQualifiedName, objectDetailModel, CancellationToken.None);
						}

						ToolTip =
							new ToolTipView
							{
								IsExtractDdlVisible = true,
								ScriptExtractor = databaseModel.ObjectScriptExtractor,
								DataContext = objectDetailModel
							};
						
						break;

					case OracleObjectType.Sequence:
						ToolTip = new ToolTipSequence(toolTipText, (OracleSequence)schemaObject);
						break;
				}
			}
			else
			{
				ToolTip =
					new ToolTipObject
					{
						DataContext = $"{objectReference.FullyQualifiedObjectName.ToLabel()} ({objectReference.Type.ToCategoryLabel()})"
					};
			}
		}
        public void VisitDataObjectReference(OracleDataObjectReference objectReference)
        {
            if (TryBuildSchemaTooltip(objectReference))
            {
                return;
            }

            if (objectReference.Type == ReferenceType.SchemaObject)
            {
                var schemaObject = objectReference.SchemaObject.GetTargetSchemaObject();
                if (schemaObject == null)
                {
                    return;
                }

                TableDetailsModel dataModel;

                var databaseModel = objectReference.Container.SemanticModel.DatabaseModel;
                var toolTipText   = GetFullSchemaObjectToolTip(objectReference.SchemaObject);

                switch (schemaObject.Type)
                {
                case OracleObjectType.MaterializedView:
                    var materializedView = (OracleMaterializedView)schemaObject;
                    dataModel =
                        new MaterializedViewDetailsModel
                    {
                        MaterializedViewTitle = toolTipText,
                        Title            = GetObjectTitle(OracleObjectIdentifier.Create(materializedView.Owner, materializedView.TableName), OracleObjectType.Table.ToLower()),
                        MaterializedView = materializedView
                    };

                    SetPartitionKeys(dataModel);

                    databaseModel.UpdateTableDetailsAsync(schemaObject.FullyQualifiedName, dataModel, CancellationToken.None);
                    ToolTip =
                        new ToolTipMaterializedView
                    {
                        ScriptExtractor = databaseModel.ObjectScriptExtractor,
                        DataContext     = dataModel
                    };

                    break;

                case OracleObjectType.Table:
                    dataModel =
                        new TableDetailsModel
                    {
                        Title = toolTipText,
                        Table = (OracleTable)schemaObject
                    };

                    SetPartitionKeys(dataModel);

                    databaseModel.UpdateTableDetailsAsync(schemaObject.FullyQualifiedName, dataModel, CancellationToken.None);

                    ToolTip =
                        new ToolTipTable
                    {
                        ScriptExtractor = databaseModel.ObjectScriptExtractor,
                        DataContext     = dataModel
                    };

                    break;

                case OracleObjectType.View:
                    var objectDetailModel =
                        new ObjectDetailsModel
                    {
                        Title  = toolTipText,
                        Object = schemaObject
                    };

                    DocumentationDataDictionaryObject documentation;
                    if (TryGetDataDictionaryObjectDocumentation(schemaObject.FullyQualifiedName, out documentation) && !String.IsNullOrWhiteSpace(documentation.Value))
                    {
                        objectDetailModel.Comment = documentation.Value;
                    }
                    else
                    {
                        databaseModel.UpdateViewDetailsAsync(schemaObject.FullyQualifiedName, objectDetailModel, CancellationToken.None);
                    }

                    ToolTip =
                        new ToolTipView
                    {
                        IsExtractDdlVisible = true,
                        ScriptExtractor     = databaseModel.ObjectScriptExtractor,
                        DataContext         = objectDetailModel
                    };

                    break;

                case OracleObjectType.Sequence:
                    ToolTip = new ToolTipSequence(toolTipText, (OracleSequence)schemaObject);
                    break;
                }
            }
            else
            {
                ToolTip =
                    new ToolTipObject
                {
                    DataContext = $"{objectReference.FullyQualifiedObjectName.ToLabel()} ({objectReference.Type.ToCategoryLabel()})"
                };
            }
        }
Пример #14
0
		public void AddObjectAlias(OracleDataObjectReference dataObjectReference, string alias)
		{
			var prefixedColumnReferences = dataObjectReference.Owner.AllColumnReferences
				.Where(c => (c.OwnerNode != null || c.ObjectNode != null) && c.ObjectNodeObjectReferences.Count == 1 && c.ObjectNodeObjectReferences.First() == dataObjectReference);

			foreach (var columnReference in prefixedColumnReferences)
			{
				var firstPrefixNode = columnReference.OwnerNode ?? columnReference.ObjectNode;

				_executionContext.SegmentsToReplace.Add(
					new TextSegment
					{
						IndextStart = firstPrefixNode.SourcePosition.IndexStart,
						Length = columnReference.ColumnNode.SourcePosition.IndexStart - firstPrefixNode.SourcePosition.IndexStart,
						Text = alias + "."
					});
			}

			var currentName = dataObjectReference.FullyQualifiedObjectName.NormalizedName;
			var isUnquotable = !String.Equals(alias, currentName) && String.Equals(alias.ToQuotedIdentifier(), currentName);
			TextSegment textSegment;
			if (isUnquotable)
			{
				textSegment =
					new TextSegment
					{
						IndextStart = dataObjectReference.ObjectNode.SourcePosition.IndexStart,
						Length = dataObjectReference.ObjectNode.SourcePosition.Length,
						Text = alias
					};
			}
			else
			{
				textSegment =
					new TextSegment
					{
						IndextStart = (dataObjectReference.FlashbackClauseNode ?? dataObjectReference.DatabaseLinkNode ?? dataObjectReference.ObjectNode).SourcePosition.IndexEnd + 1,
						Length = 0,
						Text = $" {alias}"
					};
			}

			_executionContext.SegmentsToReplace.Add(textSegment);
		}