mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 05:26:00 +00:00
postgresql materialized views #123
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
tables: 'img table',
|
||||
collections: 'img collection',
|
||||
views: 'img view',
|
||||
matviews: 'img view',
|
||||
procedures: 'img procedure',
|
||||
functions: 'img function',
|
||||
};
|
||||
@@ -14,6 +15,7 @@
|
||||
tables: 'TableDataTab',
|
||||
collections: 'CollectionDataTab',
|
||||
views: 'ViewDataTab',
|
||||
matviews: 'ViewDataTab',
|
||||
};
|
||||
|
||||
const menus = {
|
||||
@@ -146,6 +148,63 @@
|
||||
},
|
||||
},
|
||||
],
|
||||
matviews: [
|
||||
{
|
||||
label: 'Open data',
|
||||
tab: 'ViewDataTab',
|
||||
forceNewTab: true,
|
||||
},
|
||||
{
|
||||
label: 'Open structure',
|
||||
tab: 'TableStructureTab',
|
||||
},
|
||||
{
|
||||
label: 'Query designer',
|
||||
isQueryDesigner: true,
|
||||
},
|
||||
{
|
||||
divider: true,
|
||||
},
|
||||
{
|
||||
label: 'Export',
|
||||
isExport: true,
|
||||
},
|
||||
{
|
||||
label: 'Open in free table editor',
|
||||
isOpenFreeTable: true,
|
||||
},
|
||||
{
|
||||
label: 'Open active chart',
|
||||
isActiveChart: true,
|
||||
},
|
||||
{
|
||||
divider: true,
|
||||
},
|
||||
{
|
||||
label: 'SQL: CREATE MATERIALIZED VIEW',
|
||||
scriptTemplate: 'CREATE OBJECT',
|
||||
},
|
||||
{
|
||||
label: 'SQL: CREATE TABLE',
|
||||
scriptTemplate: 'CREATE TABLE',
|
||||
},
|
||||
{
|
||||
label: 'SQL: SELECT',
|
||||
scriptTemplate: 'SELECT',
|
||||
},
|
||||
{
|
||||
label: 'SQL Generator: CREATE MATERIALIZED VIEW',
|
||||
sqlGeneratorProps: {
|
||||
createMatviews: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'SQL Generator: DROP MATERIALIZED VIEW',
|
||||
sqlGeneratorProps: {
|
||||
dropMatviews: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
procedures: [
|
||||
{
|
||||
label: 'SQL: CREATE PROCEDURE',
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
createTables: true,
|
||||
createForeignKeys: true,
|
||||
createViews: true,
|
||||
createMatviews: true,
|
||||
createProcedures: true,
|
||||
createFunctions: true,
|
||||
createTriggers: true,
|
||||
@@ -48,6 +49,8 @@
|
||||
|
||||
export let initialObjects = null;
|
||||
|
||||
const OBJ_TYPE_LABELS = { Matview: 'Materialized view' };
|
||||
|
||||
let busy = false;
|
||||
let managerSize;
|
||||
let objectsFilter = '';
|
||||
@@ -72,7 +75,7 @@
|
||||
$: generatePreview($valuesStore, $checkedObjectsStore);
|
||||
|
||||
$: objectList = _.flatten(
|
||||
['tables', 'views', 'procedures', 'functions'].map(objectTypeField =>
|
||||
['tables', 'views', 'matviews', 'procedures', 'functions'].map(objectTypeField =>
|
||||
_.sortBy(
|
||||
(($dbinfo || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })),
|
||||
['schemaName', 'pureName']
|
||||
@@ -125,6 +128,7 @@
|
||||
);
|
||||
closeCurrentModal();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<FormProviderCore values={valuesStore} template={FormFieldTemplateTiny}>
|
||||
@@ -211,8 +215,8 @@
|
||||
|
||||
<FormCheckboxField label="Truncate tables (delete all rows)" name="truncate" />
|
||||
|
||||
{#each ['View', 'Procedure', 'Function', 'Trigger'] as objtype}
|
||||
<div class="obj-heading">{objtype}s</div>
|
||||
{#each ['View', 'MatView', 'Procedure', 'Function', 'Trigger'] as objtype}
|
||||
<div class="obj-heading">{OBJ_TYPE_LABELS[objtype] || objtype}s</div>
|
||||
<FormCheckboxField label="Create" name={`create${objtype}s`} />
|
||||
<FormCheckboxField label="Drop" name={`drop${objtype}s`} />
|
||||
{#if values[`drop${objtype}s`]}
|
||||
@@ -254,4 +258,5 @@
|
||||
.dbname {
|
||||
color: var(--theme-font-3);
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -260,9 +260,18 @@ export function useDbCore(args, objectTypeField = undefined) {
|
||||
if (!dbStore) return null;
|
||||
return derived(dbStore, db => {
|
||||
if (!db) return null;
|
||||
return db[objectTypeField || args.objectTypeField].find(
|
||||
x => x.pureName == args.pureName && x.schemaName == args.schemaName
|
||||
);
|
||||
if (_.isArray(objectTypeField)) {
|
||||
for (const field of objectTypeField) {
|
||||
const res = db[field || args.objectTypeField].find(
|
||||
x => x.pureName == args.pureName && x.schemaName == args.schemaName
|
||||
);
|
||||
if (res) return res;
|
||||
}
|
||||
} else {
|
||||
return db[objectTypeField || args.objectTypeField].find(
|
||||
x => x.pureName == args.pureName && x.schemaName == args.schemaName
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -283,7 +292,7 @@ export function getViewInfo(args) {
|
||||
|
||||
/** @returns {import('dbgate-types').ViewInfo} */
|
||||
export function useViewInfo(args) {
|
||||
return useDbCore(args, 'views');
|
||||
return useDbCore(args, ['views', 'matviews']);
|
||||
}
|
||||
|
||||
/** @returns {import('dbgate-types').CollectionInfo} */
|
||||
@@ -344,7 +353,6 @@ export function useDatabaseServerVersion(args) {
|
||||
return useCore(databaseServerVersionLoader, args);
|
||||
}
|
||||
|
||||
|
||||
export function getServerStatus() {
|
||||
return getCore(serverStatusLoader, {});
|
||||
}
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
$: objects = useDatabaseInfo({ conid, database });
|
||||
$: status = useDatabaseStatus({ conid, database });
|
||||
|
||||
// $: console.log('objects', $objects);
|
||||
// $: console.log('OBJECTS', $objects);
|
||||
|
||||
$: objectList = _.flatten(
|
||||
['tables', 'collections', 'views', 'procedures', 'functions'].map(objectTypeField =>
|
||||
['tables', 'collections', 'views', 'matviews', 'procedures', 'functions'].map(objectTypeField =>
|
||||
_.sortBy(
|
||||
(($objects || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })),
|
||||
['schemaName', 'pureName']
|
||||
@@ -35,6 +35,9 @@
|
||||
const handleRefreshDatabase = () => {
|
||||
axiosInstance.post('database-connections/refresh', { conid, database });
|
||||
};
|
||||
|
||||
const OBJECT_TYPE_LABELS = { matviews: 'Materialized views' };
|
||||
|
||||
</script>
|
||||
|
||||
{#if $status && $status.name == 'error'}
|
||||
@@ -62,9 +65,10 @@
|
||||
<AppObjectList
|
||||
list={objectList.map(x => ({ ...x, conid, database }))}
|
||||
module={databaseObjectAppObject}
|
||||
groupFunc={data => _.startCase(data.objectTypeField)}
|
||||
groupFunc={data => OBJECT_TYPE_LABELS[data.objectTypeField] || _.startCase(data.objectTypeField)}
|
||||
subItemsComponent={SubColumnParamList}
|
||||
isExpandable={data => data.objectTypeField == 'tables' || data.objectTypeField == 'views'}
|
||||
isExpandable={data =>
|
||||
data.objectTypeField == 'tables' || data.objectTypeField == 'views' || data.objectTypeField == 'matviews'}
|
||||
expandIconFunc={chevronExpandIcon}
|
||||
{filter}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user