Files
dbgate/packages/sqltree/src/dumpSqlCondition.ts
2021-06-24 11:49:02 +02:00

74 lines
2.1 KiB
TypeScript

import { SqlDumper } from 'dbgate-types';
import { Condition, BinaryCondition } from './types';
import { dumpSqlExpression } from './dumpSqlExpression';
import { link } from 'fs';
import { dumpSqlSelect } from './dumpSqlCommand';
export function dumpSqlCondition(dmp: SqlDumper, condition: Condition) {
switch (condition.conditionType) {
case 'binary':
dumpSqlExpression(dmp, condition.left);
dmp.put(' %s ', condition.operator);
dumpSqlExpression(dmp, condition.right);
break;
case 'isNull':
dumpSqlExpression(dmp, condition.expr);
dmp.put(' ^is ^null');
break;
case 'isNotNull':
dumpSqlExpression(dmp, condition.expr);
dmp.put(' ^is ^not ^null');
break;
case 'isEmpty':
dmp.put('^trim(');
dumpSqlExpression(dmp, condition.expr);
dmp.put(") = ''");
break;
case 'isNotEmpty':
dmp.put('^trim(');
dumpSqlExpression(dmp, condition.expr);
dmp.put(") <> ''");
break;
case 'and':
case 'or':
dmp.putCollection(` ^${condition.conditionType} `, condition.conditions, cond => {
dmp.putRaw('(');
dumpSqlCondition(dmp, cond);
dmp.putRaw(')');
});
break;
case 'like':
dumpSqlExpression(dmp, condition.left);
dmp.put(dmp.dialect.ilike ? ' ^ilike ' : ' ^like ');
dumpSqlExpression(dmp, condition.right);
break;
case 'notLike':
dumpSqlExpression(dmp, condition.left);
dmp.put(' ^not ^like ');
dumpSqlExpression(dmp, condition.right);
break;
case 'not':
dmp.put('^not (');
dumpSqlCondition(dmp, condition.condition);
dmp.put(')');
break;
case 'exists':
dmp.put('^exists (');
dumpSqlSelect(dmp, condition.subQuery);
dmp.put(')');
break;
case 'notExists':
dmp.put('^not ^exists (');
dumpSqlSelect(dmp, condition.subQuery);
dmp.put(')');
break;
case 'between':
dumpSqlExpression(dmp, condition.expr);
dmp.put(' ^between ');
dumpSqlExpression(dmp, condition.left);
dmp.put(' ^and ');
dumpSqlExpression(dmp, condition.right);
break;
}
}