perspectives: prefer not circular lookups

This commit is contained in:
Jan Prochazka
2022-08-06 15:30:49 +02:00
parent 137631b5b5
commit aff1fe0b3d
3 changed files with 40 additions and 23 deletions

View File

@@ -75,6 +75,9 @@ export abstract class PerspectiveTreeNode {
get dataField() {
return this.codeName;
}
get tableCode() {
return null;
}
abstract getNodeLoadProps(parentRows: any[]): PerspectiveDataLoadProps;
get isRoot() {
return this.parentNode == null;
@@ -83,6 +86,10 @@ export abstract class PerspectiveTreeNode {
return true;
}
hasTableCode(code: string) {
return code == this.tableCode || this.parentNode?.hasTableCode(code);
}
get uniqueName() {
if (this.parentNode) return `${this.parentNode.uniqueName}.${this.codeName}`;
return this.codeName;
@@ -254,13 +261,10 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
setConfig: ChangePerspectiveConfigFunc,
dataProvider: PerspectiveDataProvider,
databaseConfig: PerspectiveDatabaseConfig,
parentNode: PerspectiveTreeNode,
defaultChecked: boolean
parentNode: PerspectiveTreeNode
) {
super(config, setConfig, parentNode, dataProvider, databaseConfig);
this.defaultChecked = defaultChecked;
this.foreignKey = (table as TableInfo)?.foreignKeys?.find(
fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName
);
@@ -303,6 +307,7 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
}
get icon() {
if (this.isCircular) return 'img circular';
if (this.column.autoIncrement) return 'img autoincrement';
if (this.foreignKey) return 'img foreign-key';
return 'img column';
@@ -332,6 +337,10 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
return getFilterType(this.column.dataType);
}
get isCircular() {
return !!this.parentNode?.parentNode?.hasTableCode(this.tableCode);
}
get childNodes(): PerspectiveTreeNode[] {
if (!this.foreignKey) return [];
const tbl = this?.db?.tables?.find(
@@ -391,6 +400,13 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
}
return null;
}
get tableCode() {
if (this.foreignKey) {
return `${this.foreignKey.refSchemaName}|${this.foreignKey.refTableName}`;
}
return `${this.table.schemaName}|${this.table.pureName}`;
}
}
export class PerspectiveTableNode extends PerspectiveTreeNode {
@@ -457,6 +473,10 @@ export class PerspectiveTableNode extends PerspectiveTreeNode {
database: this.databaseConfig.database,
};
}
get tableCode() {
return `${this.table.schemaName}|${this.table.pureName}`;
}
}
export class PerspectiveViewNode extends PerspectiveTreeNode {
@@ -580,7 +600,6 @@ export class PerspectiveTableReferenceNode extends PerspectiveTableNode {
}
return super.codeName;
}
}
export class PerspectiveCustomJoinTreeNode extends PerspectiveTableNode {
@@ -667,25 +686,17 @@ export function getTableChildPerspectiveNodes(
) {
if (!table) return [];
const defaultColumns = getPerspectiveDefaultColumns(table, db);
const columnNodes = table.columns.map(
col => new PerspectiveTableColumnNode(col, table, db, config, setConfig, dataProvider, databaseConfig, parentColumn)
);
const circularColumns = columnNodes.filter(x => x.isCircular).map(x => x.columnName);
const defaultColumns = getPerspectiveDefaultColumns(table, db, circularColumns);
for (const node of columnNodes) {
node.defaultChecked = defaultColumns.includes(node.columnName);
}
const res = [];
res.push(
...table.columns.map(
col =>
new PerspectiveTableColumnNode(
col,
table,
db,
config,
setConfig,
dataProvider,
databaseConfig,
parentColumn,
defaultColumns.includes(col.columnName)
)
)
);
res.push(...columnNodes);
const dependencies = [];
if (db && (table as TableInfo)?.dependencies) {
for (const fk of (table as TableInfo)?.dependencies) {