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