postgresql materialized views #123

This commit is contained in:
Jan Prochazka
2021-05-28 22:18:06 +02:00
parent 94804957e5
commit 0a06ebf9c3
16 changed files with 187 additions and 18 deletions

View File

@@ -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',

View File

@@ -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>

View File

@@ -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, {});
}

View File

@@ -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}
/>