diff --git a/packages/struct/integer-buffer-set/src/index.ts b/packages/struct/integer-buffer-set/src/index.ts index b4c68253..81f61e6f 100644 --- a/packages/struct/integer-buffer-set/src/index.ts +++ b/packages/struct/integer-buffer-set/src/index.ts @@ -229,15 +229,17 @@ class IntegerBufferSet { let position, indexMeta; // if (this._name === 'normal_goods') - // console.log( - // 'getPosition ', - // newIndex, - // !this.isBufferFull, - // this._isOnTheFlyFull, - // this._onTheFlyIndices.slice(), - // this._indexToMetaMap.get(newIndex), - // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex)) - // ); + console.log( + 'getPosition ', + newIndex, + meta, + metaPosition, + !this.isBufferFull, + this._isOnTheFlyFull, + this._onTheFlyIndices.slice(), + this._indexToMetaMap.get(newIndex), + this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex)) + ); if (metaPosition !== undefined) { position = this.commitPosition({ @@ -249,12 +251,21 @@ class IntegerBufferSet { } else if (!this.isBufferFull) { /** placed on new buffered position */ position = this.getNewPositionForIndex(newIndex); + // if (this._name === 'normal_goods') { + console.log('create new position ', newIndex, position); + // } } else if (this._isOnTheFlyFull) { position = this.getFliedPosition(newIndex, safeRange); } else if ( (indexMeta = this._indexToMetaMap.get(newIndex)) && + // (this._metaToPositionMap.get(indexMeta) != null) this._metaToPositionMap.get(indexMeta) ) { + // console.log('commeit ---') + // if (this._name === 'normal_goods') { + console.log('_metaToPositionMap ', newIndex, indexMeta); + // console.log('_metaToPositionMap ', newIndex, indexMeta, this._positionToMetaList.slice()) + // } /** Index has already been stored, but we cant use its old position directly... 1:index -> meta, meta may be reused later @@ -269,6 +280,15 @@ class IntegerBufferSet { } else { this._cleanHeaps(); // console.log('commeit ---') + // if (this._name === 'normal_goods') { + console.log( + 'after clean position ', + newIndex, + this._positionToMetaList.slice(), + this._smallValues.empty(), + this._largeValues.empty() + ); + // } position = this.commitPosition({ newIndex, meta, @@ -318,6 +338,13 @@ class IntegerBufferSet { } ) { if (this._largeValues.empty() || this._smallValues.empty()) { + console.log( + 'replaceFurthestIndexPosition ', + newIndex, + this._largeValues.empty(), + this._smallValues.empty() + ); + return this._isOnTheFlyFullReturnHook( this.getNewPositionForIndex(newIndex) ); @@ -354,6 +381,14 @@ class IntegerBufferSet { } const { startIndex: lowValue, endIndex: highValue } = safeRange; + console.log( + 'replaceFurthestIndexPosition pop ', + newIndex, + maxValue, + isClamped(lowValue, minValue, highValue), + this._largeValues.empty(), + this._smallValues.empty() + ); // All values currently stored are necessary, we can't reuse any of them. if ( @@ -399,12 +434,14 @@ class IntegerBufferSet { indices[idx] = targetIndex; } - // console.log( - // 'indices ', - // this._positionToMetaList, - // this._onTheFlyIndices.slice(), - // indices - // ); + if (this._name === 'normal_goods') { + console.log( + 'indices ', + this._positionToMetaList.slice(), + this._onTheFlyIndices.slice(), + indices + ); + } const _arr = new Array(indices.length); const _available = []; @@ -435,13 +472,17 @@ class IntegerBufferSet { this._indexToMetaMap = indexToMetaMap; this.replaceMetaToIndexMap(metaToIndexMap); + console.log('shuff ===='); + for (let position = 0; position < indices.length; position++) { if (_arr[position] != null) { positionToMetaList[position] = _arr[position]; + console.log('shufft==== ', position); continue; } const meta = _available.shift(); if (meta != null) { + console.log('postion ====', position, meta); positionToMetaList[position] = meta; } } @@ -455,6 +496,16 @@ class IntegerBufferSet { getIndices() { const { smallValues, largeValues } = this.initialize(); + console.log( + 'get indices ', + this._positionToMetaList.slice(), + this._onTheFlyIndices.slice() + ); + + if (this._name === 'normal_goods') { + console.log('get indices ', this._positionToMetaList.slice()); + } + try { const indices = new Array(this._positionToMetaList.length); const metaToPositionMap = new Map(); @@ -465,6 +516,7 @@ class IntegerBufferSet { this._onTheFlyIndices[idx] || this._positionToMetaList[idx]; const targetIndex = this.getMetaIndex(meta); // which means source data has changed. such as one element has been deleted + // only use `this._positionToMetaList[idx]` may has a conflict. if ( !this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex) @@ -545,8 +597,12 @@ class IntegerBufferSet { newIndex, safeRange ); + + console.log('positionToReplace ', positionToReplace); } } + + console.log('postion ', newIndex, positionToReplace); return positionToReplace; } @@ -575,6 +631,11 @@ class IntegerBufferSet { prepare() { if (this._loopMS === this._lastUpdatedMS) return; this._loopMS = this._lastUpdatedMS; + if (this._name === 'normal_goods') { + console.log('prepare ', this._positionToMetaList.slice()); + } + + console.log('prepare ', this._positionToMetaList.slice()); this._onTheFlyIndices = []; this._isOnTheFlyFull = false; @@ -625,6 +686,8 @@ class IntegerBufferSet { smallValues.push(element); largeValues.push(element); if (value > thresholdNumber) { + if (this._name === 'normal_goods') + console.log('recreate ', value, position); // @ts-ignore this._setMetaPosition(value, position); // @ts-ignore @@ -632,8 +695,6 @@ class IntegerBufferSet { } } - this._largeValues.peek().value; - this._smallValues = smallValues; this._largeValues = largeValues; } diff --git a/packages/struct/integer-buffer-set/test/test.spec.ts b/packages/struct/integer-buffer-set/test/test.spec.ts index 97d6d9ef..3f111d0d 100644 --- a/packages/struct/integer-buffer-set/test/test.spec.ts +++ b/packages/struct/integer-buffer-set/test/test.spec.ts @@ -7,6 +7,7 @@ import { resetStartIndex, } from './data'; import { discreteSuite, basicSuite } from './basic'; +import { testUseCase } from './usecase'; const data = { values: [] as Array, @@ -86,3 +87,20 @@ discreteDeleteSuite('simple', data, { }, }, }); + +testUseCase('simple', data, { + hooks: { + beforeEach: () => { + resetStartIndex(); + data.values = buildDiscreteData(100); + console.log('hell0000'); + }, + }, + data: { + delete: (index) => data.values.splice(index, 1), + replace: () => (data.values = buildDiscreteData(100)), + append: (count) => { + data.values = data.values.concat(buildDiscreteData(count)); + }, + }, +}); diff --git a/packages/struct/integer-buffer-set/test/usecase.ts b/packages/struct/integer-buffer-set/test/usecase.ts new file mode 100644 index 00000000..0b05f686 --- /dev/null +++ b/packages/struct/integer-buffer-set/test/usecase.ts @@ -0,0 +1,120 @@ +import IntegerBufferSet from '../src'; +import { describe, it, expect, beforeEach } from 'vitest'; +import { extractTokenMetaIndex } from './utils'; + +export const testUseCase = (desc, data, fn) => { + describe(`usecase - ${desc} `, () => { + beforeEach(() => { + fn.hooks?.beforeEach(); + }); + it(`replace total array`, () => { + const bufferSet = new IntegerBufferSet({ + metaExtractor: (index) => data.values[index], + indexExtractor: (meta) => { + const index = data.values.findIndex((val) => val === meta); + if (index === -1) return null; + return index; + }, + }); + + const safeRange = { + startIndex: 1, + endIndex: 10, + }; + bufferSet.getPosition(0, safeRange); + bufferSet.getPosition(5, safeRange); + bufferSet.getPosition(10, safeRange); + bufferSet.getPosition(15, safeRange); + bufferSet.getPosition(20, safeRange); + bufferSet.getPosition(25, safeRange); + bufferSet.getPosition(30, safeRange); + bufferSet.getPosition(35, safeRange); + bufferSet.getPosition(40, safeRange); + bufferSet.getPosition(45, safeRange); + + expect(extractTokenMetaIndex(bufferSet.getIndices())).toEqual([ + 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, + ]); + + console.log('perf ======='); + + fn.data.replace(); + bufferSet.getPosition(0, safeRange); + bufferSet.getPosition(5, safeRange); + bufferSet.getPosition(10, safeRange); + bufferSet.getPosition(15, safeRange); + bufferSet.getPosition(20, safeRange); + bufferSet.getPosition(25, safeRange); + bufferSet.getPosition(30, safeRange); + bufferSet.getPosition(35, safeRange); + bufferSet.getPosition(40, safeRange); + bufferSet.getPosition(45, safeRange); + expect(extractTokenMetaIndex(bufferSet.getIndices())).toEqual([ + 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, + ]); + }); + it.only(`replace total array`, () => { + const bufferSet = new IntegerBufferSet({ + metaExtractor: (index) => data.values[index], + indexExtractor: (meta) => { + const index = data.values.findIndex((val) => val === meta); + if (index === -1) return null; + return index; + }, + }); + + console.log('data ', data.values); + + const safeRange = { + startIndex: 1, + endIndex: 4, + }; + bufferSet.getPosition(21, safeRange); + bufferSet.getPosition(26, safeRange); + bufferSet.getPosition(31, safeRange); + bufferSet.getPosition(36, safeRange); + bufferSet.getPosition(41, safeRange); + bufferSet.getPosition(46, safeRange); + bufferSet.getPosition(51, safeRange); + bufferSet.getPosition(56, safeRange); + bufferSet.getPosition(61, safeRange); + bufferSet.getPosition(66, safeRange); + + expect(extractTokenMetaIndex(bufferSet.getIndices())).toEqual([ + 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, + ]); + + const copy = data.values.slice(); + + // @ts-ignore + (bufferSet._indexExtractor = (meta) => { + const index = data.values.findIndex((val) => val === meta); + if (index !== -1) return index; + const _index = copy.findIndex((val) => val === meta); + if (_index === -1) return null; + + return _index; + }), + console.log('perf ======='); + + fn.data.replace(); + bufferSet.getPosition(21, safeRange); + bufferSet.getPosition(26, safeRange); + bufferSet.getPosition(31, safeRange); + bufferSet.getPosition(36, safeRange); + bufferSet.getPosition(41, safeRange); + bufferSet.getPosition(46, safeRange); + bufferSet.getPosition(51, safeRange); + bufferSet.getPosition(56, safeRange); + bufferSet.getPosition(61, safeRange); + bufferSet.getPosition(66, safeRange); + // expect(extractTokenMetaIndex(bufferSet.getIndices())).toEqual([ + // 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, + // ]); + expect(extractTokenMetaIndex(bufferSet.getIndices())).toEqual([ + // 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, + 121, 126, 131, 136, 141, 146, 151, 156, 161, 121, + ]); + }); + }); +};