Skip to content

Commit

Permalink
removing a few variants on invokekustoquery. broken shit.
Browse files Browse the repository at this point in the history
  • Loading branch information
santisq committed Dec 17, 2024
1 parent 8cccbe7 commit 1e322c6
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 58 deletions.
61 changes: 61 additions & 0 deletions src/PowerShellKusto/Extensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System.Collections.Generic;
using System.Management.Automation;
using Newtonsoft.Json.Linq;

namespace PowerShellKusto;

internal static class Extensions
{
internal static PSObject ToPSObject(this JObject entries)
{
PSObject result = new(entries.Count);
foreach (KeyValuePair<string, JToken?> entry in entries)
{
switch (entry.Value)
{
case JArray jArray:
object?[] collection = PopulateFromJArray(jArray);
result.Properties.Add(new PSNoteProperty(entry.Key, collection));
break;

case JObject jObject:
PSObject psobject = ToPSObject(jObject);
result.Properties.Add(new PSNoteProperty(entry.Key, psobject));
break;

case JValue jValue:
result.Properties.Add(new PSNoteProperty(entry.Key, jValue.Value));
break;
}
}

return result;
}

private static object?[] PopulateFromJArray(JArray jArray)
{
object?[] result = new object[jArray.Count];
for (int index = 0; index < jArray.Count; index++)
{
JToken? element = jArray[index];
switch (element)
{
case JArray subJArray:
object?[] subCollection = PopulateFromJArray(subJArray);
result[index] = subCollection;
break;

case JObject jObject:
PSObject psobject = ToPSObject(jObject);
result[index] = psobject;
break;

case JValue jValue:
result[index] = jValue.Value;
break;
}
}

return result;
}
}
67 changes: 9 additions & 58 deletions src/PowerShellKusto/InvokeKustoQueryCommand.cs
Original file line number Diff line number Diff line change
@@ -1,41 +1,25 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Management.Automation;
using System.Reflection;
using Kusto.Cloud.Platform.Data;
using Kusto.Data.Common;
using Kusto.Data.Net.Client;
using Newtonsoft.Json.Linq;

namespace PowerShellKusto;

[Cmdlet(VerbsLifecycle.Invoke, "KustoQuery", DefaultParameterSetName = ToJsonSet)]
[OutputType(typeof(string), ParameterSetName = [ToJsonSet])]
[OutputType(typeof(PSObject), ParameterSetName = [ToEnumerableSet])]
[Cmdlet(VerbsLifecycle.Invoke, "KustoQuery")]
[OutputType(typeof(string), ParameterSetName = [AsJsonSet])]
[OutputType(typeof(PSObject))]
public sealed class InvokeKustoQueryCommand : PSCmdlet
{
private const string ToEnumerableSet = "ToEnumerable";

private const string ToJsonSet = "ToJson";

[ThreadStatic]
private static MethodInfo? s_methodInfo;
private const string AsJsonSet = "AsJson";

[Parameter(Mandatory = true, Position = 0)]
public string Query { get; set; } = null!;

[Parameter(ParameterSetName = ToEnumerableSet)]
public SwitchParameter ToEnumerableArray { get; set; }

[Parameter(ParameterSetName = ToEnumerableSet)]
[ValidateNotNull]
public Type? OutputType { get; set; }

[Parameter(ParameterSetName = ToJsonSet)]
public SwitchParameter ToJson { get; set; }
[Parameter(ParameterSetName = AsJsonSet)]
public SwitchParameter AsJson { get; set; }

protected override void EndProcessing()
{
Expand All @@ -46,54 +30,21 @@ protected override void EndProcessing()
using ICslQueryProvider provider = KustoClientFactory.CreateCslQueryProvider(connection.Builder);
using IDataReader reader = provider.ExecuteQuery(Query, connection.Properties);

if (ToJson.IsPresent)
if (AsJson.IsPresent)
{
WriteObject(reader.ToJsonString());
return;
}

if (!ToEnumerableArray.IsPresent)
{
IEnumerable<JObject> jObjects = reader.ToJObjects();
}

if (OutputType is null)
{
WriteObject(
reader.ToEnumerableObjectArray(true),
enumerateCollection: true);

return;
}

foreach (object item in ToEnumerable(OutputType, reader))
foreach (JObject jObject in reader.ToJObjects())
{
WriteObject(item);
WriteObject(jObject.ToPSObject());
}

}
catch (Exception exception)
{
ErrorRecord error = new(exception, "QueryError", ErrorCategory.ReadError, null);
WriteError(error);
}
}

private static IEnumerable ToEnumerable(
Type outputType,
IDataReader reader)
{
s_methodInfo ??= typeof(ExtendedDataReader).GetMethod(
name: "ConvertTo",
genericParameterCount: 1,
types: [typeof(IDataReader)]);

object? enumerable = s_methodInfo!
.MakeGenericMethod(outputType)
.Invoke(null, [reader]);

return enumerable is null
? Enumerable.Empty<object>()
: (IEnumerable)enumerable;
}
}

0 comments on commit 1e322c6

Please sign in to comment.