chore: patch sequelize query generator

This commit is contained in:
Chareice 2024-09-17 21:43:58 +08:00
parent 8bbf6bc65b
commit 63be6f65f5
No known key found for this signature in database
3 changed files with 42 additions and 10 deletions

View File

@ -81,7 +81,7 @@ import {
UpdateWithAssociationsListener,
ValidateListener,
} from './types';
import { patchSequelizeQueryInterface, snakeCase } from './utils';
import { patchSequelizeQueryGenerator, patchSequelizeQueryInterface, snakeCase } from './utils';
import { BaseValueParser, registerFieldValueParsers } from './value-parsers';
import { ViewCollection } from './view-collection';
@ -327,6 +327,7 @@ export class Database extends EventEmitter implements AsyncEmitter {
this.initListener();
patchSequelizeQueryInterface(this);
patchSequelizeQueryGenerator(this);
this.registerCollectionType();
}

View File

@ -205,17 +205,9 @@ export class OptionsParser {
exclude: [],
}; // out put all fields by default
if (this.collection.isParent()) {
OptionsParser.appendInheritInspectAttribute(attributes.include, this.collection);
}
if (this.options?.fields) {
attributes = [];
if (this.collection.isParent()) {
OptionsParser.appendInheritInspectAttribute(attributes, this.collection);
}
// 将fields拆分为 attributes 和 appends
for (const field of this.options.fields) {
if (this.isAssociationPath(field)) {
@ -242,11 +234,24 @@ export class OptionsParser {
}
return {
attributes,
attributes: this.handleRawAttributes(attributes),
...this.parseExcept(except, this.parseAppends(appends, filterParams)),
};
}
protected handleRawAttributes(attributes) {
if (this.collection.isParent()) {
OptionsParser.appendInheritInspectAttribute(
attributes.include ? attributes.include : attributes,
this.collection,
);
}
this.collection.emit('beforeParseAttributes', attributes);
return attributes;
}
protected parseExcept(except: Except, filterParams: any) {
if (!except) return filterParams;
const setExcept = (queryParams: any, except: string) => {

View File

@ -100,6 +100,32 @@ export function patchSequelizeQueryInterface(db: Database) {
}
}
export function patchSequelizeQueryGenerator(db: Database) {
// @ts-ignore
const oldSelectQuery = db.sequelize.dialect.queryGenerator.selectQuery;
// add hook after selectQuery called
// @ts-ignore
db.sequelize.dialect.queryGenerator.selectQuery = function (...args) {
const result = oldSelectQuery.apply(this, args);
const model = args[2];
const collection = db.modelCollection.get(model);
if (collection) {
const eventArgs = {
sql: result,
collection,
};
collection.emit(`selectQuery`, eventArgs);
return eventArgs.sql;
}
return result;
};
}
export function percent2float(value: string) {
if (!value.endsWith('%')) {
return NaN;