Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 78 additions & 17 deletions packages/struct/integer-buffer-set/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,15 +229,17 @@ class IntegerBufferSet<Meta = any> {
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({
Expand All @@ -249,12 +251,21 @@ class IntegerBufferSet<Meta = any> {
} 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
Expand All @@ -269,6 +280,15 @@ class IntegerBufferSet<Meta = any> {
} 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,
Expand Down Expand Up @@ -318,6 +338,13 @@ class IntegerBufferSet<Meta = any> {
}
) {
if (this._largeValues.empty() || this._smallValues.empty()) {
console.log(
'replaceFurthestIndexPosition ',
newIndex,
this._largeValues.empty(),
this._smallValues.empty()
);

return this._isOnTheFlyFullReturnHook(
this.getNewPositionForIndex(newIndex)
);
Expand Down Expand Up @@ -354,6 +381,14 @@ class IntegerBufferSet<Meta = any> {
}

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 (
Expand Down Expand Up @@ -399,12 +434,14 @@ class IntegerBufferSet<Meta = any> {
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 = [];
Expand Down Expand Up @@ -435,13 +472,17 @@ class IntegerBufferSet<Meta = any> {
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;
}
}
Expand All @@ -455,6 +496,16 @@ class IntegerBufferSet<Meta = any> {
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();
Expand All @@ -465,6 +516,7 @@ class IntegerBufferSet<Meta = any> {
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)
Expand Down Expand Up @@ -545,8 +597,12 @@ class IntegerBufferSet<Meta = any> {
newIndex,
safeRange
);

console.log('positionToReplace ', positionToReplace);
}
}

console.log('postion ', newIndex, positionToReplace);
return positionToReplace;
}

Expand Down Expand Up @@ -575,6 +631,11 @@ class IntegerBufferSet<Meta = any> {
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;
Expand Down Expand Up @@ -625,15 +686,15 @@ class IntegerBufferSet<Meta = any> {
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
this._setMetaIndex(value, value);
}
}

this._largeValues.peek().value;

this._smallValues = smallValues;
this._largeValues = largeValues;
}
Expand Down
18 changes: 18 additions & 0 deletions packages/struct/integer-buffer-set/test/test.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
resetStartIndex,
} from './data';
import { discreteSuite, basicSuite } from './basic';
import { testUseCase } from './usecase';

const data = {
values: [] as Array<any>,
Expand Down Expand Up @@ -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));
},
},
});
120 changes: 120 additions & 0 deletions packages/struct/integer-buffer-set/test/usecase.ts
Original file line number Diff line number Diff line change
@@ -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,
]);
});
});
};