mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-18 04:26:01 +00:00
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { Source, FromDefinition, Relation } from './types';
|
|
import { SqlDumper } from 'dbgate-types';
|
|
import { dumpSqlSelect } from './dumpSqlCommand';
|
|
import { dumpSqlCondition } from './dumpSqlCondition';
|
|
|
|
export function dumpSqlSourceDef(dmp: SqlDumper, source: Source) {
|
|
let sources = 0;
|
|
if (source.name != null) sources++;
|
|
if (source.subQuery != null) sources++;
|
|
if (source.subQueryString != null) sources++;
|
|
if (sources != 1) throw new Error('sqltree.Source should have exactly one source');
|
|
|
|
if (source.name != null) {
|
|
dmp.put('%f', source.name);
|
|
}
|
|
if (source.subQuery) {
|
|
dmp.put('(');
|
|
dumpSqlSelect(dmp, source.subQuery);
|
|
dmp.put(')');
|
|
}
|
|
if (source.subQueryString) {
|
|
dmp.put('(');
|
|
dmp.putRaw(source.subQueryString);
|
|
dmp.put(')');
|
|
}
|
|
if (source.alias) {
|
|
dmp.put(' %i', source.alias);
|
|
}
|
|
}
|
|
|
|
export function dumpSqlSourceRef(dmp: SqlDumper, source: Source) {
|
|
if (source.alias) {
|
|
dmp.put('%i', source.alias);
|
|
return true;
|
|
} else if (source.name) {
|
|
dmp.put('%f', source.name);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function dumpSqlRelation(dmp: SqlDumper, from: Relation) {
|
|
dmp.put('&n %k ', from.joinType);
|
|
dumpSqlSourceDef(dmp, from);
|
|
if (from.conditions && from.conditions.length > 0) {
|
|
dmp.put(' ^on ');
|
|
dmp.putCollection(' ^and ', from.conditions, cond => dumpSqlCondition(dmp, cond));
|
|
}
|
|
}
|
|
|
|
export function dumpSqlFromDefinition(dmp: SqlDumper, from: FromDefinition) {
|
|
dumpSqlSourceDef(dmp, from);
|
|
dmp.put(' ');
|
|
if (from.relations) from.relations.forEach(rel => dumpSqlRelation(dmp, rel));
|
|
}
|