Добавьте файлы проекта.
This commit is contained in:
184
SQLVision.Visualizers/Visualizers/ChartVisualizer.cs
Normal file
184
SQLVision.Visualizers/Visualizers/ChartVisualizer.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
using SQLVision.Core.Enums;
|
||||
using SQLVision.Core.Models;
|
||||
using SQLVision.Visualizers.Interfaces;
|
||||
using System.Data;
|
||||
|
||||
namespace SQLVision.Visualizers.Visualizers;
|
||||
|
||||
public class ChartVisualizer : IVisualizer
|
||||
{
|
||||
public FrameworkElement Visualize(DataTable data, OutputDefinition definition)
|
||||
{
|
||||
if (data.Rows.Count == 0)
|
||||
{
|
||||
return CreateEmptyChartMessage("Нет данных для построения графика");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var chartType = definition.ChartType;
|
||||
var cartesianChart = new CartesianChart
|
||||
{
|
||||
Series = CreateSeries(data, definition),
|
||||
XAxes = CreateXAxes(data, definition),
|
||||
YAxes = CreateYAxes(definition),
|
||||
LegendPosition = LegendPosition.Right,
|
||||
TooltipPosition = LiveChartsCore.Measure.TooltipPosition.Hidden
|
||||
};
|
||||
|
||||
return cartesianChart;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return CreateEmptyChartMessage("Ошибка при построении графика");
|
||||
}
|
||||
}
|
||||
|
||||
private ISeries[] CreateSeries(DataTable data, OutputDefinition definition)
|
||||
{
|
||||
var series = new List<ISeries>();
|
||||
|
||||
if (!string.IsNullOrEmpty(definition.SeriesColumn))
|
||||
{
|
||||
// Разделение по сериям
|
||||
var seriesGroups = data.AsEnumerable()
|
||||
.GroupBy(row => row[definition.SeriesColumn])
|
||||
.ToList();
|
||||
|
||||
foreach (var group in seriesGroups)
|
||||
{
|
||||
var seriesName = group.Key.ToString();
|
||||
var values = group.Select(row =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(definition.YAxisColumn))
|
||||
return Convert.ToDouble(row[1]);
|
||||
return Convert.ToDouble(row[definition.YAxisColumn]);
|
||||
}).ToArray();
|
||||
|
||||
series.Add(CreateSeriesByType(definition.ChartType, values, seriesName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Одна серия
|
||||
var values = data.AsEnumerable()
|
||||
.Select(row =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(definition.YAxisColumn))
|
||||
return Convert.ToDouble(row[1]);
|
||||
return Convert.ToDouble(row[definition.YAxisColumn]);
|
||||
}).ToArray();
|
||||
|
||||
series.Add(CreateSeriesByType(definition.ChartType, values, definition.Description));
|
||||
}
|
||||
|
||||
return series.ToArray();
|
||||
}
|
||||
|
||||
private ISeries CreateSeriesByType(ChartType chartType, double[] values, string name)
|
||||
{
|
||||
return chartType switch
|
||||
{
|
||||
ChartType.Line => new LineSeries<double>
|
||||
{
|
||||
Values = values,
|
||||
Name = name,
|
||||
Fill = null,
|
||||
GeometrySize = 8,
|
||||
LineSmoothness = 0
|
||||
},
|
||||
ChartType.Bar => new ColumnSeries<double>
|
||||
{
|
||||
Values = values,
|
||||
Name = name
|
||||
},
|
||||
ChartType.Area => new LineSeries<double>
|
||||
{
|
||||
Values = values,
|
||||
Name = name,
|
||||
Fill = new SolidColorPaint(SKColors.Blue.WithAlpha(50))
|
||||
},
|
||||
ChartType.Scatter => new ScatterSeries<ObservablePoint>
|
||||
{
|
||||
Values = values.Select((v, i) => new ObservablePoint(i, v)),
|
||||
Name = name,
|
||||
GeometrySize = 10
|
||||
},
|
||||
_ => new LineSeries<double>
|
||||
{
|
||||
Values = values,
|
||||
Name = name
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Axis[] CreateXAxes(DataTable data, OutputDefinition definition)
|
||||
{
|
||||
var labels = new List<string>();
|
||||
|
||||
if (!string.IsNullOrEmpty(definition.XAxisColumn))
|
||||
{
|
||||
labels = data.AsEnumerable()
|
||||
.Select(row => row[definition.XAxisColumn].ToString())
|
||||
.ToList();
|
||||
}
|
||||
else if (data.Columns.Count > 0)
|
||||
{
|
||||
// Берем первый столбец для оси X
|
||||
labels = data.AsEnumerable()
|
||||
.Select(row => row[0].ToString())
|
||||
.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
labels = Enumerable.Range(0, data.Rows.Count)
|
||||
.Select(i => i.ToString())
|
||||
.ToList();
|
||||
}
|
||||
|
||||
return new[]
|
||||
{
|
||||
new Axis
|
||||
{
|
||||
Labels = labels.ToArray(),
|
||||
LabelsRotation = labels.Count > 10 ? 45 : 0,
|
||||
TextSize = 12
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Axis[] CreateYAxes(OutputDefinition definition)
|
||||
{
|
||||
return new[]
|
||||
{
|
||||
new Axis
|
||||
{
|
||||
Name = string.IsNullOrEmpty(definition.YAxisColumn) ? "Значения" : definition.YAxisColumn,
|
||||
TextSize = 12
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private FrameworkElement CreateEmptyChartMessage(string message)
|
||||
{
|
||||
var textBlock = new TextBlock
|
||||
{
|
||||
Text = message,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
FontSize = 16,
|
||||
Foreground = new Microsoft.UI.Xaml.Media.SolidColorBrush(Microsoft.UI.Colors.Gray)
|
||||
};
|
||||
|
||||
var border = new Border
|
||||
{
|
||||
Child = textBlock,
|
||||
Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(Microsoft.UI.Colors.Transparent),
|
||||
Padding = new Thickness(20)
|
||||
};
|
||||
|
||||
return border;
|
||||
}
|
||||
|
||||
public bool CanVisualize(OutputType type) => type == OutputType.Chart;
|
||||
}
|
||||
75
SQLVision.Visualizers/Visualizers/TableVisualizer.cs
Normal file
75
SQLVision.Visualizers/Visualizers/TableVisualizer.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
using SQLVision.Core.Enums;
|
||||
using SQLVision.Core.Models;
|
||||
using SQLVision.Visualizers.Interfaces;
|
||||
using System.Data;
|
||||
|
||||
namespace SQLVision.Visualizers.Visualizers;
|
||||
|
||||
public class TableVisualizer : IVisualizer
|
||||
{
|
||||
public FrameworkElement Visualize(DataTable data, OutputDefinition definition)
|
||||
{
|
||||
var listView = new ListView
|
||||
{
|
||||
ItemsSource = data.DefaultView,
|
||||
SelectionMode = ListViewSelectionMode.None,
|
||||
IsItemClickEnabled = false,
|
||||
HorizontalAlignment = HorizontalAlignment.Stretch,
|
||||
VerticalAlignment = VerticalAlignment.Stretch
|
||||
};
|
||||
|
||||
// Автоматическое создание колонок
|
||||
listView.ItemTemplate = CreateDataTemplate(data);
|
||||
|
||||
var scrollViewer = new ScrollViewer
|
||||
{
|
||||
Content = listView,
|
||||
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||||
MaxHeight = 600
|
||||
};
|
||||
|
||||
return scrollViewer;
|
||||
}
|
||||
|
||||
private DataTemplate CreateDataTemplate(DataTable data)
|
||||
{
|
||||
var gridFactory = new FrameworkElementFactory(typeof(Grid));
|
||||
|
||||
// Создаем колонки
|
||||
foreach (DataColumn column in data.Columns)
|
||||
{
|
||||
var columnDefinition = new ColumnDefinition();
|
||||
gridFactory.AppendChild(columnDefinition);
|
||||
}
|
||||
|
||||
// Создаем строку с текстовыми блоками
|
||||
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
|
||||
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
|
||||
|
||||
foreach (DataColumn column in data.Columns)
|
||||
{
|
||||
var borderFactory = new FrameworkElementFactory(typeof(Border));
|
||||
borderFactory.SetValue(Border.BorderThicknessProperty, new Thickness(0, 0, 1, 1));
|
||||
borderFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(Colors.LightGray));
|
||||
|
||||
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
|
||||
textBlockFactory.SetBinding(TextBlock.TextProperty,
|
||||
new Microsoft.UI.Xaml.Data.Binding { Path = new PropertyPath($"[{column.ColumnName}]") });
|
||||
textBlockFactory.SetValue(TextBlock.MarginProperty, new Thickness(4));
|
||||
textBlockFactory.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
|
||||
|
||||
borderFactory.AppendChild(textBlockFactory);
|
||||
stackPanelFactory.AppendChild(borderFactory);
|
||||
}
|
||||
|
||||
gridFactory.AppendChild(stackPanelFactory);
|
||||
|
||||
return new DataTemplate { VisualTree = gridFactory };
|
||||
}
|
||||
|
||||
public bool CanVisualize(OutputType type) => type == OutputType.Table;
|
||||
}
|
||||
70
SQLVision.Visualizers/Visualizers/TextVisualizer.cs
Normal file
70
SQLVision.Visualizers/Visualizers/TextVisualizer.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using SQLVision.Core.Enums;
|
||||
using SQLVision.Core.Models;
|
||||
using SQLVision.Visualizers.Interfaces;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
|
||||
namespace SQLVision.Visualizers.Visualizers;
|
||||
|
||||
public class TextVisualizer : IVisualizer
|
||||
{
|
||||
public FrameworkElement Visualize(DataTable data, OutputDefinition definition)
|
||||
{
|
||||
var textBlock = new TextBlock
|
||||
{
|
||||
Text = ConvertDataTableToText(data),
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
FontFamily = new Microsoft.UI.Xaml.Media.FontFamily("Consolas"),
|
||||
FontSize = 12,
|
||||
IsTextSelectionEnabled = true
|
||||
};
|
||||
|
||||
return new ScrollViewer
|
||||
{
|
||||
Content = textBlock,
|
||||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||||
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto
|
||||
};
|
||||
}
|
||||
|
||||
private string ConvertDataTableToText(DataTable data)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
// Заголовки
|
||||
for (int i = 0; i < data.Columns.Count; i++)
|
||||
{
|
||||
sb.Append(data.Columns[i].ColumnName);
|
||||
if (i < data.Columns.Count - 1)
|
||||
sb.Append(" | ");
|
||||
}
|
||||
sb.AppendLine();
|
||||
sb.AppendLine(new string('-', data.Columns.Count * 20));
|
||||
|
||||
// Данные
|
||||
foreach (DataRow row in data.Rows)
|
||||
{
|
||||
for (int i = 0; i < data.Columns.Count; i++)
|
||||
{
|
||||
var value = row[i];
|
||||
var text = value?.ToString() ?? "NULL";
|
||||
|
||||
// Обрезаем слишком длинные значения
|
||||
if (text.Length > 50)
|
||||
text = text.Substring(0, 47) + "...";
|
||||
|
||||
sb.Append(text);
|
||||
|
||||
if (i < data.Columns.Count - 1)
|
||||
sb.Append(" | ");
|
||||
}
|
||||
sb.AppendLine();
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public bool CanVisualize(OutputType type) => type == OutputType.Text;
|
||||
}
|
||||
Reference in New Issue
Block a user