Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f90536c
Implement pagination support for model table sizes
royendo Jan 7, 2026
3298f69
models in status page
royendo Jan 7, 2026
718d6b3
Cache and eagerly subscribe to model size stores for persistent loading
royendo Jan 7, 2026
0510a42
Remove store caching to fix refresh showing empty sizes
royendo Jan 8, 2026
60d00b5
Add debugging and fix reactive columns for model sizes
royendo Jan 8, 2026
42c54d6
Make columns reactive to update when tableSizes changes
royendo Jan 8, 2026
2519cd4
Update ProjectResourcesTable.svelte
royendo Jan 8, 2026
a487787
prettier
royendo Jan 8, 2026
155a8ef
prettier
royendo Jan 8, 2026
3bc0475
separated tables,
royendo Jan 13, 2026
c716dff
Fix row count fetching with proper mutation pattern
royendo Jan 13, 2026
c6d1128
Fix row count query API usage - pass parameters at creation time
royendo Jan 13, 2026
2b47cc9
Add debug logging and fix row count query handling
royendo Jan 13, 2026
5f853ef
Expand row count query debugging to find response data structure
royendo Jan 13, 2026
734c7d5
Simplify row count fetching using direct queryServiceQuery function
royendo Jan 13, 2026
748cef3
Wait for JWT token availability before making row count queries
royendo Jan 13, 2026
273de0b
Move row count fetching to component level for proper JWT handling
royendo Jan 13, 2026
37c71ca
Use direct fetch with manual JWT header for row count queries
royendo Jan 13, 2026
be7b255
Switch row count fetching to use httpClient with JWT interceptor
royendo Jan 13, 2026
bbea399
removed RowCount issue with JWT, and Query select *
royendo Jan 13, 2026
86e1c04
e23
royendo Jan 13, 2026
ad7a94e
prettier
royendo Jan 13, 2026
327d3da
code qual + prettier
royendo Jan 13, 2026
641e182
updated e2e
royendo Jan 14, 2026
2e04920
no row count for now
royendo Jan 14, 2026
29a8d40
not sure if best practice but for e2e to locate
royendo Jan 14, 2026
98d1643
remove row_count, col_count
royendo Jan 16, 2026
479fb22
Merge branch 'main' into feat-model-size-status-page
royendo Jan 20, 2026
5b374ca
As Reviewed
royendo Jan 20, 2026
0813e09
better implementation
royendo Jan 20, 2026
fb367ba
prettier
royendo Jan 20, 2026
6a63658
code qual
royendo Jan 20, 2026
86f9bce
new approach but need to wait for new API for rest of details
royendo Jan 27, 2026
4b6ae0b
prettier
royendo Jan 27, 2026
d300ade
https://www.loom.com/share/a257d258b1bd4dbea17005d45137536d
royendo Jan 27, 2026
8ac79e9
e2e, will fail as duckdb not showing for OLAP engine atm
royendo Jan 27, 2026
3c2f6d3
Merge branch 'main' into feat-model-size-status-page
royendo Jan 28, 2026
9cea91a
dark mode
royendo Jan 28, 2026
f27ed0a
prettier and code qual
royendo Jan 28, 2026
f7e6ebd
e2e, fix partition refresh
royendo Jan 29, 2026
cf0d061
prettier
royendo Jan 29, 2026
2e4cd49
Merge branch 'main' into feat-model-size-status-page
royendo Jan 30, 2026
3461dbd
e2e fix
royendo Jan 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions runtime/parser/parse_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,26 +248,26 @@ func (p *Parser) parseStem(paths []string, ymlPath, yml, sqlPath, sql string) (*
v, ok := v.(string)
if !ok {
err = fmt.Errorf("invalid type %T for property 'type'", v)
break
}
res.Kind, err = ParseResourceKind(v)
if err != nil {
break
} else {
res.Kind, err = ParseResourceKind(v)
}
case "name":
v, ok := v.(string)
if !ok {
err = fmt.Errorf("invalid type %T for property 'name'", v)
break
} else {
res.Name = v
}
res.Name = v
case "connector":
v, ok := v.(string)
if !ok {
err = fmt.Errorf("invalid type %T for property 'connector'", v)
break
} else {
res.Connector = v
}
res.Connector = v
}
if err != nil {
break
}
}
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions runtime/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -634,12 +634,13 @@ func (p *Parser) parsePaths(ctx context.Context, paths []string) error {
// NOTE 2: Using a map since the two-way check (necessary for reparses) may match the same resource twice.
modelsWithNameErrs := make(map[ResourceName]string)
for _, r := range p.insertedResources {
if r.Name.Kind == ResourceKindSource {
switch r.Name.Kind {
case ResourceKindSource:
n := ResourceName{Kind: ResourceKindModel, Name: r.Name.Name}.Normalized()
if _, ok := p.Resources[n]; ok {
modelsWithNameErrs[n] = r.Name.Name
}
} else if r.Name.Kind == ResourceKindModel {
case ResourceKindModel:
n := ResourceName{Kind: ResourceKindSource, Name: r.Name.Name}.Normalized()
if r2, ok := p.Resources[n]; ok {
modelsWithNameErrs[r.Name.Normalized()] = r2.Name.Name
Expand Down
45 changes: 33 additions & 12 deletions web-admin/src/features/projects/status/ActionsCell.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
export let resourceKind: string;
export let resourceName: string;
export let canRefresh: boolean;
export let isIncremental: boolean = false;
export let hasErroredPartitions: boolean = false;
export let onClickRefreshDialog: (
resourceName: string,
resourceKind: string,
refreshType: "full" | "incremental",
refreshType: "full" | "incremental" | "errored-partitions",
) => void;
export let isDropdownOpen: boolean;
export let onDropdownOpenChange: (isOpen: boolean) => void;
Expand All @@ -37,17 +39,36 @@
<span class="ml-2">Full Refresh</span>
</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => {
onClickRefreshDialog(resourceName, resourceKind, "incremental");
}}
>
<div class="flex items-center">
<RefreshCcwIcon size="12px" />
<span class="ml-2">Incremental Refresh</span>
</div>
</DropdownMenu.Item>
{#if isIncremental}
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => {
onClickRefreshDialog(resourceName, resourceKind, "incremental");
}}
>
<div class="flex items-center">
<RefreshCcwIcon size="12px" />
<span class="ml-2">Incremental Refresh</span>
</div>
</DropdownMenu.Item>
{/if}
{#if hasErroredPartitions}
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => {
onClickRefreshDialog(
resourceName,
resourceKind,
"errored-partitions",
);
}}
>
<div class="flex items-center">
<RefreshCcwIcon size="12px" />
<span class="ml-2">Refresh Errored Partitions</span>
</div>
</DropdownMenu.Item>
{/if}
{:else}
<DropdownMenu.Item
class="font-normal flex items-center"
Expand Down
29 changes: 29 additions & 0 deletions web-admin/src/features/projects/status/MaterializationCell.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<script lang="ts">
import { Code2 } from "lucide-svelte";
import { Database } from "lucide-svelte";

export let isView: boolean | undefined;
export let physicalSizeBytes: string | number | undefined;

$: isLikelyView =
isView === true ||
physicalSizeBytes === "-1" ||
physicalSizeBytes === 0 ||
!physicalSizeBytes;

$: label = isLikelyView ? "View" : "Table";
$: icon = isLikelyView ? Code2 : Database;
</script>

<div class="shrink-0 flex items-center gap-x-1">
<span
class="shrink-0 flex items-center gap-x-1 text-[10px] font-medium px-1.5 py-0.5 rounded
{isLikelyView
? 'bg-cyan-600/15 text-cyan-600'
: 'bg-emerald-600/15 text-emerald-600'}"
>
<!-- Icon inherits text color via currentColor -->
<svelte:component this={icon} size="12px" />
{label}
</span>
</div>
96 changes: 96 additions & 0 deletions web-admin/src/features/projects/status/ModelActionsCell.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<script lang="ts">
import IconButton from "@rilldata/web-common/components/button/IconButton.svelte";
import * as DropdownMenu from "@rilldata/web-common/components/dropdown-menu";
import ThreeDot from "@rilldata/web-common/components/icons/ThreeDot.svelte";
import {
RefreshCcwIcon,
FileTextIcon,
LayoutGridIcon,
AlertCircleIcon,
} from "lucide-svelte";
import type { V1Resource } from "@rilldata/web-common/runtime-client";

export let resource: V1Resource | undefined;
export let isDropdownOpen: boolean;
export let onDropdownOpenChange: (isOpen: boolean) => void;
export let onModelInfoClick: (resource: V1Resource) => void;
export let onViewPartitionsClick: (resource: V1Resource) => void;
export let onRefreshErroredClick: (resource: V1Resource) => void;
export let onIncrementalRefreshClick: (resource: V1Resource) => void;
export let onFullRefreshClick: (resource: V1Resource) => void;

$: isPartitioned = !!resource?.model?.spec?.partitionsResolver;
$: isIncremental = !!resource?.model?.spec?.incremental;
$: hasErroredPartitions =
!!resource?.model?.state?.partitionsModelId &&
!!resource?.model?.state?.partitionsHaveErrors;
</script>

{#if resource}
<DropdownMenu.Root open={isDropdownOpen} onOpenChange={onDropdownOpenChange}>
<DropdownMenu.Trigger class="flex-none">
<IconButton rounded active={isDropdownOpen} size={20}>
<ThreeDot size="16px" />
</IconButton>
</DropdownMenu.Trigger>
<DropdownMenu.Content align="start">
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => onModelInfoClick(resource)}
>
<div class="flex items-center">
<FileTextIcon size="12px" />
<span class="ml-2">Model Information</span>
</div>
</DropdownMenu.Item>

{#if isPartitioned}
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => onViewPartitionsClick(resource)}
>
<div class="flex items-center">
<LayoutGridIcon size="12px" />
<span class="ml-2">View Partitions</span>
</div>
</DropdownMenu.Item>
{/if}

{#if hasErroredPartitions}
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => onRefreshErroredClick(resource)}
>
<div class="flex items-center">
<AlertCircleIcon size="12px" />
<span class="ml-2">Refresh Errored Partitions</span>
</div>
</DropdownMenu.Item>
{/if}

<DropdownMenu.Separator />

<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => onFullRefreshClick(resource)}
>
<div class="flex items-center">
<RefreshCcwIcon size="12px" />
<span class="ml-2">Full Refresh</span>
</div>
</DropdownMenu.Item>

{#if isIncremental}
<DropdownMenu.Item
class="font-normal flex items-center"
on:click={() => onIncrementalRefreshClick(resource)}
>
<div class="flex items-center">
<RefreshCcwIcon size="12px" />
<span class="ml-2">Incremental Refresh</span>
</div>
</DropdownMenu.Item>
{/if}
</DropdownMenu.Content>
</DropdownMenu.Root>
{/if}
52 changes: 52 additions & 0 deletions web-admin/src/features/projects/status/ModelInfoDialog.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<script lang="ts">
import * as Dialog from "@rilldata/web-common/components/dialog";
import YamlPreview from "@rilldata/web-common/features/sources/modal/YamlPreview.svelte";
import type { V1Resource } from "@rilldata/web-common/runtime-client";
import { stringify } from "yaml";

export let open = false;
export let resource: V1Resource | null = null;
export let onClose: () => void = () => {};

$: modelName = resource?.meta?.name?.name ?? "Model";

// Build a clean object for YAML display, similar to `rill project describe`
$: modelInfo = resource
? {
name: resource.meta?.name?.name,
kind: resource.meta?.name?.kind,
filePaths: resource.meta?.filePaths,
spec: resource.model?.spec,
state: {
executorConnector: resource.model?.state?.executorConnector,
resultConnector: resource.model?.state?.resultConnector,
resultTable: resource.model?.state?.resultTable,
partitionsModelId: resource.model?.state?.partitionsModelId,
partitionsHaveErrors: resource.model?.state?.partitionsHaveErrors,
},
}
: null;

$: yamlContent = modelInfo
? stringify(modelInfo, { indent: 2, lineWidth: 0 })
: "";
</script>

<Dialog.Root
{open}
onOpenChange={(o) => {
if (!o) onClose();
}}
>
<Dialog.Content class="max-w-2xl max-h-[80vh] overflow-y-auto">
<Dialog.Header>
<Dialog.Title>Model: {modelName}</Dialog.Title>
</Dialog.Header>

{#if yamlContent}
<YamlPreview title="Model Information" yaml={yamlContent} />
{:else}
<div class="text-fg-secondary py-4">No model information available</div>
{/if}
</Dialog.Content>
</Dialog.Root>
Loading
Loading