mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-06 08:50:50 +08:00
fix(infra): fix fractional indexing edge cases (#8978)
This commit is contained in:
@@ -57,3 +57,19 @@ test('no postfix', () => {
|
|||||||
generateFractionalIndexingKeyBetween('a0', 'a01').startsWith('a00V')
|
generateFractionalIndexingKeyBetween('a0', 'a01').startsWith('a00V')
|
||||||
).toBe(true);
|
).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('edge cases', () => {
|
||||||
|
for (let i = 0; i < 100; i++) {
|
||||||
|
let a = generateFractionalIndexingKeyBetween(null, null);
|
||||||
|
let b = generateFractionalIndexingKeyBetween(null, null);
|
||||||
|
if (a > b) {
|
||||||
|
[a, b] = [b, a];
|
||||||
|
}
|
||||||
|
const c = generateFractionalIndexingKeyBetween(a, b);
|
||||||
|
const d = generateFractionalIndexingKeyBetween(c, b);
|
||||||
|
expect(a < c).toBeTruthy();
|
||||||
|
expect(c < b).toBeTruthy();
|
||||||
|
expect(c < d).toBeTruthy();
|
||||||
|
expect(d < b).toBeTruthy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
import { generateKeyBetween } from 'fractional-indexing';
|
import { generateKeyBetween } from 'fractional-indexing';
|
||||||
|
|
||||||
|
function hasSamePrefix(a: string, b: string) {
|
||||||
|
return a.startsWith(b) || b.startsWith(a);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate a key between a and b, the result key is always satisfied with a < result < b.
|
* generate a key between a and b, the result key is always satisfied with a < result < b.
|
||||||
* the key always has a random suffix, so there is no need to worry about collision.
|
* the key always has a random suffix, so there is no need to worry about collision.
|
||||||
@@ -59,7 +63,7 @@ export function generateFractionalIndexingKeyBetween(
|
|||||||
return generateKeyBetween(aSubkey, null) + '0' + postfix();
|
return generateKeyBetween(aSubkey, null) + '0' + postfix();
|
||||||
} else if (aSubkey !== null && bSubkey !== null) {
|
} else if (aSubkey !== null && bSubkey !== null) {
|
||||||
// generate a key between a and b
|
// generate a key between a and b
|
||||||
if (aSubkey === bSubkey && a !== null && b !== null) {
|
if (hasSamePrefix(aSubkey, bSubkey) && a !== null && b !== null) {
|
||||||
// conflict, if the subkeys are the same, generate a key between fullkeys
|
// conflict, if the subkeys are the same, generate a key between fullkeys
|
||||||
return generateKeyBetween(a, b) + '0' + postfix();
|
return generateKeyBetween(a, b) + '0' + postfix();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user