protected override CommandCanExecuteResult CanExecute() { if (CurrentNode == null) { return(false); } _objectReference = SemanticModel.GetReference <OracleDataObjectReference>(CurrentNode); _view = _objectReference?.SchemaObject.GetTargetSchemaObject() as OracleView; return(_view != null); }
private OracleDataObjectReference BuildSelfObjectReference() { _selfObjectReference = new OracleDataObjectReference(ReferenceType.InlineView) { AliasNode = AliasNode, Owner = this }; _selfObjectReference.QueryBlocks.Add(this); return _selfObjectReference; }
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); }
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); }
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); }
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; }
private static IEnumerable<ColumnDescriptionItem> GetPseudocolumns(OracleDataObjectReference reference) { return reference.Pseudocolumns.Select(c => GetExpandedColumn(reference, c, true)); }
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; }
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); }
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; }
private static IEnumerable <ColumnDescriptionItem> GetPseudocolumns(OracleDataObjectReference reference) { return(reference.Pseudocolumns.Select(c => GetExpandedColumn(reference, c, true))); }
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()})" }; } }