diff --git a/packages/datalib/src/PerspectiveCache.ts b/packages/datalib/src/PerspectiveCache.ts index 83b658f3f..d26a6697a 100644 --- a/packages/datalib/src/PerspectiveCache.ts +++ b/packages/datalib/src/PerspectiveCache.ts @@ -37,6 +37,7 @@ export class PerspectiveCacheTable { loadedAll: boolean; loadedRows: any[] = []; bindingGroups: { [bindingKey: string]: PerspectiveBindingGroup } = {}; + allRowCount: number = null; get loadedCount() { return this.loadedRows.length; diff --git a/packages/datalib/src/PerspectiveDataLoader.ts b/packages/datalib/src/PerspectiveDataLoader.ts index 20f13ab74..716b89bd0 100644 --- a/packages/datalib/src/PerspectiveDataLoader.ts +++ b/packages/datalib/src/PerspectiveDataLoader.ts @@ -142,4 +142,32 @@ export class PerspectiveDataLoader { if (response.errorMessage) return response; return response.rows; } + + async loadRowCount(props: PerspectiveDataLoadProps) { + const { schemaName, pureName, bindingColumns, bindingValues, dataColumns, orderBy, condition } = props; + + const select: Select = { + commandType: 'select', + from: { + name: { schemaName, pureName }, + }, + columns: [ + { + exprType: 'raw', + sql: 'COUNT(*)', + alias: 'count', + }, + ], + where: this.buildCondition(props), + }; + + const response = await this.apiCall('database-connections/sql-select', { + conid: props.databaseConfig.conid, + database: props.databaseConfig.database, + select, + }); + + if (response.errorMessage) return response; + return response.rows[0]; + } } diff --git a/packages/datalib/src/PerspectiveDataProvider.ts b/packages/datalib/src/PerspectiveDataProvider.ts index 67fb90dbf..17e3bcac6 100644 --- a/packages/datalib/src/PerspectiveDataProvider.ts +++ b/packages/datalib/src/PerspectiveDataProvider.ts @@ -203,4 +203,23 @@ export class PerspectiveDataProvider { return tableCache.getRowsResult(props); } + + async loadRowCount(props: PerspectiveDataLoadProps): Promise { + const tableCache = this.cache.getTableCache(props); + + if (tableCache.allRowCount != null) { + return tableCache.allRowCount; + } + + const result = await this.loader.loadRowCount({ + ...props, + }); + + if (result.errorMessage) { + throw new Error(result.errorMessage); + } + + tableCache.allRowCount = parseInt(result.count); + return tableCache.allRowCount; + } } diff --git a/packages/web/src/perspectives/PerspectiveTable.svelte b/packages/web/src/perspectives/PerspectiveTable.svelte index 7a4ada018..36dd43287 100644 --- a/packages/web/src/perspectives/PerspectiveTable.svelte +++ b/packages/web/src/perspectives/PerspectiveTable.svelte @@ -39,6 +39,7 @@ import { getPerspectiveNodeMenu } from './perspectiveMenu'; import openNewTab from '../utility/openNewTab'; import { getFilterValueExpression } from 'dbgate-filterparser'; + import StatusBarTabItem from '../widgets/StatusBarTabItem.svelte'; const dbg = debug('dbgate:PerspectiveTable'); export const activator = createActivator('PerspectiveTable', true, ['Designer']); @@ -54,6 +55,7 @@ let domWrapper; let domTable; let errorMessage; + let rowCount; let isLoading = false; const lastVisibleRowIndexRef = createRef(0); const disableLoadNextRef = createRef(false); @@ -128,10 +130,13 @@ dataRows = rows; dbg('data rows', rows); errorMessage = null; + + rowCount = await node.dataProvider.loadRowCount(root.getNodeLoadProps([])); } catch (err) { console.error(err); errorMessage = err.message; dataRows = null; + rowCount = null; } isLoading = false; // console.log('DISPLAY ROWS', rows); @@ -531,6 +536,10 @@ {/if} +{#if rowCount != null} + +{/if} +