diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/Contracts/ExecutionPlanGraph.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/Contracts/ExecutionPlanGraph.cs index 8e971d1f..dab76ca8 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/Contracts/ExecutionPlanGraph.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/Contracts/ExecutionPlanGraph.cs @@ -4,6 +4,7 @@ // using System.Collections.Generic; +using Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan; namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.Contracts { @@ -103,6 +104,14 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.Contracts /// /// public string DisplayValue { get; set; } + /// + /// Indicates what kind of value is better amongst 2 values of the same property + /// + public BetterValue BetterValue { get; set; } + /// + /// Indicates the data type of the property + /// + public PropertyValueDataType DataType { get; set; } } public class NestedExecutionPlanGraphProperty : ExecutionPlanGraphPropertyBase @@ -185,8 +194,16 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.Contracts public enum BadgeType { - WARNING = 0, - CRITICALWARNING = 1, - PARALLELISM = 2 + Warning = 0, + CriticalWarning = 1, + Parallelism = 2 + } + + public enum PropertyValueDataType + { + Number = 0, + String = 1, + Boolean = 2, + Nested = 3 } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanGraphUtils.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanGraphUtils.cs index 55c2920e..d9c16867 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanGraphUtils.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanGraphUtils.cs @@ -63,7 +63,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan { overlays.Add(new Badge { - Type = BadgeType.CRITICALWARNING, + Type = BadgeType.CriticalWarning, Tooltip = SR.WarningOverlayTooltip }); } @@ -71,7 +71,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan { overlays.Add(new Badge { - Type = BadgeType.WARNING, + Type = BadgeType.Warning, Tooltip = SR.WarningOverlayTooltip }); } @@ -80,7 +80,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan { overlays.Add(new Badge { - Type = BadgeType.PARALLELISM, + Type = BadgeType.Parallelism, Tooltip = SR.ParallelismOverlayTooltip }); } @@ -105,7 +105,32 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan var complexProperty = prop.Value as ExpandableObjectWrapper; if (complexProperty == null) { + if(!prop.IsBrowsable) + { + continue; + } var propertyValue = prop.DisplayValue; + var propertyDataType = PropertyValueDataType.String; + switch (prop.Value) + { + case string stringValue: + propertyDataType = PropertyValueDataType.String; + break; + case int integerValue: + case long longIntegerValue: + case uint unsignedIntegerValue: + case ulong unsignedLongValue: + case float floatValue: + case double doubleValue: + propertyDataType = PropertyValueDataType.Number; + break; + case bool booleanValue: + propertyDataType = PropertyValueDataType.Boolean; + break; + default: + propertyDataType = PropertyValueDataType.String; + break; + } propsList.Add(new ExecutionPlanGraphProperty() { Name = prop.DisplayName, @@ -113,7 +138,9 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan ShowInTooltip = prop.ShowInTooltip, DisplayOrder = prop.DisplayOrder, PositionAtBottom = prop.IsLongString, - DisplayValue = GetPropertyDisplayValue(prop) + DisplayValue = GetPropertyDisplayValue(prop), + BetterValue = prop.BetterValue, + DataType = propertyDataType }); } else @@ -126,7 +153,9 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan ShowInTooltip = prop.ShowInTooltip, DisplayOrder = prop.DisplayOrder, PositionAtBottom = prop.IsLongString, - DisplayValue = GetPropertyDisplayValue(prop) + DisplayValue = GetPropertyDisplayValue(prop), + BetterValue = prop.BetterValue, + DataType = PropertyValueDataType.Nested }); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/Attributes.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/Attributes.cs index 244466e6..8a2015a6 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/Attributes.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/Attributes.cs @@ -283,5 +283,33 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan private bool longString = false; } + public sealed class BetterValueAttribute : Attribute + { + public BetterValueAttribute() + { + this.value = BetterValue.None; + } + + public BetterValueAttribute(BetterValue value) + { + this.value = value; + } + + public BetterValue Value + { + get { return this.value; } + } + + private BetterValue value; + } + + public enum BetterValue + { + LowerNumber = 0, + HigherNumber = 1, + True = 2, + False = 3, + None = 4 + } #endregion } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyFactory.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyFactory.cs index 53fda3a4..8838f08c 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyFactory.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyFactory.cs @@ -62,45 +62,44 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [TypeConverter(typeof(DataSizeTypeConverter))] public int AvgRowSize { get { return 0; } } - [ShowInToolTip, DisplayOrder(7), DisplayNameDescription(SR.Keys.CachedPlanSize, SR.Keys.CachedPlanSizeDescription)] + [ShowInToolTip, DisplayOrder(7), DisplayNameDescription(SR.Keys.CachedPlanSize, SR.Keys.CachedPlanSizeDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(KBSizeTypeConverter))] public int CachedPlanSize { get { return 0; } } - [ShowInToolTip, DisplayOrder(7), DisplayNameDescription(SR.Keys.UsePlan)] + [ShowInToolTip, DisplayOrder(7), DisplayNameDescription(SR.Keys.UsePlan), BetterValue(BetterValue.True)] public bool UsePlan { get { return false; } } [ShowInToolTip, DisplayOrder(7), DisplayNameDescription(SR.Keys.ContainsInlineScalarTsqlUdfs)] public bool ContainsInlineScalarTsqlUdfs { get { return false; } } - [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.EstimatedIoCost, SR.Keys.EstimatedIoCostDescription)] + [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.EstimatedIoCost, SR.Keys.EstimatedIoCostDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimateIO { get { return 0; } } - [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.DegreeOfParallelism, SR.Keys.DegreeOfParallelismDescription)] + [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.DegreeOfParallelism, SR.Keys.DegreeOfParallelismDescription), BetterValue(BetterValue.HigherNumber)] public int DegreeOfParallelism { get { return 0; } } - [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.EffectiveDegreeOfParallelism, SR.Keys.EffectiveDegreeOfParallelismDescription)] + [ShowInToolTip, DisplayOrder(8), DisplayNameDescription(SR.Keys.EffectiveDegreeOfParallelism, SR.Keys.EffectiveDegreeOfParallelismDescription), BetterValue(BetterValue.HigherNumber)] public int EffectiveDegreeOfParallelism { get { return 0; } } - [ShowInToolTip, DisplayOrder(9), DisplayNameDescription(SR.Keys.EstimatedCpuCost, SR.Keys.EstimatedCpuCostDescription)] + [ShowInToolTip, DisplayOrder(9), DisplayNameDescription(SR.Keys.EstimatedCpuCost, SR.Keys.EstimatedCpuCostDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimateCPU { get { return 0; } } - [ShowInToolTip, DisplayOrder(9), DisplayNameDescription(SR.Keys.MemoryGrant, SR.Keys.MemoryGrantDescription)] + [ShowInToolTip, DisplayOrder(9), DisplayNameDescription(SR.Keys.MemoryGrant, SR.Keys.MemoryGrantDescription), BetterValue(BetterValue.HigherNumber)] [TypeConverter(typeof(KBSizeTypeConverter))] public ulong MemoryGrant { get { return 0; } } [DisplayOrder(10), DisplayNameDescription(SR.Keys.ParameterList, SR.Keys.ParameterListDescription)] public object ParameterList { get { return null; } } - [ShowInToolTip, DisplayOrder(10), DisplayNameDescription(SR.Keys.NumberOfExecutions, SR.Keys.NumberOfExecutionsDescription)] + [ShowInToolTip, DisplayOrder(10), DisplayNameDescription(SR.Keys.NumberOfExecutions, SR.Keys.NumberOfExecutionsDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double ActualExecutions { get { return 0; } } - [ShowInToolTip, DisplayOrder(10), DisplayNameDescription(SR.Keys.EstimatedNumberOfExecutions, SR.Keys.EstimatedNumberOfExecutionsDescription)] + [ShowInToolTip, DisplayOrder(10), DisplayNameDescription(SR.Keys.EstimatedNumberOfExecutions, SR.Keys.EstimatedNumberOfExecutionsDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] - public double EstimateExecutions { get { return 0; } } [ShowInToolTip(LongString = true), DisplayOrder(12), DisplayNameDescription(SR.Keys.ObjectShort, SR.Keys.ObjectDescription)] @@ -112,83 +111,83 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [DisplayOrder(12), DisplayNameDescription(SR.Keys.OperationArgumentShort, SR.Keys.OperationArgumentDescription)] public string Argument { get { return null; } } - [ShowInToolTip, DisplayOrder(111), DisplayNameDescription(SR.Keys.ActualRebinds, SR.Keys.ActualRebindsDescription)] + [ShowInToolTip, DisplayOrder(111), DisplayNameDescription(SR.Keys.ActualRebinds, SR.Keys.ActualRebindsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualRebinds { get { return null; } } - [ShowInToolTip, DisplayOrder(112), DisplayNameDescription(SR.Keys.ActualRewinds, SR.Keys.ActualRewindsDescription)] + [ShowInToolTip, DisplayOrder(112), DisplayNameDescription(SR.Keys.ActualRewinds, SR.Keys.ActualRewindsDescription), BetterValue(BetterValue.HigherNumber)] public object ActualRewinds { get { return null; } } [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLocallyAggregatedRows, SR.Keys.ActualLocallyAggregatedRowsDescription)] public object ActualLocallyAggregatedRows { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualElapsedms, SR.Keys.ActualElapsedmsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualElapsedms, SR.Keys.ActualElapsedmsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualElapsedms { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualCPUms, SR.Keys.ActualCPUmsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualCPUms, SR.Keys.ActualCPUmsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualCPUms { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualScans, SR.Keys.ActualScansDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualScans, SR.Keys.ActualScansDescription), BetterValue(BetterValue.LowerNumber)] public object ActualScans { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLogicalReads, SR.Keys.ActualLogicalReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLogicalReads, SR.Keys.ActualLogicalReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualLogicalReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPhysicalReads, SR.Keys.ActualPhysicalReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPhysicalReads, SR.Keys.ActualPhysicalReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualPhysicalReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPageServerReads, SR.Keys.ActualPageServerReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPageServerReads, SR.Keys.ActualPageServerReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualPageServerReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualReadAheads, SR.Keys.ActualReadAheadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualReadAheads, SR.Keys.ActualReadAheadsDescription), BetterValue(BetterValue.HigherNumber)] public object ActualReadAheads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPageServerReadAheads, SR.Keys.ActualPageServerReadAheadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualPageServerReadAheads, SR.Keys.ActualPageServerReadAheadsDescription), BetterValue(BetterValue.HigherNumber)] public object ActualPageServerReadAheads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobLogicalReads, SR.Keys.ActualLobLogicalReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobLogicalReads, SR.Keys.ActualLobLogicalReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualLobLogicalReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPhysicalReads, SR.Keys.ActualLobPhysicalReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPhysicalReads, SR.Keys.ActualLobPhysicalReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualLobPhysicalReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPageServerReads, SR.Keys.ActualLobPageServerReadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPageServerReads, SR.Keys.ActualLobPageServerReadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualLobPageServerReads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobReadAheads, SR.Keys.ActualLobReadAheadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobReadAheads, SR.Keys.ActualLobReadAheadsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualLobReadAheads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPageServerReadAheads, SR.Keys.ActualLobPageServerReadAheadsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualLobPageServerReadAheads, SR.Keys.ActualLobPageServerReadAheadsDescription), BetterValue(BetterValue.HigherNumber)] public object ActualLobPageServerReadAheads { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualIOStatistics, SR.Keys.ActualIOStatisticsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualIOStatistics, SR.Keys.ActualIOStatisticsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualIOStatistics { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualTimeStatistics, SR.Keys.ActualTimeStatisticsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualTimeStatistics, SR.Keys.ActualTimeStatisticsDescription), BetterValue(BetterValue.LowerNumber)] public object ActualTimeStatistics { get { return null; } } - [DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualMemoryGrantStats, SR.Keys.ActualMemoryGrantStats)] + [DisplayOrder(221), DisplayNameDescription(SR.Keys.ActualMemoryGrantStats, SR.Keys.ActualMemoryGrantStats), BetterValue(BetterValue.HigherNumber)] public object ActualMemoryGrantStats { get { return null; } } [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcRowCount, SR.Keys.HpcRowCountDescription)] public object HpcRowCount { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcKernelElapsedUs, SR.Keys.HpcKernelElapsedUsDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcKernelElapsedUs, SR.Keys.HpcKernelElapsedUsDescription), BetterValue(BetterValue.LowerNumber)] public object HpcKernelElapsedUs { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcHostToDeviceBytes, SR.Keys.HpcHostToDeviceBytesDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcHostToDeviceBytes, SR.Keys.HpcHostToDeviceBytesDescription), BetterValue(BetterValue.LowerNumber)] public object HpcHostToDeviceBytes { get { return null; } } - [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcDeviceToHostBytes, SR.Keys.HpcDeviceToHostBytesDescription)] + [ShowInToolTip, DisplayOrder(221), DisplayNameDescription(SR.Keys.HpcDeviceToHostBytes, SR.Keys.HpcDeviceToHostBytesDescription), BetterValue(BetterValue.LowerNumber)] public object HpcDeviceToHostBytes { get { return null; } } - [DisplayOrder(221), DisplayNameDescription(SR.Keys.InputMemoryGrant, SR.Keys.InputMemoryGrant)] + [DisplayOrder(221), DisplayNameDescription(SR.Keys.InputMemoryGrant, SR.Keys.InputMemoryGrant), BetterValue(BetterValue.LowerNumber)] public object InputMemoryGrant { get { return null; } } - [DisplayOrder(221), DisplayNameDescription(SR.Keys.OutputMemoryGrant, SR.Keys.OutputMemoryGrant)] + [DisplayOrder(221), DisplayNameDescription(SR.Keys.OutputMemoryGrant, SR.Keys.OutputMemoryGrant), BetterValue(BetterValue.LowerNumber)] public object OutputMemoryGrant { get { return null; } } - [DisplayOrder(221), DisplayNameDescription(SR.Keys.UsedMemoryGrant, SR.Keys.UsedMemoryGrant)] + [DisplayOrder(221), DisplayNameDescription(SR.Keys.UsedMemoryGrant, SR.Keys.UsedMemoryGrant), BetterValue(BetterValue.LowerNumber)] public object UsedMemoryGrant { get { return null; } } [ShowInToolTip, DisplayOrder(2), DisplayNameDescription(SR.Keys.IsGraphDBTransitiveClosure, SR.Keys.IsGraphDBTransitiveClosureDescription)] @@ -218,23 +217,23 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [TypeConverter(typeof(FloatTypeConverter))] public double StatementEstRows { get { return 0; } } - [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedNumberOfRowsForAllExecutions, SR.Keys.EstimatedNumberOfRowsForAllExecutionsDescription)] + [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedNumberOfRowsForAllExecutions, SR.Keys.EstimatedNumberOfRowsForAllExecutionsDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimateRowsAllExecs { get { return 0; } } - [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedNumberOfRowsForAllExecutions, SR.Keys.EstimatedNumberOfRowsForAllExecutionsDescription)] + [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedNumberOfRowsForAllExecutions, SR.Keys.EstimatedNumberOfRowsForAllExecutionsDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double StatementEstRowsAllExecs { get { return 0; } } - [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedRowsRead, SR.Keys.EstimatedRowsReadDescription)] + [ShowInToolTip, DisplayOrder(100), DisplayNameDescription(SR.Keys.EstimatedRowsRead, SR.Keys.EstimatedRowsReadDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimatedRowsRead { get { return 0; } } - [DisplayOrder(101), DisplayNameDescription(SR.Keys.EstimatedRebinds, SR.Keys.EstimatedRebindsDescription)] + [DisplayOrder(101), DisplayNameDescription(SR.Keys.EstimatedRebinds, SR.Keys.EstimatedRebindsDescription), BetterValue(BetterValue.LowerNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimateRebinds { get { return 0; } } - [DisplayOrder(102), DisplayNameDescription(SR.Keys.EstimatedRewinds, SR.Keys.EstimatedRewindsDescription)] + [DisplayOrder(102), DisplayNameDescription(SR.Keys.EstimatedRewinds, SR.Keys.EstimatedRewindsDescription), BetterValue(BetterValue.HigherNumber)] [TypeConverter(typeof(FloatTypeConverter))] public double EstimateRewinds { get { return 0; } } @@ -247,7 +246,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [ShowInToolTip(LongString = true), DisplayOrder(202), DisplayNameDescription(SR.Keys.Warnings, SR.Keys.WarningsDescription)] public object Warnings { get { return null; } } - [DisplayOrder(203), DisplayNameDescription(SR.Keys.Parallel, SR.Keys.ParallelDescription)] + [DisplayOrder(203), DisplayNameDescription(SR.Keys.Parallel, SR.Keys.ParallelDescription), BetterValue(BetterValue.True)] public bool Parallel { get { return false; } } [DisplayOrder(204), DisplayNameDescription(SR.Keys.SetOptions, SR.Keys.SetOptionsDescription)] @@ -259,7 +258,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [DisplayOrder(206), DisplayNameDescription(SR.Keys.StatementOptmEarlyAbortReason)] public string StatementOptmEarlyAbortReason { get { return null; } } - [DisplayOrder(211), DisplayNameDescription(SR.Keys.MemoryFractions, SR.Keys.MemoryFractionsDescription)] + [DisplayOrder(211), DisplayNameDescription(SR.Keys.MemoryFractions, SR.Keys.MemoryFractionsDescription), BetterValue(BetterValue.LowerNumber)] public object MemoryFractions { get { return null; } } [DisplayOrder(211), DisplayNameDescription(SR.Keys.MemoryFractionsInput, SR.Keys.MemoryFractionsInputDescription)] @@ -370,10 +369,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [ShowInToolTip, DisplayOrder(150), DisplayNameDescription(SR.Keys.Partitioned, SR.Keys.PartitionedDescription)] public object Partitioned { get { return null; } } - [DisplayOrder(156), DisplayNameDescription(SR.Keys.PartitionsAccessed)] + [DisplayOrder(156), DisplayNameDescription(SR.Keys.PartitionsAccessed), BetterValue(BetterValue.LowerNumber)] public object PartitionsAccessed { get { return null; } } - [ShowInToolTip, DisplayOrder(152), DisplayNameDescription(SR.Keys.PartitionCount)] + [ShowInToolTip, DisplayOrder(152), DisplayNameDescription(SR.Keys.PartitionCount), BetterValue(BetterValue.LowerNumber)] public object PartitionCount { get { return null; } } [ShowInToolTip(LongString = true), DisplayOrder(203), DisplayNameDescription(SR.Keys.TieColumns, SR.Keys.TieColumnsDescription)] @@ -442,7 +441,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [ShowInToolTip, DisplayOrder(203), DisplayNameDescription(SR.Keys.RowCount)] public bool RowCount { get { return false; } } - [DisplayOrder(6), DisplayNameDescription(SR.Keys.Optimized)] + [DisplayOrder(6), DisplayNameDescription(SR.Keys.Optimized), BetterValue(BetterValue.True)] public bool Optimized { get { return false; } } [DisplayOrder(6), DisplayNameDescription(SR.Keys.WithPrefetch)] @@ -570,16 +569,30 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan [DisplayOrder(201), DisplayNameDescription(SR.Keys.FragmentIdColumn)] public object FragmentIdColumn { get { return null; } } + public string CardinalityEstimationModelVersion { get { return null; } } + + [BetterValue(BetterValue.LowerNumber)] public string CompileCPU { get { return null; } } + + [BetterValue(BetterValue.LowerNumber)] public string CompileMemory { get { return null; } } + + [BetterValue(BetterValue.LowerNumber)] public string CompileTime { get { return null; } } + public string NonParallelPlanReason { get { return null; } } + public string QueryHash { get { return null; } } + public string QueryPlanHash { get { return null; } } + public bool RetrievedFromCache { get { return false; } } + public bool SecurityPolicyApplied { get { return false; } } + public bool NoExpandHint { get { return false; } } + public double TableCardinality { get { return 0; } } #endregion diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyValue.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyValue.cs index b1a22c5d..550b8abe 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyValue.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ShowPlan/PropertyValue.cs @@ -66,6 +66,15 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan } } + public BetterValue BetterValue + { + get + { + InitializeDisplayAttributesIfNecessary(); + return this.betterValue; + } + } + public void SetDisplayNameAndDescription(string newDisplayName, string newDescription) { this.displayName = newDisplayName; @@ -202,6 +211,16 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan { this.showInTooltip = false; } + + BetterValueAttribute betterValueAttribute = + Attributes[typeof(BetterValueAttribute)] as BetterValueAttribute; + if (betterValueAttribute != null) + { + this.betterValue = betterValueAttribute.Value; + } else + { + this.betterValue = BetterValue.None; + } } #region Private members @@ -216,6 +235,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan.ShowPlan private bool isLongString; private bool initialized; private bool showInTooltip; + private BetterValue betterValue; #endregion