mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
836 lines
25 KiB
836 lines
25 KiB
4 years ago
|
<template>
|
||
|
<v-container fluid class="pa-0 ma-0" style="height: 100%">
|
||
|
|
||
|
<v-overlay absolute v-if="isMetaTable">
|
||
|
<v-alert type="info">Meta tables are not editable</v-alert>
|
||
|
</v-overlay>
|
||
|
|
||
|
<v-toolbar flat height="42" class="toolbar-border-bottom">
|
||
|
<v-toolbar-title>
|
||
|
<v-breadcrumbs :items="[{
|
||
|
text: this.nodes.env,
|
||
|
disabled: true,
|
||
|
href: '#'
|
||
|
},{
|
||
|
text: this.nodes.dbAlias,
|
||
|
disabled: true,
|
||
|
href: '#'
|
||
|
},
|
||
|
{
|
||
|
text: this.nodes._tn + ' (table)',
|
||
|
disabled: true,
|
||
|
href: '#'
|
||
|
}]" divider=">" small>
|
||
|
<template v-slot:divider>
|
||
|
<v-icon small color="grey lighten-2">forward</v-icon>
|
||
|
</template>
|
||
|
</v-breadcrumbs>
|
||
|
|
||
|
</v-toolbar-title>
|
||
|
<v-spacer></v-spacer>
|
||
|
|
||
|
<x-btn outlined tooltip="Reload Indexes"
|
||
|
small
|
||
|
@click="mtdRefreshIndexList"
|
||
|
color="primary"
|
||
|
class="primary"
|
||
|
v-ge="['indexes','reload']"
|
||
|
>
|
||
|
<v-icon small left>refresh</v-icon>
|
||
|
Reload
|
||
|
</x-btn>
|
||
|
<x-btn outlined tooltip="Add New Index"
|
||
|
icon="mdi-plus"
|
||
|
small
|
||
|
@click="mtdAddIndex"
|
||
|
color="primary"
|
||
|
class="primary"
|
||
|
v-if="indexCreationAllowed"
|
||
|
v-ge="['indexes','new']"
|
||
|
>
|
||
|
New Index
|
||
|
</x-btn>
|
||
|
<x-btn outlined tooltip="Delete Table"
|
||
|
small
|
||
|
@click="deleteTable('showDialog')"
|
||
|
color="error "
|
||
|
class="error text-right"
|
||
|
v-ge="['indexes','delete-table']"
|
||
|
>
|
||
|
<v-icon small>mdi-delete-outline</v-icon> Delete Table
|
||
|
</x-btn>
|
||
|
<!-- <x-btn outlined tooltip=""-->
|
||
|
<!-- icon-->
|
||
|
<!-- class="text-right">-->
|
||
|
<!-- <v-icon>mdi-help-circle-outline</v-icon>-->
|
||
|
<!-- </x-btn>-->
|
||
|
|
||
|
</v-toolbar>
|
||
|
|
||
|
<!-- <v-row class="pa-0 ma-0">-->
|
||
|
<!-- <v-col class="pr-0 ma-0" cols="8">-->
|
||
|
|
||
|
|
||
|
<splitpanes style="height:calc(100% - 42px);" class="xc-theme">
|
||
|
<pane min-size="33" size="66" style="overflow: auto">
|
||
|
<v-card class="elevation-0" style="">
|
||
|
<v-card-title class="headline justify-center">Indexes</v-card-title>
|
||
|
<v-col>
|
||
|
|
||
|
<v-skeleton-loader type="table" v-if="loading"></v-skeleton-loader>
|
||
|
|
||
|
<v-data-table
|
||
|
v-else
|
||
|
dense
|
||
|
:headers="indexHeaders"
|
||
|
:items="aggregatedIndexes"
|
||
|
footer-props.items-per-page-options="30">
|
||
|
<template v-slot:item="props">
|
||
|
<tr>
|
||
|
<td>
|
||
|
<v-radio-group
|
||
|
v-model="selected"
|
||
|
name="rowSelector"
|
||
|
dense
|
||
|
@change="mtdSelectColumnsForIndex(props.item, props.index)"
|
||
|
v-ge="['indexes','radio']"
|
||
|
>
|
||
|
<v-radio :value="props.index" color="primary"/>
|
||
|
</v-radio-group>
|
||
|
</td>
|
||
|
<td>
|
||
|
<v-edit-dialog
|
||
|
@save="save(props.item)"
|
||
|
@cancel="cancel"
|
||
|
@open="open"
|
||
|
@close="close(props.item)"
|
||
|
v-ge="['indexes','name']"
|
||
|
>
|
||
|
{{ props.item.key_name }}
|
||
|
<template v-slot:input>
|
||
|
<v-text-field
|
||
|
:disabled="props.index !== selected"
|
||
|
class="body-2"
|
||
|
v-model="props.item.key_name"
|
||
|
:rules="[max25chars]"
|
||
|
label="Edit"
|
||
|
single-line
|
||
|
counter
|
||
|
></v-text-field>
|
||
|
</template>
|
||
|
</v-edit-dialog>
|
||
|
</td>
|
||
|
<td>
|
||
|
<v-checkbox
|
||
|
:disabled="props.index !== selected"
|
||
|
dense
|
||
|
color="primary lighten-1"
|
||
|
v-model="props.item.non_unique"
|
||
|
@change="mtdToggleNonUniqueStatus(props.item)"
|
||
|
:true-value="0"
|
||
|
:false-value="1"
|
||
|
v-ge="['indexes','unique']"
|
||
|
></v-checkbox>
|
||
|
</td>
|
||
|
<td>
|
||
|
<v-hover v-slot:default="{ hover }">
|
||
|
<v-icon
|
||
|
v-ge="['indexes','delete']"
|
||
|
small
|
||
|
:color="hover ? 'error' : 'grey'"
|
||
|
@click="
|
||
|
mtdIndexDelete('showDialog', props.item, props.index)
|
||
|
">mdi-delete
|
||
|
</v-icon>
|
||
|
</v-hover>
|
||
|
<x-btn outlined tooltip="Index Create"
|
||
|
v-ge="['indexes','create']"
|
||
|
@click="mtdIndexCreate(props.item)"
|
||
|
color="primary"
|
||
|
small
|
||
|
v-if="props.item.edited && props.index === selected">
|
||
|
<v-icon small>mdi-content-save</v-icon> Save
|
||
|
</x-btn
|
||
|
>
|
||
|
</td>
|
||
|
</tr>
|
||
|
</template>
|
||
|
</v-data-table>
|
||
|
</v-col>
|
||
|
</v-card>
|
||
|
</pane>
|
||
|
<pane min-size="25" size="33" style="overflow: auto">
|
||
|
|
||
|
<v-card class="elevation-0" style="">
|
||
|
<v-card-title class="headline justify-center">Columns in Index</v-card-title>
|
||
|
<v-col>
|
||
|
<v-skeleton-loader type="table" v-if="columnLoading"></v-skeleton-loader>
|
||
|
<v-data-table
|
||
|
v-else
|
||
|
dense
|
||
|
:headers="columnHeaders"
|
||
|
:items="indexColumns"
|
||
|
footer-props.items-per-page-options="30"
|
||
|
>
|
||
|
<template v-slot:item="props">
|
||
|
<tr>
|
||
|
<td>
|
||
|
<v-checkbox
|
||
|
v-ge="['indexes','toggle-order']"
|
||
|
dense
|
||
|
color="primary lighten-1"
|
||
|
v-model="props.item.is_index"
|
||
|
@change="mtdToggleColumnInIndex(props.item, props.index)"
|
||
|
></v-checkbox>
|
||
|
</td>
|
||
|
<td>{{ props.item.cn }}</td>
|
||
|
<td>{{ props.item.seq_in_index }}</td>
|
||
|
</tr>
|
||
|
</template>
|
||
|
</v-data-table>
|
||
|
</v-col>
|
||
|
</v-card>
|
||
|
</pane>
|
||
|
</splitpanes>
|
||
|
<dlgLabelSubmitCancel
|
||
|
type="error"
|
||
|
v-if="showIndexDeleteDialog"
|
||
|
:dialogShow="showIndexDeleteDialog"
|
||
|
:actionsMtd="mtdIndexDelete"
|
||
|
heading="Click Submit to Delete the Index"
|
||
|
/>
|
||
|
</v-container>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import {mapGetters, mapActions} from "vuex";
|
||
|
import dlgLabelSubmitCancel from "../../utils/dlgLabelSubmitCancel";
|
||
|
import {Splitpanes, Pane} from 'splitpanes'
|
||
|
|
||
|
export default {
|
||
|
components: {dlgLabelSubmitCancel, Splitpanes, Pane},
|
||
|
data() {
|
||
|
return {
|
||
|
selected: [],
|
||
|
indexCreationAllowed: true,
|
||
|
applyChanges: true,
|
||
|
|
||
|
columns: [],
|
||
|
aggregatedIndexes: [],
|
||
|
indexes: [],
|
||
|
indexColumns: [],
|
||
|
|
||
|
|
||
|
indexHeaders: [
|
||
|
{
|
||
|
text: "#",
|
||
|
sortable: false
|
||
|
},
|
||
|
{
|
||
|
text: "Index",
|
||
|
sortable: false
|
||
|
},
|
||
|
{
|
||
|
text: "Unique",
|
||
|
sortable: false
|
||
|
},
|
||
|
{
|
||
|
text: "Actions",
|
||
|
sortable: false
|
||
|
}
|
||
|
],
|
||
|
columnHeaders: [
|
||
|
{
|
||
|
text: "#",
|
||
|
sortable: false
|
||
|
},
|
||
|
{
|
||
|
text: "Column",
|
||
|
sortable: false
|
||
|
},
|
||
|
{
|
||
|
text: "Sequence",
|
||
|
sortable: false
|
||
|
}
|
||
|
],
|
||
|
max25chars: v => v.length <= 25 || "Input too long!",
|
||
|
showIndexDeleteDialog: false,
|
||
|
selectedIndexForDelete: null,
|
||
|
columnLoading: false,
|
||
|
loading: false
|
||
|
};
|
||
|
},
|
||
|
methods: {
|
||
|
async handleKeyDown({metaKey, key, altKey, shiftKey, ctrlKey}) {
|
||
|
console.log(metaKey, key, altKey, shiftKey, ctrlKey)
|
||
|
// cmd + s -> save
|
||
|
// cmd + l -> reload
|
||
|
// cmd + n -> new
|
||
|
// cmd + d -> delete
|
||
|
// cmd + enter -> send api
|
||
|
|
||
|
switch ([metaKey, key].join('_')) {
|
||
|
// case 'true_s' :
|
||
|
// await this.applyChanges();
|
||
|
// break;
|
||
|
case 'true_l' :
|
||
|
await this.mtdRefreshIndexList();
|
||
|
break;
|
||
|
case 'true_n' :
|
||
|
this.addIndex();
|
||
|
break;
|
||
|
case 'true_d' :
|
||
|
await this.deleteTable('showDialog');
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
},
|
||
|
|
||
|
async mtdRefreshIndexList() {
|
||
|
|
||
|
try {
|
||
|
this.$store.commit('notification/MutToggleProgressBar', true);
|
||
|
if (this.newTable) {
|
||
|
return;
|
||
|
}
|
||
|
await this.getColumnList();
|
||
|
await this.getIndexesAndCreateAggregatedIndexes();
|
||
|
this.mtdSelectColumnsForIndex();
|
||
|
this.calculateColumnSequenceValue();
|
||
|
|
||
|
} catch (e) {
|
||
|
console.log(e);
|
||
|
} finally {
|
||
|
this.$store.commit('notification/MutToggleProgressBar', false);
|
||
|
}
|
||
|
|
||
|
},
|
||
|
getColumnsForIndexCreation(columns) {
|
||
|
/*************** START : get columns in this index ***************/
|
||
|
let tempIndexes = JSON.parse(JSON.stringify(columns));
|
||
|
console.log("columns in index", columns);
|
||
|
tempIndexes = tempIndexes.filter(function (a) {
|
||
|
return a.seq_in_index !== 0;
|
||
|
});
|
||
|
|
||
|
console.log("tempIndexes after filter", tempIndexes);
|
||
|
|
||
|
tempIndexes = tempIndexes.sort(function (a, b) {
|
||
|
return a.seq_in_index - b.seq_in_index;
|
||
|
});
|
||
|
console.log("tempIndexes after sort", tempIndexes);
|
||
|
|
||
|
let cols = [];
|
||
|
|
||
|
for (let i = 0; i < tempIndexes.length; i++) {
|
||
|
cols.push(tempIndexes[i].cn);
|
||
|
}
|
||
|
|
||
|
return cols;
|
||
|
|
||
|
/*************** END : get columns in this index ***************/
|
||
|
},
|
||
|
async mtdIndexCreate(aggregatedIndex) {
|
||
|
// const client = await this.sqlMgr.projectGetSqlClient({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// });
|
||
|
console.log(aggregatedIndex);
|
||
|
|
||
|
if (aggregatedIndex.added) {
|
||
|
let cols = this.getColumnsForIndexCreation(aggregatedIndex.columns);
|
||
|
if (!cols.length) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let result = await this.$store.dispatch('sqlMgr/ActSqlOpPlus', [
|
||
|
{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
},
|
||
|
"indexCreate",
|
||
|
{
|
||
|
tn: this.nodes.tn,
|
||
|
columns: cols,
|
||
|
indexName: aggregatedIndex.key_name,
|
||
|
non_unique: aggregatedIndex.non_unique
|
||
|
}]);
|
||
|
|
||
|
} else {
|
||
|
console.log(
|
||
|
"IndexCreation involves dropping existing index and creating new one"
|
||
|
);
|
||
|
let colsToRemove = this.getColumnsForIndexCreation(
|
||
|
aggregatedIndex.oldColumns
|
||
|
);
|
||
|
if (!aggregatedIndex.editedIndexAttr && !colsToRemove.length) {
|
||
|
return;
|
||
|
}
|
||
|
console.log("indexDelete for :", colsToRemove);
|
||
|
|
||
|
// let result = await this.sqlMgr.sqlOpPlus(
|
||
|
// {
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// },
|
||
|
// "indexDelete",
|
||
|
// {
|
||
|
// tn: this.nodes.tn,
|
||
|
// columns: colsToRemove,
|
||
|
// indexName: aggregatedIndex.key_name,
|
||
|
// non_unique: aggregatedIndex.non_unique
|
||
|
// }
|
||
|
// );
|
||
|
|
||
|
let result = await this.$store.dispatch('sqlMgr/ActSqlOpPlus', [
|
||
|
{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
},
|
||
|
"indexDelete",
|
||
|
{
|
||
|
tn: this.nodes.tn,
|
||
|
columns: colsToRemove,
|
||
|
indexName: aggregatedIndex.key_name,
|
||
|
non_unique: aggregatedIndex.non_unique,
|
||
|
non_unique_original: aggregatedIndex.non_unique_original
|
||
|
}]);
|
||
|
|
||
|
|
||
|
let colsToCreate = this.getColumnsForIndexCreation(
|
||
|
aggregatedIndex.columns
|
||
|
);
|
||
|
if (!colsToCreate.length) {
|
||
|
return;
|
||
|
}
|
||
|
console.log("indexCreate for :", colsToCreate);
|
||
|
|
||
|
// result = await this.sqlMgr.sqlOpPlus(
|
||
|
// {
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// },
|
||
|
// "indexCreate",
|
||
|
// {
|
||
|
// tn: this.nodes.tn,
|
||
|
// columns: colsToCreate,
|
||
|
// indexName: aggregatedIndex.key_name,
|
||
|
// non_unique: aggregatedIndex.non_unique
|
||
|
// }
|
||
|
// );
|
||
|
|
||
|
result = await this.$store.dispatch('sqlMgr/ActSqlOpPlus', [
|
||
|
{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
},
|
||
|
"indexCreate",
|
||
|
{
|
||
|
tn: this.nodes.tn,
|
||
|
columns: colsToCreate,
|
||
|
indexName: aggregatedIndex.key_name,
|
||
|
non_unique: aggregatedIndex.non_unique
|
||
|
}]);
|
||
|
|
||
|
}
|
||
|
|
||
|
await this.mtdRefreshIndexList();
|
||
|
},
|
||
|
async mtdIndexDelete(action = "", aggregatedIndex, index) {
|
||
|
if (action === "showDialog") {
|
||
|
this.showIndexDeleteDialog = true;
|
||
|
this.selectedIndexForDelete = {aggregatedIndex, index};
|
||
|
} else if (action === "hideDialog") {
|
||
|
this.showIndexDeleteDialog = false;
|
||
|
this.selectedIndexForDelete = null;
|
||
|
} else {
|
||
|
if (this.selectedIndexForDelete.aggregatedIndex.added === 1) {
|
||
|
this.aggregatedIndexes.splice(this.selectedIndexForDelete.index, 1);
|
||
|
console.log(
|
||
|
"This was newly added index : deletign without going to lib"
|
||
|
);
|
||
|
} else {
|
||
|
// const client = await this.sqlMgr.projectGetSqlClient({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// });
|
||
|
|
||
|
/*************** START : get columns in this index ***************/
|
||
|
let tempIndexes = JSON.parse(
|
||
|
JSON.stringify(this.selectedIndexForDelete.aggregatedIndex.columns)
|
||
|
);
|
||
|
|
||
|
tempIndexes = tempIndexes.filter(function (a) {
|
||
|
return a.seq_in_index !== 0;
|
||
|
});
|
||
|
|
||
|
console.log("tempIndexes after filter", tempIndexes);
|
||
|
|
||
|
tempIndexes = tempIndexes.sort(function (a, b) {
|
||
|
return a.seq_in_index - b.seq_in_index;
|
||
|
});
|
||
|
console.log("tempIndexes after sort", tempIndexes);
|
||
|
|
||
|
let cols = [];
|
||
|
|
||
|
for (let i = 0; i < tempIndexes.length; i++) {
|
||
|
cols.push(tempIndexes[i].cn);
|
||
|
}
|
||
|
/*************** END : get columns in this index ***************/
|
||
|
|
||
|
// const result = await client.indexDelete({
|
||
|
// tn: this.nodes.tn,
|
||
|
// columns: cols,
|
||
|
// indexName: this.selectedIndexForDelete.aggregatedIndex.key_name
|
||
|
// });
|
||
|
|
||
|
// let result = await this.sqlMgr.sqlOpPlus(
|
||
|
// {
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// },
|
||
|
// "indexDelete",
|
||
|
// {
|
||
|
// tn: this.nodes.tn,
|
||
|
// columns: cols,
|
||
|
// indexName: this.selectedIndexForDelete.aggregatedIndex.key_name,
|
||
|
// non_unique: this.selectedIndexForDelete.aggregatedIndex.non_unique
|
||
|
// }
|
||
|
// );
|
||
|
|
||
|
let result = await this.$store.dispatch('sqlMgr/ActSqlOpPlus', [
|
||
|
{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
},
|
||
|
"indexDelete",
|
||
|
{
|
||
|
tn: this.nodes.tn,
|
||
|
columns: cols,
|
||
|
indexName: this.selectedIndexForDelete.aggregatedIndex.key_name,
|
||
|
non_unique: this.selectedIndexForDelete.aggregatedIndex.non_unique,
|
||
|
non_unique_original: this.selectedIndexForDelete.aggregatedIndex.non_unique_original
|
||
|
}]);
|
||
|
|
||
|
|
||
|
await this.mtdRefreshIndexList();
|
||
|
}
|
||
|
this.showIndexDeleteDialog = false;
|
||
|
this.selectedIndexForDelete = null;
|
||
|
}
|
||
|
},
|
||
|
mtdToggleNonUniqueStatus(aggregatedIndex) {
|
||
|
console.log('mtdToggleNonUniqueStatus', aggregatedIndex);
|
||
|
//aggregatedIndex.non_unique = aggregatedIndex.non_unique ? 0 : 1;
|
||
|
aggregatedIndex.edited = true;
|
||
|
aggregatedIndex.editedIndexAttr = true;
|
||
|
|
||
|
},
|
||
|
mtdToggleColumnInIndex(cn, index) {
|
||
|
console.log("Index being edited:", this.selected);
|
||
|
|
||
|
let aggregatedIndex = this.aggregatedIndexes.find(
|
||
|
(o, i) => i === this.selected
|
||
|
);
|
||
|
|
||
|
console.log("aggregatedIndex on toggle of column", aggregatedIndex);
|
||
|
|
||
|
if (aggregatedIndex.added) {
|
||
|
console.log("This was newly added index");
|
||
|
} else {
|
||
|
console.log("This is an existing index");
|
||
|
aggregatedIndex.edited = true;
|
||
|
if (!aggregatedIndex.oldColumns.length) {
|
||
|
console.log("Taking backup of old columns");
|
||
|
aggregatedIndex.oldColumns = JSON.parse(
|
||
|
JSON.stringify(aggregatedIndex.columns)
|
||
|
);
|
||
|
} else {
|
||
|
console.log(
|
||
|
"Taking backup of old columns : old columns already exists"
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (cn.seq_in_index) {
|
||
|
for (let i = 0; i < this.indexColumns.length; i++) {
|
||
|
if (this.indexColumns[i].seq_in_index > cn.seq_in_index) {
|
||
|
this.indexColumns[i].seq_in_index -= 1;
|
||
|
}
|
||
|
}
|
||
|
cn.seq_in_index = 0;
|
||
|
} else {
|
||
|
const max = Math.max.apply(
|
||
|
Math,
|
||
|
this.indexColumns.map(function (o) {
|
||
|
return o.seq_in_index;
|
||
|
})
|
||
|
);
|
||
|
console.log("max value:", max);
|
||
|
cn.seq_in_index = max + 1;
|
||
|
}
|
||
|
},
|
||
|
mtdAddIndex() {
|
||
|
const itemIndex = this.aggregatedIndexes.length;
|
||
|
let index = {
|
||
|
cardinality: "a",
|
||
|
collation: "a",
|
||
|
cn: "",
|
||
|
comment: "",
|
||
|
expression: "",
|
||
|
index_comment: "",
|
||
|
index_type: "BTREE",
|
||
|
key_name: "idx_" + itemIndex,
|
||
|
non_unique: 1,
|
||
|
null: "",
|
||
|
packed: "",
|
||
|
seq_in_index: 0,
|
||
|
sub_part: "",
|
||
|
table: "",
|
||
|
visible: "",
|
||
|
added: 1,
|
||
|
edited: 1,
|
||
|
columns: JSON.parse(JSON.stringify(this.columns))
|
||
|
};
|
||
|
this.aggregatedIndexes.push(index);
|
||
|
this.selected = itemIndex;
|
||
|
this.mtdSelectColumnsForIndex(index, itemIndex)
|
||
|
},
|
||
|
mtdResetColumnsIndexes() {
|
||
|
for (let j = 0; j < this.columns.length; j++) {
|
||
|
this.columns[j].seq_in_index = 0;
|
||
|
this.columns[j].is_index = false;
|
||
|
}
|
||
|
},
|
||
|
mtdSelectColumnsForIndex(indexObj = null, index = 0) {
|
||
|
|
||
|
console.log('selecting index', index);
|
||
|
|
||
|
if (!indexObj) {
|
||
|
if (this.aggregatedIndexes.length) {
|
||
|
indexObj = this.aggregatedIndexes[0];
|
||
|
this.selected = index
|
||
|
// this.$nextTick(() => {
|
||
|
// this.selected = indexObj.key_name + ''
|
||
|
// })
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
//
|
||
|
// for (let i = 0; i < this.indexes.length; i++) {
|
||
|
// if (indexObj.key_name === this.indexes[i].key_name) {
|
||
|
// console.log(indexObj.key_name, this.indexes[i].key_name);
|
||
|
// for (let j = 0; j < this.columns.length; j++) {
|
||
|
// if (this.indexes[i].cn === this.columns[j].cn) {
|
||
|
// indexObj.columns[j].seq_in_index = this.indexes[i].seq_in_index;
|
||
|
// indexObj.columns[j].is_index = true;
|
||
|
// console.log("Column is in index: ", this.columns[j]);
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
this.indexColumns = indexObj.columns;
|
||
|
},
|
||
|
calculateColumnSequenceValue() {
|
||
|
this.aggregatedIndexes.forEach(indexObj => {
|
||
|
for (let i = 0; i < this.indexes.length; i++) {
|
||
|
if (indexObj.key_name === this.indexes[i].key_name) {
|
||
|
console.log(indexObj.key_name, this.indexes[i].key_name);
|
||
|
for (let j = 0; j < this.columns.length; j++) {
|
||
|
if (this.indexes[i].cn === this.columns[j].cn) {
|
||
|
indexObj.columns[j].seq_in_index = this.indexes[i].seq_in_index;
|
||
|
indexObj.columns[j].is_index = true;
|
||
|
console.log("Column is in index: ", this.columns[j]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
},
|
||
|
|
||
|
createAggregatedIndexesList(indexes) {
|
||
|
for (let i = 0; i < indexes.length; i++) {
|
||
|
const index = {...indexes[i]};
|
||
|
let found = 0;
|
||
|
for (let j = 0; j < this.aggregatedIndexes.length; j++) {
|
||
|
const aggregatedIndex = this.aggregatedIndexes[j];
|
||
|
|
||
|
if (aggregatedIndex.key_name === index.key_name) {
|
||
|
found = 1;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (!found) {
|
||
|
index.edited = false;
|
||
|
index.columns = [];
|
||
|
index.oldColumns = [];
|
||
|
index.columns = JSON.parse(JSON.stringify(this.columns));
|
||
|
this.aggregatedIndexes.push(index);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
},
|
||
|
async getIndexesAndCreateAggregatedIndexes() {
|
||
|
this.loading = true;
|
||
|
|
||
|
if (this.newTable) return;
|
||
|
|
||
|
this.indexes = [];
|
||
|
this.aggregatedIndexes = [];
|
||
|
|
||
|
// console.log("env: this.nodes.env", this.nodes.env, this.nodes.dbAlias);
|
||
|
// const client = await this.sqlMgr.projectGetSqlClient({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// });
|
||
|
// const result = await client.indexList({
|
||
|
// tn: this.nodes.tn
|
||
|
// });
|
||
|
// const result = await this.sqlMgr.sqlOp({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// }, 'indexList', {
|
||
|
// tn: this.nodes.tn
|
||
|
// })
|
||
|
|
||
|
const result = await this.$store.dispatch('sqlMgr/ActSqlOp', [{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
}, 'indexList', {
|
||
|
tn: this.nodes.tn
|
||
|
}])
|
||
|
|
||
|
|
||
|
this.createAggregatedIndexesList(result.data.list);
|
||
|
|
||
|
// this.indexes = JSON.parse(JSON.stringify(result.data.list));
|
||
|
this.indexes = [];
|
||
|
this.indexes = result.data.list;
|
||
|
console.log('Indexes List in table', this.indexes);
|
||
|
console.log('Aggregated Indexes in table', this.aggregatedIndexes);
|
||
|
|
||
|
this.loading = false;
|
||
|
},
|
||
|
async getColumnList() {
|
||
|
this.columnLoading = true;
|
||
|
// console.log("env: this.nodes.env", this.nodes.env, this.nodes.dbAlias);
|
||
|
// const client = await this.sqlMgr.projectGetSqlClient({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// });
|
||
|
// const result = await client.columnList({
|
||
|
// tn: this.nodes.tn
|
||
|
// });
|
||
|
|
||
|
// const result = await this.sqlMgr.sqlOp({
|
||
|
// env: this.nodes.env,
|
||
|
// dbAlias: this.nodes.dbAlias
|
||
|
// }, 'columnList', {
|
||
|
// tn: this.nodes.tn
|
||
|
// })
|
||
|
|
||
|
const result = await this.$store.dispatch('sqlMgr/ActSqlOp', [{
|
||
|
env: this.nodes.env,
|
||
|
dbAlias: this.nodes.dbAlias
|
||
|
}, 'columnList', {
|
||
|
tn: this.nodes.tn
|
||
|
}])
|
||
|
|
||
|
this.columns = JSON.parse(JSON.stringify(result.data.list));
|
||
|
for (let i = 0; i < this.columns.length; i++) {
|
||
|
this.columns[i]["seq_in_index"] = 0;
|
||
|
this.columns[i]["is_index"] = false;
|
||
|
}
|
||
|
|
||
|
console.log("Columns in table:", this.columns);
|
||
|
this.columnLoading = false;
|
||
|
},
|
||
|
save(aggregatedIndex) {
|
||
|
|
||
|
aggregatedIndex.edited = true;
|
||
|
|
||
|
this.snack = true;
|
||
|
this.snackColor = "success";
|
||
|
this.snackText = "Data saved";
|
||
|
|
||
|
|
||
|
},
|
||
|
cancel() {
|
||
|
this.snack = true;
|
||
|
this.snackColor = "error";
|
||
|
this.snackText = "Canceled";
|
||
|
console.log("Dialog Canceled");
|
||
|
},
|
||
|
open() {
|
||
|
this.snack = true;
|
||
|
this.snackColor = "info";
|
||
|
this.snackText = "Dialog opened";
|
||
|
},
|
||
|
close(aggregatedIndex) {
|
||
|
aggregatedIndex.edited = true;
|
||
|
}
|
||
|
},
|
||
|
computed: {
|
||
|
...mapGetters({sqlMgr: "sqlMgr/sqlMgr"})
|
||
|
},
|
||
|
|
||
|
beforeCreated() {
|
||
|
},
|
||
|
async created() {
|
||
|
await this.mtdRefreshIndexList();
|
||
|
},
|
||
|
mounted() {
|
||
|
},
|
||
|
beforeDestroy() {
|
||
|
},
|
||
|
destroy() {
|
||
|
},
|
||
|
validate({params}) {
|
||
|
return true;
|
||
|
},
|
||
|
head() {
|
||
|
return {};
|
||
|
},
|
||
|
props: ["nodes", "newTable", "deleteTable", 'isMetaTable'],
|
||
|
watch: {
|
||
|
columns: function () {
|
||
|
return this.columns;
|
||
|
},
|
||
|
aggregatedIndexes(v, ov) {
|
||
|
console.log(v, ov);
|
||
|
}
|
||
|
},
|
||
|
directives: {}
|
||
|
};
|
||
|
</script>
|
||
|
|
||
|
<style scoped>
|
||
|
</style>
|
||
|
<!--
|
||
|
/**
|
||
|
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||
|
*
|
||
|
* @author Naveen MR <oof1lab@gmail.com>
|
||
|
* @author Pranav C Balan <pranavxc@gmail.com>
|
||
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
*/
|
||
|
-->
|