Add getObjects from model request (#1634)

Co-authored-by: Alex Ma <alma1@microsoft.com>
This commit is contained in:
Barbara Valdez
2022-08-26 15:02:37 -07:00
committed by GitHub
parent 13a689b164
commit c33ffa592b
9 changed files with 288 additions and 1 deletions

View File

@@ -0,0 +1,33 @@
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
using Microsoft.SqlTools.Hosting.Protocol.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts
{
/// <summary>
/// Parameters to get objects from SQL model
/// </summary>
public class GetObjectsFromTSqlModelParams
{
/// <summary>
/// URI of the project file this model is for
/// </summary>
public string ProjectUri { get; set; }
/// <summary>
/// Object types to query
/// </summary>
public string[] ObjectTypes { get; set; }
}
/// <summary>
/// Defines the get objects sql model request
/// </summary>
class GetObjectsFromTSqlModelRequest
{
public static readonly RequestType<GetObjectsFromTSqlModelParams, TSqlObjectInfo[]> Type =
RequestType<GetObjectsFromTSqlModelParams, TSqlObjectInfo[]>.Create("dacFx/getObjectsFromTSqlModel");
}
}

View File

@@ -0,0 +1,36 @@
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts
{
/// <summary>
/// Describes TSqlObject information
/// </summary>
public class TSqlObjectInfo
{
public string Name { get; set; }
public string ObjectType { get; set; }
public TSqlObjectRelationship[] ReferencedObjects { get; set; }
}
/// <summary>
/// Describes objects referenced and their relationship type
/// </summary>
public class TSqlObjectRelationship
{
public string Name { get; set; }
public string ObjectType { get; set; }
public string RelationshipType { get; set; }
public string FromObjectName { get; set; }
public string FromObjectType { get; set; }
}
}

View File

@@ -57,6 +57,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
serviceHost.SetRequestHandler(GetDefaultPublishOptionsRequest.Type, this.HandleGetDefaultPublishOptionsRequest);
serviceHost.SetRequestHandler(ParseTSqlScriptRequest.Type, this.HandleParseTSqlScriptRequest);
serviceHost.SetRequestHandler(GenerateTSqlModelRequest.Type, this.HandleGenerateTSqlModelRequest);
serviceHost.SetRequestHandler(GetObjectsFromTSqlModelRequest.Type, this.HandleGetObjectsFromTSqlModelRequest);
}
/// <summary>
@@ -286,6 +287,28 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
}
}
/// <summary>
/// Handles request to get objects from sql model
/// </summary>
/// <returns></returns>
public async Task HandleGetObjectsFromTSqlModelRequest(GetObjectsFromTSqlModelParams requestParams, RequestContext<TSqlObjectInfo[]> requestContext)
{
TSqlObjectInfo[] objectInfos = { };
var model = projectModels.Value[requestParams.ProjectUri];
if (model == null)
{
await requestContext.SendError(new Exception(SR.SqlProjectModelNotFound(requestParams.ProjectUri)));
}
else
{
GetObjectsFromTSqlModelOperation operation = new GetObjectsFromTSqlModelOperation(requestParams, model);
objectInfos = operation.GetObjectsFromTSqlModel();
await requestContext.SendResult(objectInfos);
}
return;
}
private void ExecuteOperation(DacFxOperation operation, DacFxParams parameters, string taskName, RequestContext<DacFxResult> requestContext)
{
Task.Run(async () =>

View File

@@ -0,0 +1,77 @@
//
// 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.Linq;
using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
using Microsoft.SqlTools.Utility;
using Microsoft.SqlServer.Dac.Model;
namespace Microsoft.SqlTools.ServiceLayer.DacFx
{
/// <summary>
/// Class to represent request to get objects from model
/// </summary>
public class GetObjectsFromTSqlModelOperation
{
private TSqlModel Model;
public GetObjectsFromTSqlModelParams Parameters { get; }
public GetObjectsFromTSqlModelOperation(GetObjectsFromTSqlModelParams parameters, TSqlModel model)
{
Validate.IsNotNull("parameters", parameters);
Validate.IsNotNull("model", model);
this.Parameters = parameters;
this.Model = model;
}
/// <summary>
/// Get user defined top level type objects from model
/// </summary>
public TSqlObjectInfo[] GetObjectsFromTSqlModel()
{
try
{
var filters = Parameters.ObjectTypes.Select(t => MapType(t)).ToArray();
var objects = Model.GetObjects(DacQueryScopes.UserDefined, filters).ToList();
return objects.Select(o => new TSqlObjectInfo
{
Name = o.Name.ToString(),
ObjectType = o.ObjectType.Name,
ReferencedObjects = o.GetReferencedRelationshipInstances().ToList().Select(r => new TSqlObjectRelationship
{
Name = r.ObjectName.ToString(),
ObjectType = r.Object.ObjectType.Name,
RelationshipType = r.Relationship.Type.ToString(),
FromObjectName = r.FromObject.Name.ToString(),
FromObjectType = r.FromObject.ObjectType.Name
}).ToArray()
}).ToArray();
}
catch (Exception ex)
{
Logger.Error(new Exception(SR.GetUserDefinedObjectsFromModelFailed, ex));
throw;
}
}
/// <summary>
/// Class to represent the type of objects to query within the sql model
/// </summary>
public static ModelTypeClass MapType(string type)
{
switch (type.ToLower())
{
case "table":
return ModelSchema.Table;
case "view":
return ModelSchema.View;
default:
throw new ArgumentException(SR.UnsupportedModelType(type));
}
}
}
}