From 3294a52ad939ee6804bcd9360a945fbc66cbfb08 Mon Sep 17 00:00:00 2001 From: Jordan Hays <58005768+nofield@users.noreply.github.com> Date: Fri, 29 Jul 2022 18:35:37 -0400 Subject: [PATCH] Or Filtering on Object Explorer Nodes (#1608) support for a more robust filtering system in the Object Explorer xml, allowing for or-ing filter properties together for use in URN querying for objects Co-authored-by: Charles Gagnon --- docs/guide/object_explorer.md | 39 +- .../ObjectExplorer/Nodes/ChildFactory.cs | 2 +- .../ObjectExplorer/Nodes/INodeFilter.cs | 57 + .../ObjectExplorer/Nodes/NodeOrFilter.cs | 58 + .../{NodeFilter.cs => NodePropertyFilter.cs} | 64 +- .../SmoModel/SmoChildFactoryBase.cs | 24 +- .../ObjectExplorer/SmoModel/SmoTreeNodes.cs | 1381 +++++++++-------- .../ObjectExplorer/SmoModel/SmoTreeNodes.tt | 232 ++- .../ObjectExplorer/NodeFilterTests.cs | 195 +++ .../ObjectExplorer/SmoQueryModelTests.cs | 4 +- 10 files changed, 1229 insertions(+), 827 deletions(-) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/INodeFilter.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeOrFilter.cs rename src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/{NodeFilter.cs => NodePropertyFilter.cs} (54%) create mode 100644 test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeFilterTests.cs diff --git a/docs/guide/object_explorer.md b/docs/guide/object_explorer.md index 0e6a1c9b..7836889b 100644 --- a/docs/guide/object_explorer.md +++ b/docs/guide/object_explorer.md @@ -15,6 +15,18 @@ SmoTreeNodesDefinition.xml defines all the hierarchies and all the supported obj * How to filter objects based on the properties in each node * How to query each object (Reference to another generated code to query each object type) +#### Filters + +\ is an optional part of an SMO Node definition, which is used to filter objects based on the expected properties for a certain node type. + +A \ node is comprised of \ and \ nodes + - A \ node defines the properties to construct a NodePropertyFilter object + - An \ node defines a list of \ nodes that are or'ed in the resulting URN Query + +\ can have an arbitrary number of top-level \ and \ nodes. +All filters defined at the top-level are and'ed in the resulting URN Query. +This is generated into the `IEnumerable Filters` property for a particular SMO object in SmoTreeNodes.cs. + ### SmoQueryModelDefinition.xml SmoQueryModelDefinition.xml defines the supported object types and how to query each type using SMO library. ChildQuerierTypes attribute in SmoTreeNodesDefinition.xml nodes has reference to the types in this xml file. It includes: @@ -27,7 +39,7 @@ To get each object type, SMO by default only gets the name and schema and not al To optimize the query to get the properties needed to create each node, add the properties to the node element in SmoTreeNodesDefinition.xml. -For example, to get the table node, we also need to get two properties IsSystemVersioned and TemporalType which are included as properties in the table node: +For example, to get the table node, we also need to get three properties IsSystemVersioned, LedgerType, and TemporalType which are included as properties in the table node: ### Sample @@ -39,15 +51,38 @@ For example, to get the table node, we also need to get two properties IsSystemV TableTemporalType.None TableTemporalType.SystemVersioned + + LedgerTableType.None + LedgerTableType.UpdatableLedgerTable + LedgerTableType.AppendOnlyLedgerTable + - + + ``` +### Sample \ Node Usage + +```xml + + + + + TableTemporalType.HistoryTable + + + LedgerTableType.HistoryTable + + + + +``` + ## Guides ### Add a new SQL object type diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs index 43151021..a2c622e4 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/ChildFactory.cs @@ -36,7 +36,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes /// /// The list of filters that should be applied on the smo object list /// - public abstract IEnumerable Filters { get; } + public abstract IEnumerable Filters { get; } /// /// The list of properties to be loaded with the object diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/INodeFilter.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/INodeFilter.cs new file mode 100644 index 00000000..fad49965 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/INodeFilter.cs @@ -0,0 +1,57 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using System.Collections.Generic; +//using System.Linq; +using System.Text; + +namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes +{ + /// + /// Has information for filtering a SMO object by properties + /// + public interface INodeFilter + { + /// + /// Returns true if the filter can be apply to the given type and Server type + /// + /// Type of the querier + /// Server Type + /// + bool CanApplyFilter(Type type, ValidForFlag validForFlag); + + /// + /// Creates a string from the filter property and values to be used in the Urn to query the SQL objects + /// Example of the output:[@ IsSystemObject = 0] + /// + /// + string ToPropertyFilterString(Type type, ValidForFlag validForFlag); + + /// + /// Creates a fully paramaterized property filter string for the URN query for SQL objects. + /// Example of the output:[@ IsSystemObject = 0] + /// + /// + public static string GetPropertyFilter(IEnumerable filters, Type type, ValidForFlag validForFlag) + { + StringBuilder filter = new StringBuilder(); + foreach (var value in filters) + { + string andPrefix = filter.Length == 0 ? string.Empty : " and "; + var filterString = value.ToPropertyFilterString(type, validForFlag); + if (filterString != string.Empty) { + filter.Append($"{andPrefix}{filterString}"); + } + } + + if (filter.Length != 0) + { + return "[" + filter.ToString() + "]"; + } + return string.Empty; + } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeOrFilter.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeOrFilter.cs new file mode 100644 index 00000000..1ae2b4b9 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeOrFilter.cs @@ -0,0 +1,58 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes +{ + /// + /// Has information for filtering a SMO object by properties + /// + public class NodeOrFilter : INodeFilter + { + /// + /// Filter values + /// + public List FilterList { get; set; } + + /// + /// Returns true if any of the filters within the FilterList apply to the type and server type. + /// + /// Type of the querier + /// Server Type + public bool CanApplyFilter(Type type, ValidForFlag validForFlag) { + return this.FilterList.Exists(f => f.CanApplyFilter(type, validForFlag)); + } + + /// + /// Creates a string representation of a node "or" filter, which is combined in the INodeFilter interface to construct the filter used in the URN to query the SQL objects. + /// Example of the output: ((@TableTemporalType = 1) or (@LedgerTableType = 1)) + /// + /// + public string ToPropertyFilterString(Type type, ValidForFlag validForFlag) + { + StringBuilder filter = new StringBuilder(); + foreach (var nodeFilter in FilterList) + { + string orPrefix = filter.Length == 0 ? string.Empty : " or "; + + // For "or" filter, have to check each node as it's processed for whether it's valid. + var filterString = nodeFilter.ToPropertyFilterString(type, validForFlag); + if (filterString != string.Empty) + { + filter.Append($"{orPrefix}{filterString}"); + } + } + + if (filter.Length != 0) + { + return "(" + filter.ToString() + ")"; + } + return string.Empty; + } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeFilter.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodePropertyFilter.cs similarity index 54% rename from src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeFilter.cs rename to src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodePropertyFilter.cs index 192fd2e9..2f428134 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodeFilter.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Nodes/NodePropertyFilter.cs @@ -5,14 +5,14 @@ using System; using System.Collections.Generic; -using System.Linq; +using System.Text; namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes { /// /// Has information for filtering a SMO object by properties /// - public class NodeFilter + public class NodePropertyFilter : INodeFilter { /// /// Property name @@ -55,52 +55,40 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes } /// - /// Creates a string from the filter property and values to be used in the Urn to query the SQL objects - /// Example of the output:[@ IsSystemObject = 0] + /// Creates a string representation of a given node filter, which is combined in the INodeFilter interface to construct the filter used in the URN to query the SQL objects. + /// Example of the output: (@ IsSystemObject = 0) /// /// - public string ToPropertyFilterString() + public string ToPropertyFilterString(Type type, ValidForFlag validForFlag) { - string filter = ""; - List values = Values; - if (values != null) + // check first if the filter can be applied; if not just return empty string + if (!CanApplyFilter(type, validForFlag)) { - for (int i = 0; i < values.Count; i++) + return string.Empty; + } + + StringBuilder filter = new StringBuilder(); + foreach (var value in Values) + { + object propertyValue = value; + if (Type == typeof(string)) { - var value = values[i]; - object propertyValue = value; - if (Type == typeof(string)) - { - propertyValue = $"'{propertyValue}'"; - } - if (Type == typeof(Enum)) - { - propertyValue = (int)Convert.ChangeType(value, Type); - - } - string orPrefix = i == 0 ? string.Empty : "or"; - filter = $"{filter} {orPrefix} @{Property} = {propertyValue}"; + propertyValue = $"'{propertyValue}'"; } + else if (Type == typeof(Enum)) + { + propertyValue = (int)Convert.ChangeType(value, Type); + } + + string orPrefix = filter.Length == 0 ? string.Empty : " or "; + filter.Append($"{orPrefix}@{Property} = {propertyValue}"); } - filter = $"({filter})"; - return filter; - } - - public static string ConcatProperties(IEnumerable filters) - { - string filter = ""; - var list = filters.ToList(); - for (int i = 0; i < list.Count; i++) + if (filter.Length != 0) { - var value = list[i]; - - string andPrefix = i == 0 ? string.Empty : "and"; - filter = $"{filter} {andPrefix} {value.ToPropertyFilterString()}"; + return "(" + filter.ToString() + ")"; } - filter = $"[{filter}]"; - - return filter; + return string.Empty; } } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs index 642c71d2..de8c3682 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoChildFactoryBase.cs @@ -104,7 +104,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel var smoProperties = this.SmoProperties.Where(p => ServerVersionHelper.IsValidFor(serverValidFor, p.ValidFor)).Select(x => x.Name); if (!string.IsNullOrEmpty(name)) { - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { Property = "Name", Type = typeof(string), @@ -118,7 +118,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { continue; } - string propertyFilter = GetProperyFilter(filters, querier.GetType(), serverValidFor); + string propertyFilter = INodeFilter.GetPropertyFilter(filters, querier.GetType(), serverValidFor); try { var smoObjectList = querier.Query(context, propertyFilter, refresh, smoProperties).ToList(); @@ -162,22 +162,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel return filterTheNode; } - private string GetProperyFilter(IEnumerable filters, Type querierType, ValidForFlag validForFlag) - { - string filter = string.Empty; - if (filters != null) - { - var filtersToApply = filters.Where(f => f.CanApplyFilter(querierType, validForFlag)).ToList(); - filter = string.Empty; - if (filtersToApply.Any()) - { - filter = NodeFilter.ConcatProperties(filtersToApply); - } - } - - return filter; - } - private bool IsCompatibleQuerier(SmoQuerier querier) { if (ChildQuerierTypes == null) @@ -257,11 +241,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel } } - public override IEnumerable Filters + public override IEnumerable Filters { get { - return Enumerable.Empty(); + return Enumerable.Empty(); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.cs index b4a91ef4..d290b7ea 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.cs @@ -18,134 +18,134 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal sealed partial class DatabaseTreeNode : SmoTreeNode { - public DatabaseTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "Database"; - this.NodeTypeId = NodeTypes.Database; - OnInitialize(); - } + public DatabaseTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "Database"; + this.NodeTypeId = NodeTypes.Database; + OnInitialize(); + } } internal sealed partial class TableTreeNode : SmoTreeNode { - public TableTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "Table"; - this.NodeTypeId = NodeTypes.Table; - OnInitialize(); - } + public TableTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "Table"; + this.NodeTypeId = NodeTypes.Table; + OnInitialize(); + } } internal sealed partial class ViewTreeNode : SmoTreeNode { - public ViewTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "View"; - this.NodeTypeId = NodeTypes.View; - OnInitialize(); - } + public ViewTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "View"; + this.NodeTypeId = NodeTypes.View; + OnInitialize(); + } } internal sealed partial class UserDefinedTableTypeTreeNode : SmoTreeNode { - public UserDefinedTableTypeTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "UserDefinedTableType"; - this.NodeTypeId = NodeTypes.UserDefinedTableType; - OnInitialize(); - } + public UserDefinedTableTypeTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "UserDefinedTableType"; + this.NodeTypeId = NodeTypes.UserDefinedTableType; + OnInitialize(); + } } internal sealed partial class StoredProcedureTreeNode : SmoTreeNode { - public StoredProcedureTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "StoredProcedure"; - this.NodeTypeId = NodeTypes.StoredProcedure; - OnInitialize(); - } + public StoredProcedureTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "StoredProcedure"; + this.NodeTypeId = NodeTypes.StoredProcedure; + OnInitialize(); + } } internal sealed partial class TableValuedFunctionTreeNode : SmoTreeNode { - public TableValuedFunctionTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "TableValuedFunction"; - this.NodeTypeId = NodeTypes.TableValuedFunction; - OnInitialize(); - } + public TableValuedFunctionTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "TableValuedFunction"; + this.NodeTypeId = NodeTypes.TableValuedFunction; + OnInitialize(); + } } internal sealed partial class ScalarValuedFunctionTreeNode : SmoTreeNode { - public ScalarValuedFunctionTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "ScalarValuedFunction"; - this.NodeTypeId = NodeTypes.ScalarValuedFunction; - OnInitialize(); - } + public ScalarValuedFunctionTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "ScalarValuedFunction"; + this.NodeTypeId = NodeTypes.ScalarValuedFunction; + OnInitialize(); + } } internal sealed partial class AggregateFunctionTreeNode : SmoTreeNode { - public AggregateFunctionTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "AggregateFunction"; - this.NodeTypeId = NodeTypes.AggregateFunction; - OnInitialize(); - } + public AggregateFunctionTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "AggregateFunction"; + this.NodeTypeId = NodeTypes.AggregateFunction; + OnInitialize(); + } } internal sealed partial class FileGroupTreeNode : SmoTreeNode { - public FileGroupTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "FileGroup"; - this.NodeTypeId = NodeTypes.FileGroup; - OnInitialize(); - } + public FileGroupTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "FileGroup"; + this.NodeTypeId = NodeTypes.FileGroup; + OnInitialize(); + } } internal sealed partial class ExternalTableTreeNode : SmoTreeNode { - public ExternalTableTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "ExternalTable"; - this.NodeTypeId = NodeTypes.ExternalTable; - OnInitialize(); - } + public ExternalTableTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "ExternalTable"; + this.NodeTypeId = NodeTypes.ExternalTable; + OnInitialize(); + } } internal sealed partial class ExternalResourceTreeNode : SmoTreeNode { - public ExternalResourceTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "ExternalResource"; - this.NodeTypeId = NodeTypes.ExternalResource; - OnInitialize(); - } + public ExternalResourceTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "ExternalResource"; + this.NodeTypeId = NodeTypes.ExternalResource; + OnInitialize(); + } } internal sealed partial class HistoryTableTreeNode : SmoTreeNode { - public HistoryTableTreeNode() : base() - { - NodeValue = string.Empty; - this.NodeType = "HistoryTable"; - this.NodeTypeId = NodeTypes.HistoryTable; - OnInitialize(); - } + public HistoryTableTreeNode() : base() + { + NodeValue = string.Empty; + this.NodeType = "HistoryTable"; + this.NodeTypeId = NodeTypes.HistoryTable; + OnInitialize(); + } } [Export(typeof(ChildFactory))] @@ -188,25 +188,25 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Databases" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); return filters; - } + } } public override IEnumerable SmoProperties { - get - { + get + { var properties = new List(); properties.Add(new NodeSmoProperty { @@ -214,7 +214,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel ValidFor = ValidForFlag.All }); return properties; - } + } } protected override void OnExpandPopulateFolders(IList currentChildren, TreeNode parent) @@ -231,10 +231,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -373,27 +373,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemDatabases" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -412,10 +412,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlLinkedServerLoginQuerier), }; - } + get + { + return new [] { typeof(SqlLinkedServerLoginQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -436,10 +436,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlLoginQuerier), }; - } + get + { + return new [] { typeof(SqlLoginQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -460,10 +460,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServerRoleQuerier), }; - } + get + { + return new [] { typeof(SqlServerRoleQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -484,10 +484,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlCredentialQuerier), }; - } + get + { + return new [] { typeof(SqlCredentialQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -508,10 +508,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlCryptographicProviderQuerier), }; - } + get + { + return new [] { typeof(SqlCryptographicProviderQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -532,10 +532,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServerAuditQuerier), }; - } + get + { + return new [] { typeof(SqlServerAuditQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -556,10 +556,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServerAuditSpecificationQuerier), }; - } + get + { + return new [] { typeof(SqlServerAuditSpecificationQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -580,10 +580,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlEndpointQuerier), }; - } + get + { + return new [] { typeof(SqlEndpointQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -604,10 +604,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlLinkedServerQuerier), }; - } + get + { + return new [] { typeof(SqlLinkedServerQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -628,10 +628,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServerDdlTriggerQuerier), }; - } + get + { + return new [] { typeof(SqlServerDdlTriggerQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -652,10 +652,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlErrorMessageQuerier), }; - } + get + { + return new [] { typeof(SqlErrorMessageQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -741,9 +741,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -762,36 +763,36 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Tables" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { - Property = "TemporalType", - Type = typeof(Enum), - ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, - Values = new List - { - { TableTemporalType.None }, - { TableTemporalType.SystemVersioned } - } + Property = "TemporalType", + Type = typeof(Enum), + ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, + Values = new List + { + { TableTemporalType.None }, + { TableTemporalType.SystemVersioned } + } }); return filters; - } + } } public override IEnumerable SmoProperties { - get - { + get + { var properties = new List(); properties.Add(new NodeSmoProperty { @@ -814,7 +815,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12|ValidForFlag.SqlOnDemand }); return properties; - } + } } protected override void OnExpandPopulateFolders(IList currentChildren, TreeNode parent) @@ -831,10 +832,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlTableQuerier), }; - } + get + { + return new [] { typeof(SqlTableQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -851,19 +852,19 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Views" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); return filters; - } + } } protected override void OnExpandPopulateFolders(IList currentChildren, TreeNode parent) @@ -880,10 +881,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlViewQuerier), }; - } + get + { + return new [] { typeof(SqlViewQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -902,10 +903,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSynonymQuerier), }; - } + get + { + return new [] { typeof(SqlSynonymQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1269,27 +1270,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemTables" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlTableQuerier), }; - } + get + { + return new [] { typeof(SqlTableQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1306,24 +1307,24 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Table" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "TemporalType", - Type = typeof(Enum), - TypeToReverse = typeof(SqlHistoryTableQuerier), - ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, - Values = new List - { - { TableTemporalType.HistoryTable } - } + Property = "TemporalType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlHistoryTableQuerier), + ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, + Values = new List + { + { TableTemporalType.HistoryTable } + } }); return filters; - } + } } protected override void OnExpandPopulateFolders(IList currentChildren, TreeNode parent) @@ -1378,10 +1379,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlTableQuerier), typeof(SqlHistoryTableQuerier), }; - } + get + { + return new [] { typeof(SqlTableQuerier), typeof(SqlHistoryTableQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1434,9 +1435,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1476,10 +1478,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlTableQuerier), }; - } + get + { + return new [] { typeof(SqlTableQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1500,10 +1502,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlColumnQuerier), }; - } + get + { + return new [] { typeof(SqlColumnQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1523,33 +1525,33 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Keys" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IndexKeyType", - Type = typeof(Enum), - TypeToReverse = typeof(SqlIndexQuerier), - ValidFor = ValidForFlag.AllOnPrem|ValidForFlag.AzureV12, - Values = new List - { - { IndexKeyType.DriPrimaryKey }, - { IndexKeyType.DriUniqueKey } - } + Property = "IndexKeyType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlIndexQuerier), + ValidFor = ValidForFlag.AllOnPrem|ValidForFlag.AzureV12, + Values = new List + { + { IndexKeyType.DriPrimaryKey }, + { IndexKeyType.DriUniqueKey } + } }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlIndexQuerier), typeof(SqlForeignKeyConstraintQuerier), }; - } + get + { + return new [] { typeof(SqlIndexQuerier), typeof(SqlForeignKeyConstraintQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1570,10 +1572,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDefaultConstraintQuerier), typeof(SqlCheckQuerier), }; - } + get + { + return new [] { typeof(SqlDefaultConstraintQuerier), typeof(SqlCheckQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1594,10 +1596,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDmlTriggerQuerier), }; - } + get + { + return new [] { typeof(SqlDmlTriggerQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1616,34 +1618,34 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "Indexes" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IndexKeyType", - Type = typeof(Enum), - TypeToReverse = typeof(SqlIndexQuerier), - ValidFor = ValidForFlag.AllOnPrem|ValidForFlag.AzureV12, - Values = new List - { - { IndexKeyType.None }, - { IndexKeyType.DriPrimaryKey }, - { IndexKeyType.DriUniqueKey } - } + Property = "IndexKeyType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlIndexQuerier), + ValidFor = ValidForFlag.AllOnPrem|ValidForFlag.AzureV12, + Values = new List + { + { IndexKeyType.None }, + { IndexKeyType.DriPrimaryKey }, + { IndexKeyType.DriUniqueKey } + } }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlIndexQuerier), typeof(SqlFullTextIndexQuerier), }; - } + get + { + return new [] { typeof(SqlIndexQuerier), typeof(SqlFullTextIndexQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1664,10 +1666,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlStatisticQuerier), }; - } + get + { + return new [] { typeof(SqlStatisticQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1686,27 +1688,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemViews" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlViewQuerier), }; - } + get + { + return new [] { typeof(SqlViewQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1760,9 +1762,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1852,9 +1855,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1873,10 +1877,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseDdlTriggerQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseDdlTriggerQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1897,10 +1901,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlAssemblyQuerier), }; - } + get + { + return new [] { typeof(SqlAssemblyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -1979,10 +1983,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSequenceQuerier), }; - } + get + { + return new [] { typeof(SqlSequenceQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2087,10 +2091,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedDataTypeQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedDataTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2111,10 +2115,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedTableTypeQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedTableTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2133,10 +2137,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedTypeQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2157,10 +2161,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlXmlSchemaCollectionQuerier), }; - } + get + { + return new [] { typeof(SqlXmlSchemaCollectionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2206,9 +2210,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2229,10 +2234,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlColumnQuerier), }; - } + get + { + return new [] { typeof(SqlColumnQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2252,33 +2257,33 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "UserDefinedTableTypeKeys" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IndexKeyType", - Type = typeof(Enum), - TypeToReverse = typeof(SqlIndexQuerier), - ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, - Values = new List - { - { IndexKeyType.DriPrimaryKey }, - { IndexKeyType.DriUniqueKey } - } + Property = "IndexKeyType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlIndexQuerier), + ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, + Values = new List + { + { IndexKeyType.DriPrimaryKey }, + { IndexKeyType.DriUniqueKey } + } }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlIndexQuerier), }; - } + get + { + return new [] { typeof(SqlIndexQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2299,10 +2304,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDefaultConstraintQuerier), typeof(SqlCheckQuerier), }; - } + get + { + return new [] { typeof(SqlDefaultConstraintQuerier), typeof(SqlCheckQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2323,10 +2328,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2347,10 +2352,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2371,10 +2376,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2395,10 +2400,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2419,10 +2424,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2443,10 +2448,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2467,10 +2472,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2491,10 +2496,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2515,10 +2520,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBuiltInTypeQuerier), }; - } + get + { + return new [] { typeof(SqlBuiltInTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2539,10 +2544,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlExternalDataSourceQuerier), }; - } + get + { + return new [] { typeof(SqlExternalDataSourceQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2563,10 +2568,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlExternalFileFormatQuerier), }; - } + get + { + return new [] { typeof(SqlExternalFileFormatQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2585,19 +2590,19 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "StoredProcedures" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); return filters; - } + } } protected override void OnExpandPopulateFolders(IList currentChildren, TreeNode parent) @@ -2614,10 +2619,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlProcedureQuerier), }; - } + get + { + return new [] { typeof(SqlProcedureQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2634,27 +2639,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemStoredProcedures" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlProcedureQuerier), }; - } + get + { + return new [] { typeof(SqlProcedureQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2684,9 +2689,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2707,10 +2713,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSubroutineParameterQuerier), }; - } + get + { + return new [] { typeof(SqlSubroutineParameterQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2730,37 +2736,37 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "TableValuedFunctions" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "FunctionType", - Type = typeof(Enum), - Values = new List - { - { UserDefinedFunctionType.Table }, - { UserDefinedFunctionType.Inline } - } + Property = "FunctionType", + Type = typeof(Enum), + Values = new List + { + { UserDefinedFunctionType.Table }, + { UserDefinedFunctionType.Inline } + } }); - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedFunctionQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedFunctionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2777,37 +2783,37 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemTableValuedFunctions" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "FunctionType", - Type = typeof(Enum), - Values = new List - { - { UserDefinedFunctionType.Table }, - { UserDefinedFunctionType.Inline } - } + Property = "FunctionType", + Type = typeof(Enum), + Values = new List + { + { UserDefinedFunctionType.Table }, + { UserDefinedFunctionType.Inline } + } }); - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedFunctionQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedFunctionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2837,9 +2843,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2860,10 +2867,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSubroutineParameterQuerier), }; - } + get + { + return new [] { typeof(SqlSubroutineParameterQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2883,37 +2890,37 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "ScalarValuedFunctions" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "FunctionType", - Type = typeof(Enum), - ValidFor = ValidForFlag.NotSqlDw, - Values = new List - { - { UserDefinedFunctionType.Scalar } - } + Property = "FunctionType", + Type = typeof(Enum), + ValidFor = ValidForFlag.NotSqlDw, + Values = new List + { + { UserDefinedFunctionType.Scalar } + } }); - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 0 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 0 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedFunctionQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedFunctionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2930,37 +2937,37 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel { public override IEnumerable ApplicableParents() { return new[] { "SystemScalarValuedFunctions" }; } - public override IEnumerable Filters + public override IEnumerable Filters { - get - { - var filters = new List(); - filters.Add(new NodeFilter + get + { + var filters = new List(); + filters.Add(new NodePropertyFilter { - Property = "FunctionType", - Type = typeof(Enum), - ValidFor = ValidForFlag.NotSqlDw, - Values = new List - { - { UserDefinedFunctionType.Scalar } - } + Property = "FunctionType", + Type = typeof(Enum), + ValidFor = ValidForFlag.NotSqlDw, + Values = new List + { + { UserDefinedFunctionType.Scalar } + } }); - filters.Add(new NodeFilter + filters.Add(new NodePropertyFilter { - Property = "IsSystemObject", - Type = typeof(bool), - Values = new List { 1 }, + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, }); return filters; - } + } } internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedFunctionQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedFunctionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -2990,9 +2997,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3013,10 +3021,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSubroutineParameterQuerier), }; - } + get + { + return new [] { typeof(SqlSubroutineParameterQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3038,10 +3046,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserDefinedAggregateQuerier), }; - } + get + { + return new [] { typeof(SqlUserDefinedAggregateQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3071,9 +3079,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new Type[0]; } + get + { + return new Type[0]; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3094,10 +3103,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSubroutineParameterQuerier), }; - } + get + { + return new [] { typeof(SqlSubroutineParameterQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3119,10 +3128,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlRemoteServiceBindingQuerier), }; - } + get + { + return new [] { typeof(SqlRemoteServiceBindingQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3143,10 +3152,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlBrokerPriorityQuerier), }; - } + get + { + return new [] { typeof(SqlBrokerPriorityQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3167,10 +3176,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlFileGroupQuerier), }; - } + get + { + return new [] { typeof(SqlFileGroupQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3189,10 +3198,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlFullTextCatalogQuerier), }; - } + get + { + return new [] { typeof(SqlFullTextCatalogQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3213,10 +3222,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlFullTextStopListQuerier), }; - } + get + { + return new [] { typeof(SqlFullTextStopListQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3237,10 +3246,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlFileQuerier), }; - } + get + { + return new [] { typeof(SqlFileQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3261,10 +3270,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlPartitionFunctionQuerier), }; - } + get + { + return new [] { typeof(SqlPartitionFunctionQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3285,10 +3294,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlPartitionSchemeQuerier), }; - } + get + { + return new [] { typeof(SqlPartitionSchemeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3309,10 +3318,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSearchPropertyListQuerier), }; - } + get + { + return new [] { typeof(SqlSearchPropertyListQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3359,10 +3368,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlFileQuerier), }; - } + get + { + return new [] { typeof(SqlFileQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3383,10 +3392,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlUserQuerier), }; - } + get + { + return new [] { typeof(SqlUserQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3441,10 +3450,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSchemaQuerier), }; - } + get + { + return new [] { typeof(SqlSchemaQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3465,10 +3474,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlAsymmetricKeyQuerier), }; - } + get + { + return new [] { typeof(SqlAsymmetricKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3489,10 +3498,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlCertificateQuerier), }; - } + get + { + return new [] { typeof(SqlCertificateQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3513,10 +3522,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSymmetricKeyQuerier), }; - } + get + { + return new [] { typeof(SqlSymmetricKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3537,10 +3546,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseEncryptionKeyQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseEncryptionKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3561,10 +3570,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlMasterKeyQuerier), }; - } + get + { + return new [] { typeof(SqlMasterKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3585,10 +3594,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseAuditSpecificationQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseAuditSpecificationQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3609,10 +3618,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlSecurityPolicyQuerier), }; - } + get + { + return new [] { typeof(SqlSecurityPolicyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3633,10 +3642,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlDatabaseCredentialQuerier), }; - } + get + { + return new [] { typeof(SqlDatabaseCredentialQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3692,10 +3701,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlRoleQuerier), }; - } + get + { + return new [] { typeof(SqlRoleQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3716,10 +3725,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlApplicationRoleQuerier), }; - } + get + { + return new [] { typeof(SqlApplicationRoleQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3740,10 +3749,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlColumnMasterKeyQuerier), }; - } + get + { + return new [] { typeof(SqlColumnMasterKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3764,10 +3773,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlColumnEncryptionKeyQuerier), }; - } + get + { + return new [] { typeof(SqlColumnEncryptionKeyQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3800,10 +3809,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlMessageTypeQuerier), }; - } + get + { + return new [] { typeof(SqlMessageTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3824,10 +3833,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlMessageTypeQuerier), }; - } + get + { + return new [] { typeof(SqlMessageTypeQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3860,10 +3869,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlContractQuerier), }; - } + get + { + return new [] { typeof(SqlContractQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3884,10 +3893,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlContractQuerier), }; - } + get + { + return new [] { typeof(SqlContractQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3920,10 +3929,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlQueueQuerier), }; - } + get + { + return new [] { typeof(SqlQueueQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3944,10 +3953,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlQueueQuerier), }; - } + get + { + return new [] { typeof(SqlQueueQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -3980,10 +3989,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServiceQuerier), }; - } + get + { + return new [] { typeof(SqlServiceQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) @@ -4004,10 +4013,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel internal override Type[] ChildQuerierTypes { - get - { - return new [] { typeof(SqlServiceQuerier), }; - } + get + { + return new [] { typeof(SqlServiceQuerier), }; + } } public override TreeNode CreateChild(TreeNode parent, object context) diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.tt b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.tt index 04dcd6bd..4f74078f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.tt +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTreeNodes.tt @@ -73,13 +73,13 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel var name = TreeNode.GetAttribute("Name"); WriteLine(string.Format(" internal sealed partial class {0} : SmoTreeNode", name)); WriteLine(" {"); - WriteLine(string.Format(" public {0}() : base()", name)); - WriteLine(" {"); - WriteLine(" NodeValue = string.Empty;"); - WriteLine(string.Format(" this.NodeType = \"{0}\";", name.Replace("TreeNode", string.Empty))); - WriteLine(string.Format(" this.NodeTypeId = NodeTypes.{0};", name.Replace("TreeNode", string.Empty))); - WriteLine(" OnInitialize();"); - WriteLine(" }"); + WriteLine(string.Format(" public {0}() : base()", name)); + WriteLine(" {"); + WriteLine(" NodeValue = string.Empty;"); + WriteLine(string.Format(" this.NodeType = \"{0}\";", name.Replace("TreeNode", string.Empty))); + WriteLine(string.Format(" this.NodeTypeId = NodeTypes.{0};", name.Replace("TreeNode", string.Empty))); + WriteLine(" OnInitialize();"); + WriteLine(" }"); WriteLine(" }"); WriteLine(""); } @@ -116,86 +116,101 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel WriteLine(string.Format(" public override IEnumerable ApplicableParents() {{ return new[] {{ \"{0}\" }}; }}", type)); List children = GetChildren(xmlFile, type); - List filters = GetNodeFilters(xmlFile, type); List smoProperties = GetNodeSmoProperties(xmlFile, type); - if (filters.Count > 0) + // Load and parse Filters node + // A node is comprised of and nodes + // - A node defines the properties to construct a NodePropertyFilter object + // - An node defines a list of nodes that are or'ed in the resulting URN Query + // can have an arbitrary number of top-level and nodes. + // All filters defined at the top-level are and'ed in the resulting URN Query. + // This is generated into the IEnumerable Filters object for a particular SMO object. + // Currently there is not support for nested nodes + XmlNode filtersNode = GetFiltersNode(xmlFile, type); + if (filtersNode != null) + { + // Get the children nodes for the Filters + XmlNodeList childNodes = filtersNode.ChildNodes; + if (childNodes.Count > 0) { + // Write initial declarator for the filters object WriteLine(""); - WriteLine(" public override IEnumerable Filters"); + WriteLine(" public override IEnumerable Filters"); WriteLine(" {"); - WriteLine(" get"); - WriteLine(" {"); + WriteLine(" get"); + WriteLine(" {"); + WriteLine(" var filters = new List();"); - WriteLine(" var filters = new List();"); - foreach (var filter in filters) + // Parse each of the nodes in + foreach (var orNode in filtersNode.SelectNodes("Or")) { - var propertyName = filter.GetAttribute("Property"); - var propertyType = filter.GetAttribute("Type"); - var propertyValue = filter.GetAttribute("Value"); - var validFor = filter.GetAttribute("ValidFor"); - var typeToReverse = filter.GetAttribute("TypeToReverse"); + XmlElement or = orNode as XmlElement; + if (or == null) + { + continue; + } - List filterValues = GetNodeFilterValues(xmlFile, type, propertyName); - - - WriteLine(" filters.Add(new NodeFilter"); + // Write initial declarator for the object, which is just a list of NodePropertyFilters + WriteLine(" filters.Add(new NodeOrFilter"); WriteLine(" {"); - WriteLine(string.Format(" Property = \"{0}\",", propertyName)); - WriteLine(string.Format(" Type = typeof({0}),", propertyType)); - if (!string.IsNullOrWhiteSpace(typeToReverse)) - { - WriteLine(string.Format(" TypeToReverse = typeof({0}Querier),", typeToReverse)); - } - if (!string.IsNullOrWhiteSpace(validFor)) - { - WriteLine(string.Format(" ValidFor = {0},", GetValidForFlags(validFor))); - } - if (propertyValue != null && (filterValues == null || filterValues.Count == 0)) - { - WriteLine(string.Format(" Values = new List {{ {0} }},", propertyValue)); - } - if (filterValues != null && filterValues.Count > 0) - { - string filterValueType = "object"; - if (propertyType == "Enum") - { + WriteLine(" FilterList = new List {"); - } - WriteLine(string.Format(" Values = new List")); - WriteLine(string.Format(" {{")); - for(int i = 0; i < filterValues.Count; i++) + foreach(var orFilterNode in or.GetElementsByTagName("Filter")) + { + XmlElement orFilter = orFilterNode as XmlElement; + if (orFilter == null) { - string separator = ""; - if (i != filterValues.Count - 1) - { - separator = ","; - } - var filterValue = filterValues[i]; - WriteLine(string.Format(" {{ {0} }}{1}", filterValue.InnerText, separator )); - + continue; } - WriteLine(string.Format(" }}")); + + // Declaration of Filter node + WriteLine(" new NodePropertyFilter"); + + // Parse the elements in the node into a string, and write + ParseAndWriteFilterNode(xmlFile, type, orFilter, true /*orFilter*/); + + // Close out filter object definition + WriteLine(" },"); } + + // Close out declaration of the NodeOrFilter + WriteLine(" }"); WriteLine(" });"); - - } + // Parse each of the top-level nodes in + foreach (var filterNode in filtersNode.SelectNodes("Filter")) + { + XmlElement filter = filterNode as XmlElement; + if (filter == null) + { + continue; + } + + // Start declaration of Filter node + WriteLine(" filters.Add(new NodePropertyFilter"); + + // Parse the elements in the node into a string, and write + ParseAndWriteFilterNode(xmlFile, type, filter); + + // Close out filter object definition + WriteLine(" });"); + } + + // Close out declaration of the Filters object WriteLine(" return filters;"); - WriteLine(" }"); + WriteLine(" }"); WriteLine(" }"); - } - + } if (smoProperties.Count > 0) { WriteLine(""); WriteLine(" public override IEnumerable SmoProperties"); WriteLine(" {"); - WriteLine(" get"); - WriteLine(" {"); + WriteLine(" get"); + WriteLine(" {"); WriteLine(" var properties = new List();"); foreach (var smoPropertiy in smoProperties) @@ -203,9 +218,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel var propertyName = smoPropertiy.GetAttribute("Name"); var validFor = smoPropertiy.GetAttribute("ValidFor"); - - - WriteLine(" properties.Add(new NodeSmoProperty"); WriteLine(" {"); WriteLine(string.Format(" Name = \"{0}\",", propertyName)); @@ -215,17 +227,13 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel WriteLine(string.Format(" ValidFor = {0}", GetValidForFlags(validFor))); } WriteLine(" });"); - - } WriteLine(" return properties;"); - WriteLine(" }"); + WriteLine(" }"); WriteLine(" }"); - } - if (children.Count > 0) { WriteLine(""); @@ -276,11 +284,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel WriteLine(""); WriteLine(" internal override Type[] ChildQuerierTypes"); WriteLine(" {"); - WriteLine(" get"); - WriteLine(" {"); + WriteLine(" get"); + WriteLine(" {"); if (!string.IsNullOrWhiteSpace(ChildQuerierTypes)) { - Write(" return new [] {"); + Write(" return new [] {"); foreach (var typeToRe in allTypes) { Write(string.Format(" typeof({0}Querier),", typeToRe)); @@ -289,9 +297,9 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel } else { - Write(" return new Type[0];"); + WriteLine(" return new Type[0];"); } - WriteLine(" }"); + WriteLine(" }"); WriteLine(" }"); WriteLine(""); @@ -464,14 +472,14 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel return retElements; } - public static List GetNodeFilters(string xmlFile, string parentName) + public static List GetNodeOrFilters(string xmlFile, string parentName) { XmlElement nodeElement = GetNodeElement(xmlFile, parentName); XmlDocument doc = new XmlDocument(); doc.Load(xmlFile); List retElements = new List(); - XmlNodeList nodeList = doc.SelectNodes(string.Format("/ServerExplorerTree/Node[@Name='{0}']/Filters/Filter", parentName)); + XmlNodeList nodeList = doc.SelectNodes(string.Format("/ServerExplorerTree/Node[@Name='{0}']/Filters/Or/Filter", parentName)); foreach (var item in nodeList) { XmlElement itemAsElement = item as XmlElement; @@ -483,6 +491,14 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel return retElements; } + public static XmlNode GetFiltersNode(string xmlFile, string parentName) + { + XmlElement nodeElement = GetNodeElement(xmlFile, parentName); + XmlDocument doc = new XmlDocument(); + doc.Load(xmlFile); + + return doc.SelectSingleNode(string.Format("/ServerExplorerTree/Node[@Name='{0}']/Filters", parentName)); + } public static List GetNodeSmoProperties(string xmlFile, string parentName) { @@ -503,14 +519,20 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel return retElements; } - public static List GetNodeFilterValues(string xmlFile, string parentName, string filterProperty) + public static List GetNodeFilterValues(string xmlFile, string parentName, string filterProperty, bool orFilter = false) { XmlElement nodeElement = GetNodeElement(xmlFile, parentName); XmlDocument doc = new XmlDocument(); doc.Load(xmlFile); List retElements = new List(); - XmlNodeList nodeList = doc.SelectNodes(string.Format("/ServerExplorerTree/Node[@Name='{0}']/Filters/Filter[@Property='{1}']/Value", parentName, filterProperty)); + + var xpath = string.Format( + "/ServerExplorerTree/Node[@Name='{0}']/Filters/{1}Filter[@Property='{2}']/Value", + parentName, + orFilter ? "Or/" : string.Empty, + filterProperty); + XmlNodeList nodeList = doc.SelectNodes(xpath); foreach (var item in nodeList) { XmlElement itemAsElement = item as XmlElement; @@ -521,4 +543,56 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel } return retElements; } + + /// + /// Helper function to parse out and write the contents of a node. + /// + /// Base xml doc + /// name of the parent object in the xml + /// The filter to be parsed + /// Whether this filter is a sub-node of an node + public void ParseAndWriteFilterNode(string xmlFile, string parentName, XmlElement filter, bool orFilter = false) + { + // Filters start at a larger base indentation than nodes directly under + var indent = orFilter ? " " : " "; + + var propertyName = filter.GetAttribute("Property"); + var propertyType = filter.GetAttribute("Type"); + var propertyValue = filter.GetAttribute("Value"); + var validFor = filter.GetAttribute("ValidFor"); + var typeToReverse = filter.GetAttribute("TypeToReverse"); + + List filterValues = GetNodeFilterValues(xmlFile, parentName, propertyName, orFilter); + + // Write out the "meat" of the object definition + WriteLine(indent + "{"); + WriteLine(indent + " Property = \"{0}\",", propertyName); + WriteLine(indent + " Type = typeof({0}),", propertyType); + if (!string.IsNullOrWhiteSpace(typeToReverse)) + { + WriteLine(indent + " TypeToReverse = typeof({0}Querier),", typeToReverse); + } + if (!string.IsNullOrWhiteSpace(validFor)) + { + WriteLine(indent + " ValidFor = {0},", GetValidForFlags(validFor)); + } + if (propertyValue != null && (filterValues == null || filterValues.Count == 0)) + { + WriteLine(indent + " Values = new List {{ {0} }},", propertyValue); + } + if (filterValues != null && filterValues.Count > 0) + { + WriteLine(indent + " Values = new List"); + WriteLine(indent + " {"); + + for(int i = 0; i < filterValues.Count; i++) + { + string separator = (i != filterValues.Count - 1) ? "," : ""; + var filterValue = filterValues[i]; + WriteLine(indent + " {{ {0} }}{1}", filterValue.InnerText, separator); + } + + WriteLine(indent + " }"); + } + } #> \ No newline at end of file diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeFilterTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeFilterTests.cs new file mode 100644 index 00000000..f8fcebef --- /dev/null +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/NodeFilterTests.cs @@ -0,0 +1,195 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using System.Collections.Generic; +using Microsoft.SqlServer.Management.Smo; +using Microsoft.SqlTools.ServiceLayer.ObjectExplorer; +using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes; +using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel; +using NUnit.Framework; + +namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer +{ + public class NodeFilterTests + { + + // Basic PropertyFilter definitions to use in tests + public NodePropertyFilter TemporalFilter = + new NodePropertyFilter + { + Property = "TemporalType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlHistoryTableQuerier), + ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12, + Values = new List + { + { TableTemporalType.HistoryTable } + } + }; + + public NodePropertyFilter LedgerHistoryFilter = + new NodePropertyFilter + { + Property = "LedgerType", + Type = typeof(Enum), + TypeToReverse = typeof(SqlHistoryTableQuerier), + ValidFor = ValidForFlag.Sql2022|ValidForFlag.AzureV12, + Values = new List + { + { LedgerTableType.HistoryTable } + } + }; + + public NodePropertyFilter SystemObjectFilter = + new NodePropertyFilter + { + Property = "IsSystemObject", + Type = typeof(bool), + Values = new List { 1 }, + }; + + /// + /// Validates the output of the ToPropertyFilterString for the NodeOrFilter class + /// + [Test] + public void NodeOrFilterReturnsProperString() + { + var orNode = new NodeOrFilter { + FilterList = new List { + TemporalFilter, + LedgerHistoryFilter + } + }; + + string allFiltersValid = orNode.ToPropertyFilterString(typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2022); + string expectedAllFilters = "((@TemporalType = 1) or (@LedgerType = 1))"; + Assert.That(allFiltersValid, Is.EqualTo(expectedAllFilters), "ToPropertyFilterString did not construct the URN filter string as expected for NodeOrFilter"); + + string sql2016ServerVersion = orNode.ToPropertyFilterString(typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2016); + string expectedSql2016Filters = "((@TemporalType = 1))"; + Assert.That(sql2016ServerVersion, Is.EqualTo(expectedSql2016Filters), "ToPropertyFilterString did not construct the URN filter string as expected when excluding filters that aren't valid for the given server type."); + + string invalidQuerierType = orNode.ToPropertyFilterString(typeof(SqlTableQuerier), ValidForFlag.Sql2022); + Assert.That(invalidQuerierType, Is.Empty, "ToPropertyFilterString should return empty string, because no given filters match the querier type provided."); + } + + /// + /// Validates the output of GetPropertyFilter with an NodeOrFilter + /// + [Test] + public void GetPropertyFilterWithNodeOrFilter() + { + var nodeList = new List { + new NodeOrFilter { + FilterList = new List { + TemporalFilter, + LedgerHistoryFilter + } + } + }; + + string allFiltersValid = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2022); + string expectedAllFilters = "[((@TemporalType = 1) or (@LedgerType = 1))]"; + Assert.That(allFiltersValid, Is.EqualTo(expectedAllFilters), "GetPropertyFilter did not construct the URN filter string as expected"); + } + + /// + /// Validates the output of GetPropertyFilter with a list of NodePropertyFilters + /// + [Test] + public void GetPropertyFilterWithNodePropertyFilters() + { + var nodeList = new List { + TemporalFilter, + LedgerHistoryFilter + }; + + string allFiltersValid = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2022); + string expectedAllFilters = "[(@TemporalType = 1) and (@LedgerType = 1)]"; + Assert.That(allFiltersValid, Is.EqualTo(expectedAllFilters), "GetPropertyFilter did not construct the URN filter string as expected"); + + string sql2016ServerVersion = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2016); + string expectedSql2016Filters = "[(@TemporalType = 1)]"; + Assert.That(sql2016ServerVersion, Is.EqualTo(expectedSql2016Filters), "GetPropertyFilter did not construct the URN filter string as expected when excluding filters that aren't valid for the given server type."); + + string invalidQuerierType = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlTableQuerier), ValidForFlag.Sql2022); + Assert.That(invalidQuerierType, Is.Empty, "GetPropertyFilter should return empty string, because no given filters match the querier type provided."); + } + + /// + /// Validates the output of GetPropertyFilter with a list of both NodePropertyFilters and NodeOrFilters + /// + [Test] + public void GetPropertyFilterWithNodePropertyAndNodeOrFilters() + { + var orNode = new NodeOrFilter { + FilterList = new List { + TemporalFilter, + LedgerHistoryFilter + } + }; + + var nodeList = new List { + orNode, + SystemObjectFilter + }; + + string allFiltersValid = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2022); + string expectedAllFilters = "[((@TemporalType = 1) or (@LedgerType = 1)) and (@IsSystemObject = 1)]"; + Assert.That(allFiltersValid, Is.EqualTo(expectedAllFilters), "GetPropertyFilter did not construct the URN filter string as expected"); + + string sql2016ServerVersion = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2016); + string expectedSql2016Filters = "[((@TemporalType = 1)) and (@IsSystemObject = 1)]"; + Assert.That(sql2016ServerVersion, Is.EqualTo(expectedSql2016Filters), "GetPropertyFilter did not construct the URN filter string as expected when excluding filters that aren't valid for the given server type."); + + string invalidQuerierType = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlTableQuerier), ValidForFlag.Sql2022); + string expectedTableQuerierFilters = "[(@IsSystemObject = 1)]"; + Assert.That(invalidQuerierType, Is.EqualTo(expectedTableQuerierFilters), "GetPropertyFilter did not construct the URN filter string as expected when excluding filters that don't match the querier type."); + } + + /// + /// Validates the output of GetPropertyFilter with a list of multiple NodeOrFilters with more than 2 filters, and + /// a lone NodePropertyFilter + /// + [Test] + public void GetPropertyFilterWithMixedFilters() + { + // All these filters together are nonsense, but it's just testing the logic for constructing the filter string + var orNode = new NodeOrFilter { + FilterList = new List { + TemporalFilter, + LedgerHistoryFilter + } + }; + + var orNode2 = new NodeOrFilter { + FilterList = new List { + SystemObjectFilter, + LedgerHistoryFilter, + TemporalFilter + } + }; + + var nodeList = new List { + orNode, + SystemObjectFilter, + orNode2 + }; + + string allFiltersValid = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2022); + string expectedAllFilters = "[((@TemporalType = 1) or (@LedgerType = 1)) and (@IsSystemObject = 1) and ((@IsSystemObject = 1) or (@LedgerType = 1) or (@TemporalType = 1))]"; + Assert.That(allFiltersValid, Is.EqualTo(expectedAllFilters), "GetPropertyFilter did not construct the URN filter string as expected"); + + string sql2016ServerVersion = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlHistoryTableQuerier), ValidForFlag.Sql2016); + string expectedSql2016Filters = "[((@TemporalType = 1)) and (@IsSystemObject = 1) and ((@IsSystemObject = 1) or (@TemporalType = 1))]"; + Assert.That(sql2016ServerVersion, Is.EqualTo(expectedSql2016Filters), "GetPropertyFilter did not construct the URN filter string as expected when excluding filters that aren't valid for the given server type."); + + string invalidQuerierType = INodeFilter.GetPropertyFilter(nodeList, typeof(SqlTableQuerier), ValidForFlag.Sql2022); + string expectedTableQuerierFilters = "[(@IsSystemObject = 1) and ((@IsSystemObject = 1))]"; + Assert.That(invalidQuerierType, Is.EqualTo(expectedTableQuerierFilters), "GetPropertyFilter did not construct the URN filter string as expected when excluding filters that don't match the querier type."); + } + } +} diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/SmoQueryModelTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/SmoQueryModelTests.cs index 4fb53fba..177b12cb 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/SmoQueryModelTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/ObjectExplorer/SmoQueryModelTests.cs @@ -9,6 +9,7 @@ using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.Extensibility; using Microsoft.SqlTools.ServiceLayer.ObjectExplorer; using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel; +using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes; using NUnit.Framework; namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer @@ -77,7 +78,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer var tableFactory = new TableValuedFunctionsChildFactory(); var filters = tableFactory.Filters; Assert.True(filters.ToList().Any(filter => { - return filter.Values.Contains(UserDefinedFunctionType.Table) && filter.Values.Contains(UserDefinedFunctionType.Inline); + var f = filter as NodePropertyFilter; + return f.Values.Contains(UserDefinedFunctionType.Table) && f.Values.Contains(UserDefinedFunctionType.Inline); })); }