Commit 0fa4f6ab authored by Fauzi Fadhillah's avatar Fauzi Fadhillah
Browse files

perf(bulkUpdate): improve performance invalidation when bulk update

parent f1e2debb
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -5,16 +5,22 @@ const helpers_1 = require("../helpers");
const sequelize_cache_1 = require("./sequelize-cache");
const sequelize_typescript_1 = require("sequelize-typescript");
async function invalidateCache(model, options, modelClass) {
    if (sequelize_cache_1.SequelizeCache.showLog) {
        const previousModel = { ...model['dataValues'], ...(0, helpers_1.circularToJSON)(model['_previousDataValues']) };
        sequelize_cache_1.SequelizeCache.logging(previousModel);
    }
    if (options?.transaction) {
        options.transaction.afterCommit(() => {
            invalidationCache(previousModel, modelClass);
            invalidationCache({
                [modelClass['primaryKeyAttribute']]: model['_previousDataValues']?.[modelClass['primaryKeyAttribute']],
            }, modelClass);
        });
        sequelize_cache_1.SequelizeCache.logging('hooks after update transaction');
        return model;
    }
    invalidationCache(previousModel, modelClass);
    invalidationCache({
        [modelClass['primaryKeyAttribute']]: model['_previousDataValues']?.[modelClass['primaryKeyAttribute']],
    }, modelClass);
    sequelize_cache_1.SequelizeCache.logging('hooks after update');
    return model;
}
@@ -43,6 +49,9 @@ function Cache(cacheOptions) {
                    return instance;
                },
                beforeBulkUpdate: async (options) => {
                    if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
                        return;
                    }
                    const { transaction, ...customOptions } = options || { transaction: undefined };
                    target?.['findAll']?.(customOptions).then(async (models) => {
                        await Promise.all((models || []).map(async (model) => {
@@ -51,6 +60,27 @@ function Cache(cacheOptions) {
                            }
                        }));
                    });
                },
                AfterBulkUpdate: async (options) => {
                    const id = options.where?.id;
                    if (!id) {
                        return;
                    }
                    if (Array.isArray(id)) {
                        const ids = [...new Set(id)];
                        Promise.all(ids?.map((i) => {
                            invalidationCache({
                                [target['primaryKeyAttribute']]: i,
                            }, target);
                        }));
                        return;
                    }
                    if (typeof id !== 'object') {
                        invalidationCache({
                            [target['primaryKeyAttribute']]: id,
                        }, target);
                    }
                    return;
                }
            },
        });
+1 −1
Original line number Diff line number Diff line
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sequelize-cache/cache.ts"],"names":[],"mappings":"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"}
 No newline at end of file
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sequelize-cache/cache.ts"],"names":[],"mappings":"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"}
 No newline at end of file
+1 −1

File changed.

Preview size limit exceeded, changes collapsed.

+38 −5
Original line number Diff line number Diff line
import { circularToJSON } from 'helpers';
import { SequelizeCache } from './sequelize-cache';
import { addOptions } from 'sequelize-typescript';
import { addOptions, AfterBulkUpdate } from 'sequelize-typescript';


async function invalidateCache(model, options, modelClass) {
  if (SequelizeCache.showLog) {
    const previousModel = { ...model['dataValues'], ...circularToJSON(model['_previousDataValues']) }

    SequelizeCache.logging(previousModel)
  }

  if (options?.transaction) {
    options.transaction.afterCommit(() => {
      invalidationCache(previousModel, modelClass)
      invalidationCache({
        [modelClass['primaryKeyAttribute']]: model['_previousDataValues']?.[modelClass['primaryKeyAttribute']],
      }, modelClass)
    })
    SequelizeCache.logging('hooks after update transaction')
    return model
  }
  invalidationCache(previousModel, modelClass)
  invalidationCache({
    [modelClass['primaryKeyAttribute']]: model['_previousDataValues']?.[modelClass['primaryKeyAttribute']],
  }, modelClass)
  SequelizeCache.logging('hooks after update')
  return model

@@ -47,6 +53,9 @@ export function Cache(cacheOptions?: { ttl?: number }) {
            return instance
          },
          beforeBulkUpdate: async (options) => {
            if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
              return;
            }
            const { transaction, ...customOptions } = options || { transaction: undefined }
            target?.['findAll']?.(customOptions).then(async (models: any[]) => {
              await Promise.all((models || []).map(async(model) => {
@@ -55,6 +64,30 @@ export function Cache(cacheOptions?: { ttl?: number }) {
                }
              }))
            });
          },
          AfterBulkUpdate: async (options) => {
            const id = options.where?.id;
            if (!id) {
              return;
            }

            if (Array.isArray(id)) {
              const ids = [...new Set(id)];
              Promise.all(ids?.map((i) => {
                invalidationCache({
                  [target['primaryKeyAttribute']]: i,
                }, target)
              }))
              return;
            }

            if (typeof id !== 'object') {
              invalidationCache({
                [target['primaryKeyAttribute']]: id,
              }, target)
            }

            return;
          }
        },
      });