From 9a4f53bca4d07dc4d56d8a47ceba2d2e4c1138ec Mon Sep 17 00:00:00 2001 From: "Xc@centOs" Date: Thu, 30 Mar 2023 20:29:58 +0800 Subject: [PATCH] removePhysically --- lib/MySQL/translator.js | 14 +++++++++++ lib/sqlTranslator.d.ts | 1 + lib/sqlTranslator.js | 5 ++++ src/MySQL/translator.ts | 51 ++++++++++++++++++++++++++--------------- src/sqlTranslator.ts | 6 +++++ 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/MySQL/translator.js b/lib/MySQL/translator.js index 62f6b70..72398e1 100644 --- a/lib/MySQL/translator.js +++ b/lib/MySQL/translator.js @@ -625,6 +625,20 @@ var MySqlTranslator = /** @class */ (function (_super) { MySqlTranslator.prototype.populateRemoveStmt = function (removeText, fromText, aliasDict, filterText, sorterText, indexFrom, count, option) { // todo using index var alias = aliasDict['./']; + if (option === null || option === void 0 ? void 0 : option.deletePhysically) { + var sql_1 = "delete from ".concat(fromText, " "); + if (filterText) { + sql_1 += " where ".concat(filterText); + } + if (sorterText) { + sql_1 += " order by ".concat(sorterText); + } + if (typeof indexFrom === 'number') { + (0, assert_1.default)(typeof count === 'number'); + sql_1 += " limit ".concat(indexFrom, ", ").concat(count); + } + return sql_1; + } var now = Date.now(); var sql = "update ".concat(fromText, " set `").concat(alias, "`.`$$deleteAt$$` = '").concat(now, "'"); if (filterText) { diff --git a/lib/sqlTranslator.d.ts b/lib/sqlTranslator.d.ts index cb46962..bc57d46 100644 --- a/lib/sqlTranslator.d.ts +++ b/lib/sqlTranslator.d.ts @@ -43,6 +43,7 @@ export declare abstract class SqlTranslator { private translateProjection; private translateSelectInner; translateSelect(entity: T, selection: ED[T]['Selection'], option?: OP): string; + translateWhere(entity: T, selection: ED[T]['Selection'], option?: OP): string; translateAggregate(entity: T, aggregation: ED[T]['Aggregation'], option?: OP): string; translateCount(entity: T, selection: Pick, option?: OP): string; translateRemove(entity: T, operation: ED[T]['Remove'], option?: OP): string; diff --git a/lib/sqlTranslator.js b/lib/sqlTranslator.js index 2c81af5..c5610f3 100644 --- a/lib/sqlTranslator.js +++ b/lib/sqlTranslator.js @@ -776,12 +776,17 @@ var SqlTranslator = /** @class */ (function () { return { stmt: this.populateSelectStmt(projText, fromText, aliasDict, filterText, sorterText, undefined, indexFrom, count, option, selection), currentNumber: currentNumber2, + filterStmt: filterText, }; }; SqlTranslator.prototype.translateSelect = function (entity, selection, option) { var stmt = this.translateSelectInner(entity, selection, 1, {}, option).stmt; return stmt; }; + SqlTranslator.prototype.translateWhere = function (entity, selection, option) { + var filterStmt = this.translateSelectInner(entity, selection, 1, {}, option).filterStmt; + return filterStmt; + }; SqlTranslator.prototype.translateAggregate = function (entity, aggregation, option) { var data = aggregation.data, filter = aggregation.filter, sorter = aggregation.sorter, indexFrom = aggregation.indexFrom, count = aggregation.count; var _a = this.analyzeJoin(entity, { diff --git a/src/MySQL/translator.ts b/src/MySQL/translator.ts index 720cc9b..1ec93bf 100644 --- a/src/MySQL/translator.ts +++ b/src/MySQL/translator.ts @@ -296,7 +296,7 @@ export class MySqlTranslator extends SqlTranslator { }; maxAliasLength = 63; - private populateDataTypeDef(type: DataType | Ref, params?: DataTypeParams, enumeration?: string[]): string{ + private populateDataTypeDef(type: DataType | Ref, params?: DataTypeParams, enumeration?: string[]): string { if (['date', 'datetime', 'time', 'sequence'].includes(type)) { return 'bigint '; } @@ -348,7 +348,7 @@ export class MySqlTranslator extends SqlTranslator { if (MySqlTranslator.withWidthDataTypes.includes(type as DataType)) { assert(type === 'int'); const { width } = params!; - switch(width!) { + switch (width!) { case 1: { return 'tinyint'; } @@ -371,13 +371,13 @@ export class MySqlTranslator extends SqlTranslator { } protected translateAttrProjection(dataType: DataType, alias: string, attr: string): string { - switch(dataType) { + switch (dataType) { case 'geometry': { return ` st_astext(\`${alias}\`.\`${attr}\`)`; } - default:{ + default: { return ` \`${alias}\`.\`${attr}\``; - } + } } } @@ -481,7 +481,7 @@ export class MySqlTranslator extends SqlTranslator { throw new Error(`「${entity as string}」只能有一个sequence列`); } hasSequence = sequenceStart; - sql += ' auto_increment unique '; + sql += ' auto_increment unique '; } if (defaultValue !== undefined) { assert(type !== 'ref'); @@ -550,13 +550,13 @@ export class MySqlTranslator extends SqlTranslator { ); } } - - + + sql += ')'; if (typeof hasSequence === 'number') { sql += `auto_increment = ${hasSequence}`; } - + if (!replace) { return [sql]; } @@ -564,7 +564,7 @@ export class MySqlTranslator extends SqlTranslator { } private translateFnName(fnName: string, argumentNumber: number): string { - switch(fnName) { + switch (fnName) { case '$add': { let result = '%s'; while (--argumentNumber > 0) { @@ -647,7 +647,7 @@ export class MySqlTranslator extends SqlTranslator { } case '$and': { let result = ''; - for (let iter = 0; iter < argumentNumber; iter ++) { + for (let iter = 0; iter < argumentNumber; iter++) { result += '%s'; if (iter < argumentNumber - 1) { result += ' and '; @@ -657,7 +657,7 @@ export class MySqlTranslator extends SqlTranslator { } case '$or': { let result = ''; - for (let iter = 0; iter < argumentNumber; iter ++) { + for (let iter = 0; iter < argumentNumber; iter++) { result += '%s'; if (iter < argumentNumber - 1) { result += ' or '; @@ -751,13 +751,13 @@ export class MySqlTranslator extends SqlTranslator { else if (k.includes('#refId')) { const refId = (expr)['#refId']; const refAttr = (expr)['#refAttr']; - + assert(refDict[refId]); const attrText = `\`${refDict[refId][0]}\`.\`${refAttr}\``; result = this.translateAttrInExpression(entity, (expr)['#refAttr'], attrText); } else { - assert (k.length === 1); + assert(k.length === 1); if ((expr)[k[0]] instanceof Array) { const fnName = this.translateFnName(k[0], (expr)[k[0]].length); const args = [fnName]; @@ -792,7 +792,7 @@ export class MySqlTranslator extends SqlTranslator { }; return translateInner(expression); - } + } protected populateSelectStmt( projectionText: string, @@ -816,7 +816,7 @@ export class MySqlTranslator extends SqlTranslator { sql += ` group by ${groupByText}`; } if (typeof indexFrom === 'number') { - assert (typeof count === 'number'); + assert(typeof count === 'number'); sql += ` limit ${indexFrom}, ${count}`; } if (option?.forUpdate) { @@ -836,7 +836,7 @@ export class MySqlTranslator extends SqlTranslator { sql += ` order by ${sorterText}`; } if (typeof indexFrom === 'number') { - assert (typeof count === 'number'); + assert(typeof count === 'number'); sql += ` limit ${indexFrom}, ${count}`; } @@ -845,6 +845,21 @@ export class MySqlTranslator extends SqlTranslator { protected populateRemoveStmt(removeText: string, fromText: string, aliasDict: Record, filterText: string, sorterText?: string, indexFrom?: number, count?: number, option?: MysqlOperateOption): string { // todo using index const alias = aliasDict['./']; + if (option?.deletePhysically) { + let sql = `delete from ${fromText} `; + if (filterText) { + sql += ` where ${filterText}`; + } + if (sorterText) { + sql += ` order by ${sorterText}`; + } + if (typeof indexFrom === 'number') { + assert(typeof count === 'number'); + sql += ` limit ${indexFrom}, ${count}`; + } + + return sql; + } const now = Date.now(); let sql = `update ${fromText} set \`${alias}\`.\`$$deleteAt$$\` = '${now}'`; if (filterText) { @@ -854,7 +869,7 @@ export class MySqlTranslator extends SqlTranslator { sql += ` order by ${sorterText}`; } if (typeof indexFrom === 'number') { - assert (typeof count === 'number'); + assert(typeof count === 'number'); sql += ` limit ${indexFrom}, ${count}`; } diff --git a/src/sqlTranslator.ts b/src/sqlTranslator.ts index 2d96b48..52b5f02 100644 --- a/src/sqlTranslator.ts +++ b/src/sqlTranslator.ts @@ -934,6 +934,7 @@ export abstract class SqlTranslator { } private translateSelectInner(entity: T, selection: ED[T]['Selection'], initialNumber: number, refAlias: Record, option?: OP): { + filterStmt: string; stmt: string; currentNumber: number; } { @@ -955,6 +956,7 @@ export abstract class SqlTranslator { return { stmt: this.populateSelectStmt(projText, fromText, aliasDict, filterText, sorterText, undefined, indexFrom, count, option, selection), currentNumber: currentNumber2, + filterStmt: filterText, }; } @@ -963,6 +965,10 @@ export abstract class SqlTranslator { return stmt; } + translateWhere(entity: T, selection: ED[T]['Selection'], option?: OP): string { + const { filterStmt } = this.translateSelectInner(entity, selection, 1, {}, option); + return filterStmt; + } translateAggregate(entity: T, aggregation: ED[T]['Aggregation'], option?: OP): string { const { data, filter, sorter, indexFrom, count } = aggregation;