Files
dbgate/packages/sqltree/src/dumpSqlCondition.ts
2024-08-20 13:30:53 +02:00

94 lines
2.7 KiB
TypeScript

import type { SqlDumper } from 'dbgate-types';
import { Condition, BinaryCondition } from './types';
import { dumpSqlExpression } from './dumpSqlExpression';
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;
case 'expression':
dumpSqlExpression(dmp, condition.expr);
break;
case 'in':
dumpSqlExpression(dmp, condition.expr);
dmp.put(' ^in (%,v)', condition.values);
break;
case 'notIn':
dumpSqlExpression(dmp, condition.expr);
dmp.put(' ^not ^in (%,v)', condition.values);
break;
case 'rawTemplate':
let was = false;
for (const item of condition.templateSql.split('$$')) {
if (was) {
dumpSqlExpression(dmp, condition.expr);
}
dmp.putRaw(item);
was = true;
}
break;
}
}