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,
+ ]);
+ });
+ });
+};