From 9fbcadb46eb21bb78e03cb4e1c6d99e8150a6051 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Wed, 29 Jul 2020 16:31:51 -0700 Subject: [PATCH] Add service for converting a notebook to sql and back (#1022) --- .../HostLoader.cs | 3 + .../Contracts/NotebookConvertContracts.cs | 62 +++++++++ .../NotebookConvert/NotebookConvertService.cs | 126 ++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/Contracts/NotebookConvertContracts.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs diff --git a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs index de0da135..ba3b5e7f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs @@ -134,6 +134,9 @@ namespace Microsoft.SqlTools.ServiceLayer SqlAssessmentService.Instance.InitializeService(serviceHost); serviceProvider.RegisterSingleService(SqlAssessmentService.Instance); + NotebookConvertService.Instance.InitializeService(serviceHost); + serviceProvider.RegisterSingleService(NotebookConvertService.Instance); + InitializeHostedServices(serviceProvider, serviceHost); serviceHost.ServiceProvider = serviceProvider; diff --git a/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/Contracts/NotebookConvertContracts.cs b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/Contracts/NotebookConvertContracts.cs new file mode 100644 index 00000000..71f85dd2 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/Contracts/NotebookConvertContracts.cs @@ -0,0 +1,62 @@ +// +// 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; +using Microsoft.SqlTools.ServiceLayer.Utility; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.NotebookConvert.Contracts +{ + public class ConvertNotebookToSqlParams : GeneralRequestDetails + { + /// + /// The raw Notebook JSON content to convert + /// + public string NotebookJson { get; set; } + + } + + public class ConvertNotebookToSqlResult : ResultStatus + { + /// + /// The raw SQL query content to display + /// + public string content; + } + + public class ConvertNotebookToSqlRequest + { + public static readonly + RequestType Type = + RequestType.Create("notebookconvert/convertnotebooktosql"); + } + + public class ConvertSqlToNotebookParams : GeneralRequestDetails + { + /// + /// The ClientUri of the SQL Query file we're converting + /// + public string ClientUri { get; set; } + + } + + /// + /// + /// + public class ConvertSqlToNotebookResult : ResultStatus + { + /// + /// The raw Notebook JSON content to display + /// + public string content; + } + + public class ConvertSqlToNotebookRequest + { + public static readonly + RequestType Type = + RequestType.Create("notebookconvert/convertsqltonotebook"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs new file mode 100644 index 00000000..34ad2328 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs @@ -0,0 +1,126 @@ +// +// 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.Threading.Tasks; +using Microsoft.SqlTools.Hosting.Protocol; +using Microsoft.SqlTools.ServiceLayer.Hosting; +using Microsoft.SqlTools.ServiceLayer.NotebookConvert.Contracts; +using Microsoft.SqlTools.ServiceLayer.SqlContext; +using Microsoft.SqlTools.ServiceLayer.Workspace; + +namespace Microsoft.SqlTools.ServiceLayer.Agent +{ + /// + /// Main class for Notebook Convert Service + /// + public class NotebookConvertService + { + private static readonly Lazy instance = new Lazy(() => new NotebookConvertService()); + + public NotebookConvertService() + { + } + + public static NotebookConvertService Instance + { + get { return instance.Value; } + } + + /// + /// Service host object for sending/receiving requests/events. + /// + internal IProtocolEndpoint ServiceHost + { + get; + set; + } + + /// + /// Initializes the service by doing tasks such as setting up request handlers. + /// + /// + public void InitializeService(ServiceHost serviceHost) + { + this.ServiceHost = serviceHost; + + this.ServiceHost.SetRequestHandler(ConvertNotebookToSqlRequest.Type, HandleConvertNotebookToSqlRequest); + this.ServiceHost.SetRequestHandler(ConvertSqlToNotebookRequest.Type, HandleConvertSqlToNotebookRequest); + + + } + + #region Convert Handlers + + internal async Task HandleConvertNotebookToSqlRequest(ConvertNotebookToSqlParams parameters, RequestContext requestContext) + { + await Task.Run(async () => + { + try + { + var result = new ConvertNotebookToSqlResult(); + result.content = parameters.NotebookJson; + await requestContext.SendResult(result); + } + catch (Exception e) + { + await requestContext.SendError(e); + } + }); + } + + internal async Task HandleConvertSqlToNotebookRequest(ConvertSqlToNotebookParams parameters, RequestContext requestContext) + { + await Task.Run(async () => + { + + try + { + var file = WorkspaceService.Instance.Workspace.GetFile(parameters.ClientUri); + // Temporary notebook that we just fill in with the sql until the parsing logic is added + var result = new ConvertSqlToNotebookResult + { + content = $@"{{ + ""metadata"": {{ + ""kernelspec"": {{ + ""name"": ""SQL"", + ""display_name"": ""SQL"", + ""language"": ""sql"" + }}, + ""language_info"": {{ + ""name"": ""sql"", + ""version"": """" + }} + }}, + ""nbformat_minor"": 2, + ""nbformat"": 4, + ""cells"": [ + {{ + ""cell_type"": ""code"", + ""source"": [ + ""{file.Contents}"" + ], + ""metadata"": {{ + ""azdata_cell_guid"": ""477da394-51fd-45ab-8a37-387b47b2b692"" + }}, + ""outputs"": [], + ""execution_count"": null + }} + ] +}}" + }; + await requestContext.SendResult(result); + } + catch (Exception e) + { + await requestContext.SendError(e); + } + }); + } + + #endregion // Convert Handlers + + } +}