Skip to content

Commit e887984

Browse files
Merge pull request #156 from erikdarlingdata/dev
Release v1.3.0
2 parents d0415d9 + 30eeb30 commit e887984

23 files changed

Lines changed: 2155 additions & 271 deletions

.coderabbit.yaml

Lines changed: 0 additions & 65 deletions
This file was deleted.

.github/FUNDING.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
github: erikdarlingdata

src/PlanViewer.App/AboutWindow.axaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ private async void CheckUpdate_Click(object? sender, RoutedEventArgs e)
9797
if (_velopackUpdate != null)
9898
{
9999
UpdateStatusText.Text = "Update available:";
100-
UpdateLink.Text = $"v{_velopackUpdate.TargetFullRelease.Version} — click to download and install";
100+
UpdateLink.Text = $"v{_velopackUpdate.TargetFullRelease.Version} — click to install";
101101
UpdateLink.IsVisible = true;
102102
CheckUpdateButton.IsEnabled = true;
103103
return;

src/PlanViewer.App/Controls/QuerySessionControl.axaml.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,11 +1021,26 @@ private async void QueryStore_Click(object? sender, RoutedEventArgs e)
10211021

10221022
SetStatus("");
10231023

1024+
// Check if wait stats are supported (SQL 2017+ / Azure) and capture is enabled
1025+
var supportsWaitStats = _serverMetadata?.SupportsQueryStoreWaitStats ?? false;
1026+
if (supportsWaitStats)
1027+
{
1028+
try
1029+
{
1030+
var connStr = _serverConnection!.GetConnectionString(_credentialService, _selectedDatabase!);
1031+
supportsWaitStats = await QueryStoreService.IsWaitStatsCaptureEnabledAsync(connStr);
1032+
}
1033+
catch
1034+
{
1035+
supportsWaitStats = false;
1036+
}
1037+
}
1038+
10241039
// Build database list from the current DatabaseBox
10251040
var databases = DatabaseBox.Items.OfType<string>().ToList();
10261041

10271042
var grid = new QueryStoreGridControl(_serverConnection!, _credentialService,
1028-
_selectedDatabase!, databases);
1043+
_selectedDatabase!, databases, supportsWaitStats);
10291044
grid.PlansSelected += OnQueryStorePlansSelected;
10301045

10311046
var headerText = new TextBlock

src/PlanViewer.App/Controls/QueryStoreGridControl.axaml

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,26 @@
44
x:Class="PlanViewer.App.Controls.QueryStoreGridControl"
55
Background="{DynamicResource BackgroundBrush}">
66
<Grid RowDefinitions="Auto,Auto,*">
7-
<!-- Time Range Slicer -->
8-
<local:TimeRangeSlicerControl x:Name="TimeRangeSlicer" Grid.Row="0"/>
7+
<!-- Time Range Slicer + Wait Stats Profile -->
8+
<Grid Grid.Row="0" x:Name="SlicerRow" ColumnDefinitions="2*,Auto,*">
9+
<local:TimeRangeSlicerControl x:Name="TimeRangeSlicer" Grid.Column="0"/>
10+
<!-- Resizable separator with chevron overlay -->
11+
<GridSplitter x:Name="WaitStatsSplitter" Grid.Column="1" Width="14"
12+
Background="{DynamicResource BorderBrush}"
13+
ResizeDirection="Columns"/>
14+
<Button x:Name="WaitStatsChevronButton" Grid.Column="1"
15+
Content="»"
16+
Width="14" Height="28" Padding="0"
17+
FontSize="11" FontWeight="Bold"
18+
Background="Transparent" BorderThickness="0"
19+
Foreground="{DynamicResource ForegroundBrush}"
20+
HorizontalAlignment="Center"
21+
VerticalAlignment="Center"
22+
IsHitTestVisible="True"
23+
ToolTip.Tip="Collapse / expand wait stats panel"
24+
Click="WaitStatsChevron_Click"/>
25+
<local:WaitStatsProfileControl x:Name="WaitStatsProfile" Grid.Column="2"/>
26+
</Grid>
927

1028
<!-- Toolbar -->
1129
<Border Grid.Row="1" Background="{DynamicResource BackgroundDarkBrush}" Padding="8,6"
@@ -91,8 +109,9 @@
91109
</StackPanel>
92110
</Border>
93111

94-
<!-- DataGrid -->
95-
<DataGrid Grid.Row="2" x:Name="ResultsGrid"
112+
<!-- DataGrid + loading overlay -->
113+
<Grid Grid.Row="2">
114+
<DataGrid x:Name="ResultsGrid"
96115
AutoGenerateColumns="False"
97116
CanUserSortColumns="True"
98117
CanUserReorderColumns="True"
@@ -134,6 +153,29 @@
134153
<DataGridTextColumn Header="Query Hash" Binding="{ReflectionBinding QueryHash}" SortMemberPath="QueryHash" Width="150"/>
135154
<DataGridTextColumn Header="Plan Hash" Binding="{ReflectionBinding QueryPlanHash}" SortMemberPath="QueryPlanHash" Width="150"/>
136155
<DataGridTextColumn Header="Module" Binding="{ReflectionBinding ModuleName}" SortMemberPath="ModuleName" Width="140"/>
156+
<DataGridTemplateColumn SortMemberPath="WaitGrandTotalSort" Width="160">
157+
<DataGridTemplateColumn.Header>
158+
<StackPanel Orientation="Horizontal" Spacing="4">
159+
<Button Content="v" Width="20" Height="18" Padding="0"
160+
FontSize="10" FontWeight="Bold"
161+
Background="Transparent" BorderThickness="1"
162+
BorderBrush="{DynamicResource ForegroundMutedBrush}"
163+
Foreground="{DynamicResource ForegroundBrush}"
164+
ToolTip.Tip="Toggle value (v) / percent (%) stacked bar"
165+
Click="WaitModeToggle_Click"/>
166+
<TextBlock Text="Wait Profile" VerticalAlignment="Center"/>
167+
</StackPanel>
168+
</DataGridTemplateColumn.Header>
169+
<DataGridTemplateColumn.CellTemplate>
170+
<DataTemplate x:DataType="local:QueryStoreRow">
171+
<local:WaitProfileBarControl Height="14" Margin="2,1"
172+
Profile="{Binding WaitProfile}"
173+
HighlightCategory="{Binding WaitHighlightCategory}"
174+
PercentMode="{Binding WaitPercentMode}"
175+
MaxGrandTotalRatio="{Binding WaitMaxGrandTotal}"/>
176+
</DataTemplate>
177+
</DataGridTemplateColumn.CellTemplate>
178+
</DataGridTemplateColumn>
137179
<DataGridTextColumn Header="Last Executed (Local)" Binding="{ReflectionBinding LastExecutedLocal}" SortMemberPath="LastExecutedLocal" Width="160"/>
138180
<DataGridTemplateColumn Header="Executions" SortMemberPath="ExecsSort" Width="100">
139181
<DataGridTemplateColumn.CellTemplate>
@@ -277,5 +319,17 @@
277319
</DataGridTemplateColumn>
278320
</DataGrid.Columns>
279321
</DataGrid>
322+
<!-- Loading overlay -->
323+
<Border x:Name="GridLoadingOverlay" IsVisible="False"
324+
Background="#80000000" CornerRadius="0"
325+
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
326+
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="8">
327+
<ProgressBar IsIndeterminate="True" Width="200" Height="4"/>
328+
<TextBlock x:Name="GridLoadingText" Text="Fetching plans..."
329+
FontSize="12" HorizontalAlignment="Center"
330+
Foreground="{DynamicResource ForegroundBrush}"/>
331+
</StackPanel>
332+
</Border>
333+
</Grid>
280334
</Grid>
281335
</UserControl>

0 commit comments

Comments
 (0)