From 26cc913c61efd2faadd4d029c2955fb9d6450b7e Mon Sep 17 00:00:00 2001 From: Justin M <63619224+JustinMDotNet@users.noreply.github.com> Date: Wed, 26 Aug 2020 14:45:21 -0700 Subject: [PATCH] 3491 Kusto Execute Function support (#1055) * 3491 Added GenerateExecuteFunctionScript to IDataSource, DataSourceBase, and KustoDataSource. Added ExecutionFunction to Scripter and IScripter. * 3491 Refactored GenerateScriptForFunction in ScriptAsScriptingOperation to handle execute and alter --- .../DataSource/DataSourceBase.cs | 2 ++ .../DataSource/IDataSource.cs | 9 ++++++- .../DataSource/KustoDataSource.cs | 9 +++++++ .../Scripting/IScripter.cs | 1 + .../Scripting/ScriptAsScriptingOperation.cs | 24 +++++++++++++------ .../Scripting/Scripter.cs | 6 +++++ 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Kusto.ServiceLayer/DataSource/DataSourceBase.cs b/src/Microsoft.Kusto.ServiceLayer/DataSource/DataSourceBase.cs index 1cd32697..5f11d3a4 100644 --- a/src/Microsoft.Kusto.ServiceLayer/DataSource/DataSourceBase.cs +++ b/src/Microsoft.Kusto.ServiceLayer/DataSource/DataSourceBase.cs @@ -105,6 +105,8 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource public abstract string GenerateAlterFunctionScript(string functionName); + public abstract string GenerateExecuteFunctionScript(string functionName); + /// public DataSourceType DataSourceType { get; protected set; } diff --git a/src/Microsoft.Kusto.ServiceLayer/DataSource/IDataSource.cs b/src/Microsoft.Kusto.ServiceLayer/DataSource/IDataSource.cs index 03eeab25..0accf989 100644 --- a/src/Microsoft.Kusto.ServiceLayer/DataSource/IDataSource.cs +++ b/src/Microsoft.Kusto.ServiceLayer/DataSource/IDataSource.cs @@ -123,10 +123,17 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource bool Exists(DataSourceObjectMetadata objectMetadata); /// - /// Gets FunctionInfo object for a function + /// Generates an alter script for a function /// /// /// string GenerateAlterFunctionScript(string functionName); + + /// + /// Generates an execute script for a function + /// + /// + /// + string GenerateExecuteFunctionScript(string functionName); } } \ No newline at end of file diff --git a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs index 68b41293..7c655ac5 100644 --- a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs +++ b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs @@ -1047,6 +1047,15 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource return alterCommand.ToString(); } + public override string GenerateExecuteFunctionScript(string functionName) + { + var functionInfo = GetFunctionInfo(functionName); + + return functionInfo == null + ? string.Empty + : $"{functionInfo.Name}{functionInfo.Parameters}"; + } + private string GenerateMetadataKey(string databaseName, string objectName) { return string.IsNullOrWhiteSpace(objectName) ? databaseName : $"{databaseName}.{objectName}"; diff --git a/src/Microsoft.Kusto.ServiceLayer/Scripting/IScripter.cs b/src/Microsoft.Kusto.ServiceLayer/Scripting/IScripter.cs index eec9584e..04f339a2 100644 --- a/src/Microsoft.Kusto.ServiceLayer/Scripting/IScripter.cs +++ b/src/Microsoft.Kusto.ServiceLayer/Scripting/IScripter.cs @@ -8,5 +8,6 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting { string SelectFromTableOrView(IDataSource dataSource, Urn urn); string AlterFunction(IDataSource dataSource, ScriptingObject scriptingObject); + string ExecuteFunction(IDataSource dataSource, ScriptingObject scriptingObject); } } \ No newline at end of file diff --git a/src/Microsoft.Kusto.ServiceLayer/Scripting/ScriptAsScriptingOperation.cs b/src/Microsoft.Kusto.ServiceLayer/Scripting/ScriptAsScriptingOperation.cs index ea29f267..ce67a623 100644 --- a/src/Microsoft.Kusto.ServiceLayer/Scripting/ScriptAsScriptingOperation.cs +++ b/src/Microsoft.Kusto.ServiceLayer/Scripting/ScriptAsScriptingOperation.cs @@ -71,7 +71,7 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting // TODO: Not including the header by default. We have to get this option from client options.IncludeHeaders = false; - // Scripting data is not avaialable in the scripter + // Scripting data is not available in the scripter options.ScriptData = false; SetScriptingOptions(options); @@ -82,7 +82,8 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting break; case ScriptingOperationType.Alter: - resultScript = GenerateScriptAlter(DataSource, urns); + case ScriptingOperationType.Execute: + resultScript = GenerateScriptForFunction(DataSource); break; } @@ -153,16 +154,25 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting return string.Empty; } - private string GenerateScriptAlter(IDataSource dataSource, UrnCollection urns) + private string GenerateScriptForFunction(IDataSource dataSource) { ScriptingObject scriptingObject = this.Parameters.ScriptingObjects[0]; - Urn objectUrn = urns[0]; - if (string.Equals(scriptingObject.Type, "Function", StringComparison.CurrentCultureIgnoreCase)) + if (!string.Equals(scriptingObject.Type, "Function", StringComparison.CurrentCultureIgnoreCase)) { - return _scripter.AlterFunction(dataSource, scriptingObject); + return string.Empty; } - + + if (Parameters.Operation == ScriptingOperationType.Alter) + { + return _scripter.AlterFunction(dataSource, scriptingObject); + } + + if (Parameters.Operation == ScriptingOperationType.Execute) + { + return _scripter.ExecuteFunction(dataSource, scriptingObject); + } + return string.Empty; } diff --git a/src/Microsoft.Kusto.ServiceLayer/Scripting/Scripter.cs b/src/Microsoft.Kusto.ServiceLayer/Scripting/Scripter.cs index 827e78fa..54922722 100644 --- a/src/Microsoft.Kusto.ServiceLayer/Scripting/Scripter.cs +++ b/src/Microsoft.Kusto.ServiceLayer/Scripting/Scripter.cs @@ -32,5 +32,11 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting var functionName = scriptingObject.Name.Substring(0, scriptingObject.Name.IndexOf('(')); return dataSource.GenerateAlterFunctionScript(functionName); } + + public string ExecuteFunction(IDataSource dataSource, ScriptingObject scriptingObject) + { + var functionName = scriptingObject.Name.Substring(0, scriptingObject.Name.IndexOf('(')); + return dataSource.GenerateExecuteFunctionScript(functionName); + } } } \ No newline at end of file