From 31f439597e17dfc1e07327900a2e132ee6f7437d Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Tue, 28 Mar 2023 10:43:03 -0400 Subject: [PATCH] cache sort name function --- data/config.cemetery.ssm.js | 58 ++++++++++++++++++------------- data/config.cemetery.ssm.ts | 69 ++++++++++++++++++++++--------------- 2 files changed, 76 insertions(+), 51 deletions(-) diff --git a/data/config.cemetery.ssm.js b/data/config.cemetery.ssm.js index 0707bfdb..7420457d 100644 --- a/data/config.cemetery.ssm.js +++ b/data/config.cemetery.ssm.js @@ -1,3 +1,4 @@ +import NodeCache from 'node-cache'; import { config as cemeteryConfig } from './config.cemetery.ontario.js'; export const config = Object.assign({}, cemeteryConfig); config.aliases.occupancyStartDate = 'Purchase Date'; @@ -7,36 +8,45 @@ config.settings.lot.lotNamePattern = config.settings.lot.lotNameHelpText = `Two digit cemetery-Block-Range-Lot-Grave, Interment number\n ex. XX-BA-R41-L15-G3A, Interment 1`; const numericPadding = '00000'; +const lotNameSortNameCache = new NodeCache({ + stdTTL: 5 * 60, + useClones: false +}); export function lotNameSortNameFunction(lotName) { - try { - const lotNameSplit = lotName.toUpperCase().split('-'); - const cleanLotNamePieces = []; - for (let lotNamePiece of lotNameSplit) { - if (cleanLotNamePieces.length === 0) { - cleanLotNamePieces.push(lotNamePiece); - continue; - } - let numericPiece = numericPadding; - let letterPiece = ''; - const firstLetter = lotNamePiece.charAt(0); - lotNamePiece = lotNamePiece.slice(1); - for (const letter of lotNamePiece) { - if (letterPiece === '' && '0123456789'.includes(letter)) { - numericPiece += letter; + let sortName = lotNameSortNameCache.get(lotName) ?? ''; + if (sortName === '') { + try { + const lotNameSplit = lotName.toUpperCase().split('-'); + const cleanLotNamePieces = []; + for (let lotNamePiece of lotNameSplit) { + if (cleanLotNamePieces.length === 0) { + cleanLotNamePieces.push(lotNamePiece); + continue; } - else { - letterPiece += letter; + let numericPiece = numericPadding; + let letterPiece = ''; + const firstLetter = lotNamePiece.charAt(0); + lotNamePiece = lotNamePiece.slice(1); + for (const letter of lotNamePiece) { + if (letterPiece === '' && '0123456789'.includes(letter)) { + numericPiece += letter; + } + else { + letterPiece += letter; + } } + cleanLotNamePieces.push(firstLetter + + numericPiece.slice(-1 * numericPadding.length) + + letterPiece); } - cleanLotNamePieces.push(firstLetter + - numericPiece.slice(-1 * numericPadding.length) + - letterPiece); + sortName = cleanLotNamePieces.join('-'); } - return cleanLotNamePieces.join('-'); - } - catch { - return lotName; + catch { + sortName = lotName; + } + lotNameSortNameCache.set(lotName, sortName); } + return sortName; } config.settings.lot.lotNameSortNameFunction = lotNameSortNameFunction; config.settings.lotOccupancy.occupantCityDefault = 'Sault Ste. Marie'; diff --git a/data/config.cemetery.ssm.ts b/data/config.cemetery.ssm.ts index 2d29d1c0..bb406830 100644 --- a/data/config.cemetery.ssm.ts +++ b/data/config.cemetery.ssm.ts @@ -1,3 +1,5 @@ +import NodeCache from 'node-cache' + import { config as cemeteryConfig } from './config.cemetery.ontario.js' export const config = Object.assign({}, cemeteryConfig) @@ -13,43 +15,56 @@ config.settings.lot.lotNameHelpText = `Two digit cemetery-Block-Range-Lot-Grave, const numericPadding = '00000' +const lotNameSortNameCache = new NodeCache({ + stdTTL: 5 * 60, + useClones: false +}) + export function lotNameSortNameFunction(lotName: string): string { - try { - const lotNameSplit = lotName.toUpperCase().split('-') + let sortName: string = lotNameSortNameCache.get(lotName) ?? '' - const cleanLotNamePieces: string[] = [] + if (sortName === '') { + try { + const lotNameSplit = lotName.toUpperCase().split('-') - for (let lotNamePiece of lotNameSplit) { - if (cleanLotNamePieces.length === 0) { - cleanLotNamePieces.push(lotNamePiece) - continue - } + const cleanLotNamePieces: string[] = [] - let numericPiece = numericPadding - let letterPiece = '' - - const firstLetter = lotNamePiece.charAt(0) - lotNamePiece = lotNamePiece.slice(1) - - for (const letter of lotNamePiece) { - if (letterPiece === '' && '0123456789'.includes(letter)) { - numericPiece += letter - } else { - letterPiece += letter + for (let lotNamePiece of lotNameSplit) { + if (cleanLotNamePieces.length === 0) { + cleanLotNamePieces.push(lotNamePiece) + continue } + + let numericPiece = numericPadding + let letterPiece = '' + + const firstLetter = lotNamePiece.charAt(0) + lotNamePiece = lotNamePiece.slice(1) + + for (const letter of lotNamePiece) { + if (letterPiece === '' && '0123456789'.includes(letter)) { + numericPiece += letter + } else { + letterPiece += letter + } + } + + cleanLotNamePieces.push( + firstLetter + + numericPiece.slice(-1 * numericPadding.length) + + letterPiece + ) } - cleanLotNamePieces.push( - firstLetter + - numericPiece.slice(-1 * numericPadding.length) + - letterPiece - ) + sortName = cleanLotNamePieces.join('-') + } catch { + sortName = lotName } - return cleanLotNamePieces.join('-') - } catch { - return lotName + lotNameSortNameCache.set(lotName, sortName) } + + return sortName } config.settings.lot.lotNameSortNameFunction = lotNameSortNameFunction