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