discourse-data-explorer/assets/javascripts/discourse/components/explorer-schema.js

138 lines
3.2 KiB
JavaScript
Raw Normal View History

import Component from "@ember/component";
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import discourseDebounce from "discourse-common/lib/debounce";
import { isBlank, isEmpty } from "@ember/utils";
2016-02-17 17:17:43 -05:00
export default Component.extend({
actions: {
collapseSchema() {
2018-10-10 07:56:23 -04:00
this.set("hideSchema", true);
2020-09-04 07:23:11 -04:00
},
},
@discourseComputed("schema")
transformedSchema(schema) {
2015-07-08 16:45:13 -04:00
for (let key in schema) {
if (!schema.hasOwnProperty(key)) {
continue;
}
2020-09-04 07:23:11 -04:00
schema[key].forEach((col) => {
2015-07-28 14:18:22 -04:00
const notes_components = [];
if (col.primary) {
notes_components.push("primary key");
}
2015-07-08 16:45:13 -04:00
if (col.is_nullable) {
2015-07-28 14:18:22 -04:00
notes_components.push("null");
2015-07-08 16:45:13 -04:00
}
if (col.column_default) {
2015-07-28 14:18:22 -04:00
notes_components.push("default " + col.column_default);
2015-07-08 16:45:13 -04:00
}
if (col.fkey_info) {
2015-07-28 14:18:22 -04:00
notes_components.push("fkey " + col.fkey_info);
}
if (col.denormal) {
notes_components.push("denormal " + col.denormal);
}
2015-07-28 14:18:22 -04:00
const notes = notes_components.join(", ");
2015-07-08 16:45:13 -04:00
if (notes) {
col.notes = notes;
}
2015-07-09 18:46:19 -04:00
if (col.enum || col.column_desc) {
col.havepopup = true;
2015-07-09 18:46:19 -04:00
}
col.havetypeinfo = !!(col.notes || col.enum || col.column_desc);
2015-07-08 16:45:13 -04:00
});
}
return schema;
},
2015-07-08 16:45:13 -04:00
@discourseComputed("filter")
rfilter(filter) {
if (!isBlank(filter)) {
return new RegExp(filter);
2015-07-08 16:45:13 -04:00
}
},
2015-07-08 16:45:13 -04:00
filterTables(schema) {
2015-07-08 16:45:13 -04:00
let tables = [];
const filter = this.rfilter,
2015-07-08 16:45:13 -04:00
haveFilter = !!filter;
for (let key in schema) {
if (!schema.hasOwnProperty(key)) {
continue;
}
if (!haveFilter) {
tables.push({
name: key,
columns: schema[key],
2020-09-04 07:23:11 -04:00
open: false,
2015-07-08 16:45:13 -04:00
});
continue;
}
// Check the table name vs the filter
2017-08-02 04:19:38 -04:00
if (filter.source === key || filter.source + "s" === key) {
2015-07-08 16:45:13 -04:00
tables.unshift({
name: key,
columns: schema[key],
2020-09-04 07:23:11 -04:00
open: haveFilter,
2015-07-08 16:45:13 -04:00
});
} else if (filter.test(key)) {
// whole table matches
tables.push({
name: key,
columns: schema[key],
2020-09-04 07:23:11 -04:00
open: haveFilter,
2015-07-08 16:45:13 -04:00
});
} else {
// filter the columns
let filterCols = [];
2020-09-04 07:23:11 -04:00
schema[key].forEach((col) => {
2017-08-02 04:19:38 -04:00
if (filter.source === col.column_name) {
2015-07-08 16:45:13 -04:00
filterCols.unshift(col);
} else if (filter.test(col.column_name)) {
filterCols.push(col);
}
});
if (!isEmpty(filterCols)) {
2015-07-08 16:45:13 -04:00
tables.push({
name: key,
columns: filterCols,
2020-09-04 07:23:11 -04:00
open: haveFilter,
2015-07-08 16:45:13 -04:00
});
}
}
}
return tables;
},
@observes("filter")
triggerFilter() {
discourseDebounce(
this,
function () {
this.set("filteredTables", this.filterTables(this.transformedSchema));
this.set("loading", false);
},
500
);
},
2015-07-08 16:45:13 -04:00
@observes("filter")
setLoading() {
2018-10-10 07:56:23 -04:00
this.set("loading", true);
},
2015-07-08 16:45:13 -04:00
2016-11-24 15:31:05 -05:00
init() {
this._super(...arguments);
2018-10-10 07:56:23 -04:00
this.set("loading", true);
2016-11-24 15:31:05 -05:00
this.triggerFilter();
2020-09-04 07:23:11 -04:00
},
2015-07-08 16:45:13 -04:00
});