81 lines
2.8 KiB
Plaintext
81 lines
2.8 KiB
Plaintext
@page "/data"
|
|
@using Microsoft.AspNetCore.Components.QuickGrid
|
|
@using SchemaEditor.Services
|
|
@inject GarnetClientService GarnetClient
|
|
@rendermode InteractiveServer
|
|
|
|
<div class="container-fluid">
|
|
<h1 class="mb-4">Data Explorer (Garnet)</h1>
|
|
|
|
<div class="card mb-4">
|
|
<div class="card-header bg-light">
|
|
<h5 class="mb-0">Query Store</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="input-group">
|
|
<span class="input-group-text">Key Pattern</span>
|
|
<input class="form-control" @bind="searchPattern" placeholder="e.g. *, SheetName:*" />
|
|
<button class="btn btn-primary" @onclick="SearchKeys">Search</button>
|
|
</div>
|
|
<div class="form-text">Using SCAN/KEYS command. Use specific patterns for performance.</div>
|
|
</div>
|
|
</div>
|
|
|
|
@if (errorMsg != null)
|
|
{
|
|
<div class="alert alert-danger">@errorMsg</div>
|
|
}
|
|
|
|
@if (searchResults != null)
|
|
{
|
|
<div class="card">
|
|
<div class="card-header d-flex justify-content-between">
|
|
<h5 class="mb-0">Results</h5>
|
|
<span class="badge bg-secondary">@searchResults.Count keys found</span>
|
|
</div>
|
|
<div class="card-body p-0">
|
|
<div class="grid-container" style="height: 600px; overflow-y: auto;">
|
|
<QuickGrid Items="@searchResults.AsQueryable()" Pagination="@pagination" Class="table table-striped table-hover mb-0">
|
|
<PropertyColumn Property="@(p => p.Key)" Sortable="true" Title="Key" />
|
|
<PropertyColumn Property="@(p => p.Value)" Sortable="true" Title="Value" />
|
|
</QuickGrid>
|
|
</div>
|
|
<div class="p-2 border-top">
|
|
<Paginator State="@pagination" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
|
|
@code {
|
|
private string searchPattern = "*";
|
|
private List<KeyValuePair<string, string>>? searchResults;
|
|
private string? errorMsg;
|
|
private PaginationState pagination = new PaginationState { ItemsPerPage = 20 };
|
|
|
|
private async Task SearchKeys()
|
|
{
|
|
errorMsg = null;
|
|
searchResults = null;
|
|
try
|
|
{
|
|
var keys = await GarnetClient.SearchKeysAsync(searchPattern);
|
|
var list = new List<KeyValuePair<string, string>>();
|
|
|
|
// Fetch values (Bulk get would be better but keeping simple for now)
|
|
// Limit to 1000 for safety in PoC UI
|
|
foreach (var k in keys.Take(1000))
|
|
{
|
|
var val = await GarnetClient.GetValueAsync(k);
|
|
list.Add(new KeyValuePair<string, string>(k, val));
|
|
}
|
|
searchResults = list;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
errorMsg = $"Query failed: {ex.Message}";
|
|
}
|
|
}
|
|
}
|