Files
dbgate/packages/sqltree/src/dumpSqlSource.ts
2020-03-05 15:04:06 +01:00

56 lines
1.5 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', this.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) {
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));
}