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 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()}");
        }
Example #3
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));
 }
Example #4
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));
 }
Example #5
0
        public static void ValidateCondition(OracleValidationModel validationModel, OracleColumnReference columnReference)
        {
            var columnDataTypeName = columnReference.ColumnDescription?.DataType.FullyQualifiedName.NormalizedName.Trim('"');

            if (String.IsNullOrEmpty(columnDataTypeName) || !columnReference.ColumnDescription.DataType.IsPrimitive)
            {
                return;
            }

            var condition = FindCondition(columnReference.RootNode);

            if (condition == null)
            {
                return;
            }

            var expression2 = condition[2];

            if (String.Equals(condition[1]?.Id, NonTerminals.RelationalOperator) &&
                String.Equals(expression2?.Id, NonTerminals.Expression))
            {
                var expression1         = condition[0];
                var referenceExpression = columnReference.RootNode.GetAncestor(NonTerminals.Expression);

                var expressionToCheck = expression1 == referenceExpression
                                        ? expression2
                                        : expression1;

                if (expressionToCheck[NonTerminals.ExpressionMathOperatorChainedList] != null)
                {
                    return;
                }

                var dummyColumn = new OracleColumn();
                if (!OracleDataType.TryResolveDataTypeFromExpression(expressionToCheck, dummyColumn))
                {
                    return;
                }

                var literalDataTypeName = dummyColumn.DataType.FullyQualifiedName.NormalizedName.Trim('"');

                var isColumnTimeOrNumber  = IsTime(columnDataTypeName) || IsNumeric(columnDataTypeName);
                var isLiteralTimeOrNumber = IsTime(literalDataTypeName) || IsNumeric(literalDataTypeName);
                if (isColumnTimeOrNumber && IsText(literalDataTypeName) || isLiteralTimeOrNumber && IsText(columnDataTypeName))
                {
                    validationModel.AddNonTerminalSuggestion(expressionToCheck, String.Format(OracleSuggestionType.ImplicitConversionWarning, columnDataTypeName, literalDataTypeName));
                }
            }
        }
        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);
        }
Example #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);
        }
        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);
        }
        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()
            };
        }