refactoring
This commit is contained in:
parent
28f7e48dc6
commit
65addc8206
|
@ -52,7 +52,7 @@ export default abstract class Chart<T extends Record<string, any>> {
|
||||||
private static readonly columnDot = '_';
|
private static readonly columnDot = '_';
|
||||||
|
|
||||||
private name: string;
|
private name: string;
|
||||||
private queue: {
|
private buffer: {
|
||||||
diff: DeepPartial<T>;
|
diff: DeepPartial<T>;
|
||||||
group: string | null;
|
group: string | null;
|
||||||
}[] = [];
|
}[] = [];
|
||||||
|
@ -330,28 +330,28 @@ export default abstract class Chart<T extends Record<string, any>> {
|
||||||
|
|
||||||
@autobind
|
@autobind
|
||||||
protected commit(diff: DeepPartial<T>, group: string | null = null): void {
|
protected commit(diff: DeepPartial<T>, group: string | null = null): void {
|
||||||
this.queue.push({
|
this.buffer.push({
|
||||||
diff, group,
|
diff, group,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@autobind
|
@autobind
|
||||||
public async save() {
|
public async save() {
|
||||||
if (this.queue.length === 0) {
|
if (this.buffer.length === 0) {
|
||||||
logger.info(`${this.name}: Write skipped`);
|
logger.info(`${this.name}: Write skipped`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 前の時間のログがqueueにあった場合のハンドリング
|
// TODO: 前の時間のログがbufferにあった場合のハンドリング
|
||||||
// 例えば、save が20分ごとに行われるとして、前回行われたのは 01:50 だったとする。
|
// 例えば、save が20分ごとに行われるとして、前回行われたのは 01:50 だったとする。
|
||||||
// 次に save が行われるのは 02:10 ということになるが、もし 01:55 に新規ログが queue に追加されたとすると、
|
// 次に save が行われるのは 02:10 ということになるが、もし 01:55 に新規ログが buffer に追加されたとすると、
|
||||||
// そのログは本来は 01:00~ のログとしてDBに保存されて欲しいのに、02:00~ のログ扱いになってしまう。
|
// そのログは本来は 01:00~ のログとしてDBに保存されて欲しいのに、02:00~ のログ扱いになってしまう。
|
||||||
// これを回避するための実装は複雑になりそうなため、一旦保留。
|
// これを回避するための実装は複雑になりそうなため、一旦保留。
|
||||||
|
|
||||||
const update = async (log: Log) => {
|
const update = async (log: Log) => {
|
||||||
const finalDiffs = {} as Record<string, number | unknown[]>;
|
const finalDiffs = {} as Record<string, number | unknown[]>;
|
||||||
|
|
||||||
for (const diff of this.queue.filter(q => q.group === log.group).map(q => q.diff)) {
|
for (const diff of this.buffer.filter(q => q.group === log.group).map(q => q.diff)) {
|
||||||
const columns = Chart.convertObjectToFlattenColumns(diff);
|
const columns = Chart.convertObjectToFlattenColumns(diff);
|
||||||
|
|
||||||
for (const [k, v] of Object.entries(columns)) {
|
for (const [k, v] of Object.entries(columns)) {
|
||||||
|
@ -378,11 +378,11 @@ export default abstract class Chart<T extends Record<string, any>> {
|
||||||
|
|
||||||
logger.info(`${this.name + (log.group ? `:${log.group}` : '')}: Updated`);
|
logger.info(`${this.name + (log.group ? `:${log.group}` : '')}: Updated`);
|
||||||
|
|
||||||
// TODO: この一連の処理が始まった後に新たにqueueに入ったものは消さないようにする
|
// TODO: この一連の処理が始まった後に新たにbufferに入ったものは消さないようにする
|
||||||
this.queue = this.queue.filter(q => q.group !== log.group);
|
this.buffer = this.buffer.filter(q => q.group !== log.group);
|
||||||
};
|
};
|
||||||
|
|
||||||
const groups = removeDuplicates(this.queue.map(log => log.group));
|
const groups = removeDuplicates(this.buffer.map(log => log.group));
|
||||||
|
|
||||||
await Promise.all(groups.map(group => this.getCurrentLog(group).then(log => update(log))));
|
await Promise.all(groups.map(group => this.getCurrentLog(group).then(log => update(log))));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue