mirror of
https://github.com/dbgate/dbgate
synced 2024-11-15 00:06:30 +00:00
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import _ from 'lodash';
|
|
import { dumpSqlSelect, Select, JoinType, Condition, Relation, mergeConditions, Source } from 'dbgate-sqltree';
|
|
import { EngineDriver } from 'dbgate-types';
|
|
import { DesignerInfo, DesignerTableInfo, DesignerReferenceInfo, DesignerJoinType } from './types';
|
|
import { findPrimaryTable, findConnectingReference, referenceIsJoin, referenceIsExists } from './designerTools';
|
|
|
|
export class DesignerComponent {
|
|
subComponents: DesignerComponent[] = [];
|
|
parentComponent: DesignerComponent;
|
|
parentReference: DesignerReferenceInfo;
|
|
|
|
tables: DesignerTableInfo[] = [];
|
|
nonPrimaryReferences: DesignerReferenceInfo[] = [];
|
|
|
|
get primaryTable() {
|
|
return this.tables[0];
|
|
}
|
|
get nonPrimaryTables() {
|
|
return this.tables.slice(1);
|
|
}
|
|
get nonPrimaryTablesAndReferences() {
|
|
return _.zip(this.nonPrimaryTables, this.nonPrimaryReferences);
|
|
}
|
|
get myAndParentTables() {
|
|
return [...this.parentTables, ...this.tables];
|
|
}
|
|
get parentTables() {
|
|
return this.parentComponent ? this.parentComponent.myAndParentTables : [];
|
|
}
|
|
get thisAndSubComponentsTables() {
|
|
return [...this.tables, ..._.flatten(this.subComponents.map(x => x.thisAndSubComponentsTables))];
|
|
}
|
|
}
|
|
|
|
export class DesignerComponentCreator {
|
|
toAdd: DesignerTableInfo[];
|
|
components: DesignerComponent[] = [];
|
|
|
|
constructor(public designer: DesignerInfo) {
|
|
this.toAdd = [...designer.tables];
|
|
while (this.toAdd.length > 0) {
|
|
const component = this.parseComponent(null);
|
|
this.components.push(component);
|
|
}
|
|
}
|
|
|
|
parseComponent(root) {
|
|
if (root == null) {
|
|
root = findPrimaryTable(this.toAdd);
|
|
}
|
|
if (!root) return null;
|
|
_.remove(this.toAdd, x => x == root);
|
|
const res = new DesignerComponent();
|
|
res.tables.push(root);
|
|
|
|
for (;;) {
|
|
let found = false;
|
|
for (const test of this.toAdd) {
|
|
const ref = findConnectingReference(this.designer, res.tables, [test], referenceIsJoin);
|
|
if (ref) {
|
|
res.tables.push(test);
|
|
res.nonPrimaryReferences.push(ref);
|
|
_.remove(this.toAdd, x => x == test);
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) break;
|
|
}
|
|
|
|
for (;;) {
|
|
let found = false;
|
|
for (const test of this.toAdd) {
|
|
const ref = findConnectingReference(this.designer, res.tables, [test], referenceIsExists);
|
|
if (ref) {
|
|
const subComponent = this.parseComponent(test);
|
|
res.subComponents.push(subComponent);
|
|
subComponent.parentComponent = res;
|
|
subComponent.parentReference = ref;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) break;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
}
|