Skip to content

Commit

Permalink
Merge pull request #58 from NeilMacMullen/strcat
Browse files Browse the repository at this point in the history
Strcat
  • Loading branch information
NeilMacMullen authored Sep 4, 2024
2 parents e003477 + 83a8b1f commit 00ffc12
Show file tree
Hide file tree
Showing 8 changed files with 206 additions and 76 deletions.
26 changes: 13 additions & 13 deletions Directory.Packages.Props
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,28 @@
<ItemGroup>
<!-- use 'PackageVersion' rather than 'PackageReference' -->
<PackageVersion Include="Azure.Identity" Version="1.12.0" />
<PackageVersion Include="Azure.Monitor.Query" Version="1.4.0" />
<PackageVersion Include="Azure.Monitor.Query" Version="1.5.0" />
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="Fastenshtein" Version="1.0.10" />
<PackageVersion Include="JPoke" Version="1.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.7" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.7" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.8" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.8" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0" />
<PackageVersion Include="Microsoft.PowerShell.SDK" Version="7.4.3" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.2592.51" />
<PackageVersion Include="NLog" Version="5.3.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="MSTest.TestFramework" Version="3.4.3" />
<PackageVersion Include="MSTest.TestAdapter" Version="3.4.3" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.11.0" />
<PackageVersion Include="Microsoft.PowerShell.SDK" Version="7.4.5" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.2651.64" />
<PackageVersion Include="NLog" Version="5.3.3" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
<PackageVersion Include="MSTest.TestFramework" Version="3.5.2" />
<PackageVersion Include="MSTest.TestAdapter" Version="3.5.2" />
<PackageVersion Include="NotNullStrings" Version="1.0.1" />
<PackageVersion Include="Parquet.Net" Version="4.24.0" />
<PackageVersion Include="PowerShellStandard.Library" Version="5.1.1" />
<PackageVersion Include="Spectre.Console" Version="0.49.1" />
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="System.Management.Automation" Version="7.4.1" />
<PackageVersion Include="T-Digest.NET" Version="1.0.3" />
<PackageVersion Include="VegaGenerator" Version="1.0.1" />
<PackageVersion Include="VegaGenerator" Version="1.0.2" />
<PackageVersion Include="xunit" Version="2.9.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
Expand All @@ -36,7 +36,7 @@
<PackageVersion Include="CsvHelper" Version="33.0.1" />
<PackageVersion Include="geohash-dotnet" Version="2.1.0" />
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.7.2" />
</ItemGroup>
</Project>
7 changes: 5 additions & 2 deletions libraries/AppInsightsSupport/ApplicationInsightsLogLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,12 @@ private static VisualizationState StateFromBinaryData(BinaryData viz)
using var vizDoc = JsonDocument.Parse(viz);
var queryViz = vizDoc.RootElement.GetProperty("visualization");
var visState = queryViz.GetString().NullToEmpty();

var props = vizDoc.RootElement.EnumerateObject().ToImmutableDictionary(
el => el.Name,
el => el.Value.ToString().NullToEmpty()
);
//TODO - accept other properties
return new VisualizationState(visState, ImmutableDictionary<string, string>.Empty);
return new VisualizationState(visState, props);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using KustoLoco.Core.Evaluation.BuiltIns.Impl;
using Kusto.Language;
using Kusto.Language.Symbols;
using KustoLoco.Core.Evaluation.BuiltIns.Impl;

namespace KustoLoco.Core.Evaluation.BuiltIns;

Expand Down Expand Up @@ -69,10 +69,7 @@ static void AddCoalesce(List<ScalarOverloadInfo> overloads, Func<IScalarFunction
for (var numArgs = 2; numArgs <= 4; numArgs++)
{
var argTypes = new ScalarSymbol[numArgs];
for (var i = 0; i < numArgs; i++)
{
argTypes[i] = type;
}
for (var i = 0; i < numArgs; i++) argTypes[i] = type;

overloads.Add(new ScalarOverloadInfo(impl, type, argTypes));
}
Expand All @@ -83,26 +80,17 @@ static void AddCoalesce(List<ScalarOverloadInfo> overloads, Func<IScalarFunction
new ScalarFunctionInfo(new ScalarOverloadInfo(new NowFunctionImpl(), ScalarTypes.DateTime)));
AgoFunction.Register(functions);
FormatDateTime.Register(functions);
// TODO: Support N-ary functions properly
functions.Add(
Functions.Strcat,
new ScalarFunctionInfo(
new ScalarOverloadInfo(new StrcatFunctionImpl(), ScalarTypes.String,
ScalarTypes.String),
new ScalarOverloadInfo(new StrcatFunctionImpl(), ScalarTypes.String,
ScalarTypes.String,
ScalarTypes.String),
new ScalarOverloadInfo(new StrcatFunctionImpl(), ScalarTypes.String,
ScalarTypes.String,
ScalarTypes.String, ScalarTypes.String),
new ScalarOverloadInfo(new StrcatFunctionImpl(), ScalarTypes.String,
ScalarTypes.String,
ScalarTypes.String, ScalarTypes.String,
ScalarTypes.String),
new ScalarOverloadInfo(new StrcatFunctionImpl(), ScalarTypes.String,

//add multiple overloads for strcat
var overrides = Enumerable.Range(1, 20)
.Select(n =>
new ScalarOverloadInfo(new StrcatFunctionImpl(),
ScalarTypes.String,
ScalarTypes.String, ScalarTypes.String,
ScalarTypes.String, ScalarTypes.String)));
Enumerable.Range(0, n).Select(_ => (TypeSymbol)ScalarTypes.String).ToArray()))
.ToArray();
functions.Add(Functions.Strcat,
new ScalarFunctionInfo(overrides));


StrlenFunction.Register(functions);
ToLowerFunction.Register(functions);
Expand Down Expand Up @@ -260,12 +248,12 @@ static void AddCoalesce(List<ScalarOverloadInfo> overloads, Func<IScalarFunction

functions.Add(Functions.ArraySortAsc, new ScalarFunctionInfo(
new
ScalarOverloadInfo(new ArraySortFunctionImpl(ascending: true),
ScalarOverloadInfo(new ArraySortFunctionImpl(true),
ScalarTypes.Dynamic,
ScalarTypes.Dynamic)));
functions.Add(Functions.ArraySortDesc, new ScalarFunctionInfo(
new
ScalarOverloadInfo(new ArraySortFunctionImpl(ascending: false),
ScalarOverloadInfo(new ArraySortFunctionImpl(false),
ScalarTypes.Dynamic,
ScalarTypes.Dynamic)));

Expand Down Expand Up @@ -339,7 +327,8 @@ static void AddCoalesce(List<ScalarOverloadInfo> overloads, Func<IScalarFunction
ScalarTypes.String)));

ScalarOverloadInfo[] BuildOverloads(IScalarFunctionImpl func, TypeSymbol t)
=> Enumerable.Range(1, 10)
{
return Enumerable.Range(1, 10)
.Select(i =>
{
var pairs = Enumerable.Range(0, i)
Expand All @@ -352,6 +341,7 @@ ScalarOverloadInfo[] BuildOverloads(IScalarFunctionImpl func, TypeSymbol t)
return overload;
})
.ToArray();
}

functions.Add(
Functions.Case,
Expand Down
101 changes: 67 additions & 34 deletions libraries/Rendering/KustoResultRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Text;
using KustoLoco.Core;
using KustoLoco.Core.Settings;
using Microsoft.VisualBasic.CompilerServices;
using NotNullStrings;

namespace KustoLoco.Rendering;
Expand Down Expand Up @@ -52,35 +51,65 @@ public string RenderToHtml(KustoQueryResult result)
}


public void RenderToComposer(KustoQueryResult result, VegaComposer composer)
{
if (result.Error.IsNotBlank())
composer.AddRawHtml("<p>result.Error</p>");
else if (result.Visualization.ChartType.IsNotBlank())
KustoToVegaChartType(result, composer);
else
composer.AddRawHtml(RenderToTable(result));
}

public string KustoToVegaChartType(KustoQueryResult result)
{
var title = result.Visualization.PropertyOr("title", DateTime.Now.ToShortTimeString());
var theme = _settings.GetOr("vega.theme", "dark");
var composer = new VegaComposer("composed", theme);
KustoToVegaChartType(result, composer);
return composer.Render();
}

public void KustoToVegaChartType(KustoQueryResult result, VegaComposer composer)
{
var state = result.Visualization;
return state.ChartType switch
switch (state.ChartType)
{
KustoChartTypes.Column => RenderToChart(title, VegaMark.Bar, result, MakeColumnChart,
AllowedColumnTypes.ColumnChart),

KustoChartTypes.Bar => RenderToChart(title, VegaMark.Bar, result, MakeBarChart,
AllowedColumnTypes.BarChart),
KustoChartTypes.Line => RenderToChart(title, VegaMark.Line, result, MakeLineChart,
AllowedColumnTypes.LineChart),
KustoChartTypes.Pie => RenderToChart(title, VegaMark.Arc, result, NoOp,
AllowedColumnTypes.ColumnChart),
KustoChartTypes.Area => RenderToChart(title, VegaMark.Area, result, NoOp,
AllowedColumnTypes.LineChart),
KustoChartTypes.StackedArea => RenderToChart(title, VegaMark.Area, result, MakeStackedArea,
AllowedColumnTypes.LineChart),

KustoChartTypes.Ladder => RenderToChart(title, VegaMark.Bar, result, MakeTimeLineChart,
AllowedColumnTypes.LadderChart),
KustoChartTypes.Scatter => RenderToChart(title, VegaMark.Point, result, MakeScatterChart,
AllowedColumnTypes.Unrestricted),


_ => RenderToChart(title, InferChartTypeFromResult(result), result, NoOp,
AllowedColumnTypes.Unrestricted)
};
case KustoChartTypes.Column:
RenderToChart(VegaMark.Bar, result, MakeColumnChart, AllowedColumnTypes.ColumnChart,composer);
break;
case KustoChartTypes.Bar:
RenderToChart(VegaMark.Bar, result, MakeBarChart,
AllowedColumnTypes.BarChart, composer);
break;
case KustoChartTypes.Line:
RenderToChart(VegaMark.Line, result, MakeLineChart,
AllowedColumnTypes.LineChart, composer);
break;
case KustoChartTypes.Pie:
RenderToChart(VegaMark.Arc, result, NoOp,
AllowedColumnTypes.ColumnChart, composer);
break;
case KustoChartTypes.Area:
RenderToChart(VegaMark.Area, result, NoOp,
AllowedColumnTypes.LineChart, composer);
break;
case KustoChartTypes.StackedArea:
RenderToChart(VegaMark.Area, result, MakeStackedArea,
AllowedColumnTypes.LineChart, composer);
break;
case KustoChartTypes.Ladder:
RenderToChart(VegaMark.Bar, result, MakeTimeLineChart,
AllowedColumnTypes.LadderChart, composer);
break;
case KustoChartTypes.Scatter:
RenderToChart(VegaMark.Point, result, MakeScatterChart,
AllowedColumnTypes.Unrestricted, composer);
break;
default:
RenderToChart(InferChartTypeFromResult(result), result, NoOp,
AllowedColumnTypes.Unrestricted, composer);
break;
}
}

private void MakeLineChart(KustoQueryResult result, VegaChart chart)
Expand Down Expand Up @@ -115,15 +144,19 @@ public void NoOp(KustoQueryResult result, VegaChart o)
}


public string RenderToChart(string title, VegaMark vegaType, KustoQueryResult result,
Action<KustoQueryResult, VegaChart> jmutate, ImmutableArray<ExpectedColumnSet> expected)
public void RenderToChart(VegaMark vegaType, KustoQueryResult result,
Action<KustoQueryResult, VegaChart> jmutate, ImmutableArray<ExpectedColumnSet> expected,VegaComposer composer)
{
if (result.RowCount == 0)
return result.Error;
{
composer.AddRawHtml("<p>No results</p>");
return ;
}

var title = result.Visualization.PropertyOr("title", DateTime.Now.ToShortTimeString());
var b = RenderToJObjectBuilder(vegaType, result, jmutate, expected);
b.SetTitle(title);
var theme = _settings.GetOr("vega.theme", "dark");
return VegaMaker.MakeHtml(title, b.Serialize(),theme);
composer.AddChart(b);
}


Expand All @@ -146,13 +179,13 @@ public void RenderInBrowser(KustoQueryResult result)
Process.Start(new ProcessStartInfo { FileName = fileName, UseShellExecute = true });
}

public void MakeTimeLineChart(KustoQueryResult result, VegaChart chart)
public void MakeTimeLineChart(KustoQueryResult result, VegaChart chart)
{
chart.ConvertToTimeline();
}


public void MakeScatterChart(KustoQueryResult result, VegaChart chart)
public void MakeScatterChart(KustoQueryResult result, VegaChart chart)
{
foreach (var c in "size shape angle".Tokenize())
{
Expand All @@ -163,7 +196,7 @@ public void MakeScatterChart(KustoQueryResult result, VegaChart chart)
}


public VegaMark InferChartTypeFromResult(KustoQueryResult result)
public VegaMark InferChartTypeFromResult(KustoQueryResult result)
{
var headers = result.ColumnDefinitions();
var types = headers.Select(h => h.UnderlyingType).ToArray();
Expand Down
3 changes: 3 additions & 0 deletions libraries/lokql-engine/Commands/CommandProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public static CommandProcessor Default()
.WithAdditionalCommand<AppInsightsCommand.Options>(AppInsightsCommand.RunAsync)
.WithAdditionalCommand<DefineMacroCommand.Options>(DefineMacroCommand.RunAsync)
.WithAdditionalCommand<RunMacroCommand.Options>(RunMacroCommand.RunAsync)
.WithAdditionalCommand<StartReportCommand.Options>(StartReportCommand.Run)
.WithAdditionalCommand<RenderToReportCommand.Options>(RenderToReportCommand.Run)
.WithAdditionalCommand<EndReportCommand.Options>(EndReportCommand.Run)
;
}

Expand Down
69 changes: 69 additions & 0 deletions libraries/lokql-engine/Commands/RenderCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,72 @@ internal class Options
public bool SaveOnly { get; set; }
}
}

public static class RenderToReportCommand
{
internal static Task Run(CommandProcessorContext econtext, Options o)
{
var exp = econtext.Explorer;

var result = exp._prevResult;
var renderer = new KustoResultRenderer(exp.Settings);
renderer.RenderToComposer(result, exp.ActiveReport.Composer);
return Task.CompletedTask;
}

[Verb("renderToReport", HelpText = "render last results as html and save in active report")]
internal class Options
{
}
}

public static class StartReportCommand
{
internal static Task Run(CommandProcessorContext econtext, Options o)
{
var exp = econtext.Explorer;
var title =o.Title.OrWhenBlank("Report");
exp.StartNewReport(title);
if (o.PaneHeight.IsNotBlank())
{
var style = new VegaDivStyle("squashed", $"width: 99vw; height: {o.PaneHeight};");
exp.ActiveReport.Composer.AddStyle(style);;
}

return Task.CompletedTask;
}

[Verb("startreport", HelpText = "start a report")]
internal class Options
{
[Value(0, HelpText = "Title")] public string Title { get; set; } = string.Empty;
[Option("paneHeight", HelpText = "paneHeight for default style")]
public string PaneHeight { get; set; } = string.Empty;
}
}

public static class EndReportCommand
{
internal static Task Run(CommandProcessorContext econtext, Options o)
{
var fileName = Path.ChangeExtension(o.File.OrWhenBlank(Path.GetTempFileName()), "html");
var exp = econtext.Explorer;
var report = exp.ActiveReport;
var text = report.Render();
File.WriteAllText(fileName, text);
exp.Info($"Saved chart as {fileName}");
if (!o.SaveOnly)
Process.Start(new ProcessStartInfo { FileName = fileName, UseShellExecute = true });
return Task.CompletedTask;
}

[Verb("endreport", HelpText = "end a report")]
internal class Options
{
[Value(0, HelpText = "Name of file to save report to ")]
public string File { get; set; } = string.Empty;

[Option("saveOnly", HelpText = "just save the file without opening in the browser")]
public bool SaveOnly { get; set; }
}
}
Loading

0 comments on commit 00ffc12

Please sign in to comment.