cmpstr 3.0.4 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +3 -2
- package/dist/CmpStr.esm.js +362 -95
- package/dist/CmpStr.esm.js.map +1 -1
- package/dist/CmpStr.esm.min.js +3 -3
- package/dist/CmpStr.esm.min.js.map +1 -1
- package/dist/CmpStr.umd.js +363 -94
- package/dist/CmpStr.umd.js.map +1 -1
- package/dist/CmpStr.umd.min.js +3 -3
- package/dist/CmpStr.umd.min.js.map +1 -1
- package/dist/cjs/CmpStr.cjs +41 -1
- package/dist/cjs/CmpStr.cjs.map +1 -1
- package/dist/cjs/CmpStrAsync.cjs +38 -1
- package/dist/cjs/CmpStrAsync.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/metric/Cosine.cjs +1 -1
- package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -1
- package/dist/cjs/metric/DiceSorensen.cjs +1 -1
- package/dist/cjs/metric/Hamming.cjs +1 -1
- package/dist/cjs/metric/Jaccard.cjs +1 -1
- package/dist/cjs/metric/JaroWinkler.cjs +1 -1
- package/dist/cjs/metric/LCS.cjs +1 -1
- package/dist/cjs/metric/Levenshtein.cjs +1 -1
- package/dist/cjs/metric/Metric.cjs +1 -1
- package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -1
- package/dist/cjs/metric/SmithWaterman.cjs +1 -1
- package/dist/cjs/metric/qGram.cjs +1 -1
- package/dist/cjs/phonetic/Caverphone.cjs +1 -1
- package/dist/cjs/phonetic/Cologne.cjs +1 -1
- package/dist/cjs/phonetic/Metaphone.cjs +1 -1
- package/dist/cjs/phonetic/Phonetic.cjs +1 -1
- package/dist/cjs/phonetic/Soundex.cjs +1 -1
- package/dist/cjs/root.cjs +13 -1
- package/dist/cjs/root.cjs.map +1 -1
- package/dist/cjs/utils/DeepMerge.cjs +1 -1
- package/dist/cjs/utils/DiffChecker.cjs +1 -1
- package/dist/cjs/utils/Filter.cjs +1 -1
- package/dist/cjs/utils/HashTable.cjs +6 -6
- package/dist/cjs/utils/HashTable.cjs.map +1 -1
- package/dist/cjs/utils/Normalizer.cjs +1 -1
- package/dist/cjs/utils/Pool.cjs +13 -4
- package/dist/cjs/utils/Pool.cjs.map +1 -1
- package/dist/cjs/utils/Profiler.cjs +1 -1
- package/dist/cjs/utils/Registry.cjs +1 -1
- package/dist/cjs/utils/StructuredData.cjs +157 -0
- package/dist/cjs/utils/StructuredData.cjs.map +1 -0
- package/dist/cjs/utils/TextAnalyzer.cjs +1 -1
- package/dist/esm/CmpStr.mjs +41 -1
- package/dist/esm/CmpStr.mjs.map +1 -1
- package/dist/esm/CmpStrAsync.mjs +38 -1
- package/dist/esm/CmpStrAsync.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/metric/Cosine.mjs +1 -1
- package/dist/esm/metric/DamerauLevenshtein.mjs +1 -1
- package/dist/esm/metric/DiceSorensen.mjs +1 -1
- package/dist/esm/metric/Hamming.mjs +1 -1
- package/dist/esm/metric/Jaccard.mjs +1 -1
- package/dist/esm/metric/JaroWinkler.mjs +1 -1
- package/dist/esm/metric/LCS.mjs +1 -1
- package/dist/esm/metric/Levenshtein.mjs +1 -1
- package/dist/esm/metric/Metric.mjs +1 -1
- package/dist/esm/metric/NeedlemanWunsch.mjs +1 -1
- package/dist/esm/metric/SmithWaterman.mjs +1 -1
- package/dist/esm/metric/qGram.mjs +1 -1
- package/dist/esm/phonetic/Caverphone.mjs +1 -1
- package/dist/esm/phonetic/Cologne.mjs +1 -1
- package/dist/esm/phonetic/Metaphone.mjs +1 -1
- package/dist/esm/phonetic/Phonetic.mjs +1 -1
- package/dist/esm/phonetic/Soundex.mjs +1 -1
- package/dist/esm/root.mjs +7 -1
- package/dist/esm/root.mjs.map +1 -1
- package/dist/esm/utils/DeepMerge.mjs +1 -1
- package/dist/esm/utils/DiffChecker.mjs +1 -1
- package/dist/esm/utils/Filter.mjs +1 -1
- package/dist/esm/utils/HashTable.mjs +6 -6
- package/dist/esm/utils/HashTable.mjs.map +1 -1
- package/dist/esm/utils/Normalizer.mjs +1 -1
- package/dist/esm/utils/Pool.mjs +13 -4
- package/dist/esm/utils/Pool.mjs.map +1 -1
- package/dist/esm/utils/Profiler.mjs +1 -1
- package/dist/esm/utils/Registry.mjs +1 -1
- package/dist/esm/utils/StructuredData.mjs +155 -0
- package/dist/esm/utils/StructuredData.mjs.map +1 -0
- package/dist/esm/utils/TextAnalyzer.mjs +1 -1
- package/dist/types/CmpStr.d.ts +90 -8
- package/dist/types/CmpStrAsync.d.ts +82 -8
- package/dist/types/index.d.ts +3 -2
- package/dist/types/root.d.ts +3 -2
- package/dist/types/utils/Pool.d.ts +2 -2
- package/dist/types/utils/StructuredData.d.ts +164 -0
- package/dist/types/utils/Types.d.ts +43 -1
- package/package.json +53 -17
package/dist/CmpStr.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CmpStr v3.
|
|
2
|
+
* CmpStr v3.1.1 build-a140f52-260119
|
|
3
3
|
* This is a lightweight, fast and well performing library for calculating string similarity.
|
|
4
|
-
* (c) 2023-
|
|
4
|
+
* (c) 2023-2026 Paul Köhler @komed3 / MIT License
|
|
5
5
|
* Visit https://github.com/komed3/cmpstr and https://npmjs.org/package/cmpstr
|
|
6
6
|
*/
|
|
7
7
|
(function (global, factory) {
|
|
@@ -23,6 +23,12 @@
|
|
|
23
23
|
function get(t, path, fallback) {
|
|
24
24
|
return parse(path).reduce((o, k) => o?.[k] ?? fallback, t);
|
|
25
25
|
}
|
|
26
|
+
function has(t, path) {
|
|
27
|
+
return (
|
|
28
|
+
parse(path).reduce((o, k) => (o && k in o ? o[k] : undefined), t) !==
|
|
29
|
+
undefined
|
|
30
|
+
);
|
|
31
|
+
}
|
|
26
32
|
function set(t, path, value) {
|
|
27
33
|
if (path === '') return value;
|
|
28
34
|
const [k, ...r] = parse(path);
|
|
@@ -77,6 +83,15 @@
|
|
|
77
83
|
return t;
|
|
78
84
|
}
|
|
79
85
|
|
|
86
|
+
var DeepMerge = /*#__PURE__*/ Object.freeze({
|
|
87
|
+
__proto__: null,
|
|
88
|
+
get: get,
|
|
89
|
+
has: has,
|
|
90
|
+
merge: merge,
|
|
91
|
+
rmv: rmv,
|
|
92
|
+
set: set
|
|
93
|
+
});
|
|
94
|
+
|
|
80
95
|
class Profiler {
|
|
81
96
|
static ENV;
|
|
82
97
|
static instance;
|
|
@@ -662,11 +677,11 @@
|
|
|
662
677
|
const chunks = Math.floor(len / 4);
|
|
663
678
|
for (let i = 0; i < chunks; i++) {
|
|
664
679
|
const pos = i * 4;
|
|
665
|
-
const
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
680
|
+
const c0 = str.charCodeAt(pos);
|
|
681
|
+
const c1 = str.charCodeAt(pos + 1);
|
|
682
|
+
const c2 = str.charCodeAt(pos + 2);
|
|
683
|
+
const c3 = str.charCodeAt(pos + 3);
|
|
684
|
+
const chunk = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);
|
|
670
685
|
hash ^= chunk;
|
|
671
686
|
hash *= this.FNV_PRIME;
|
|
672
687
|
}
|
|
@@ -847,6 +862,260 @@
|
|
|
847
862
|
}
|
|
848
863
|
}
|
|
849
864
|
|
|
865
|
+
class RingPool {
|
|
866
|
+
maxSize;
|
|
867
|
+
buffers = [];
|
|
868
|
+
pointer = 0;
|
|
869
|
+
constructor(maxSize) {
|
|
870
|
+
this.maxSize = maxSize;
|
|
871
|
+
}
|
|
872
|
+
acquire(minSize, allowOversize) {
|
|
873
|
+
const len = this.buffers.length;
|
|
874
|
+
for (let i = 0; i < len; i++) {
|
|
875
|
+
const idx = (this.pointer + i) % len;
|
|
876
|
+
const item = this.buffers[idx];
|
|
877
|
+
if (item.size >= minSize) {
|
|
878
|
+
this.pointer = (idx + 1) % len;
|
|
879
|
+
return allowOversize || item.size === minSize ? item : null;
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
return null;
|
|
883
|
+
}
|
|
884
|
+
release(item) {
|
|
885
|
+
if (this.buffers.length < this.maxSize) {
|
|
886
|
+
this.buffers.push(item);
|
|
887
|
+
} else {
|
|
888
|
+
this.buffers[this.pointer] = item;
|
|
889
|
+
this.pointer = (this.pointer + 1) % this.maxSize;
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
clear() {
|
|
893
|
+
this.buffers = [];
|
|
894
|
+
this.pointer = 0;
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
class Pool {
|
|
898
|
+
static CONFIG = {
|
|
899
|
+
uint16: {
|
|
900
|
+
type: 'uint16',
|
|
901
|
+
maxSize: 64,
|
|
902
|
+
maxItemSize: 2048,
|
|
903
|
+
allowOversize: true
|
|
904
|
+
},
|
|
905
|
+
'number[]': {
|
|
906
|
+
type: 'number[]',
|
|
907
|
+
maxSize: 16,
|
|
908
|
+
maxItemSize: 1024,
|
|
909
|
+
allowOversize: false
|
|
910
|
+
},
|
|
911
|
+
'string[]': {
|
|
912
|
+
type: 'string[]',
|
|
913
|
+
maxSize: 2,
|
|
914
|
+
maxItemSize: 1024,
|
|
915
|
+
allowOversize: false
|
|
916
|
+
},
|
|
917
|
+
set: { type: 'set', maxSize: 8, maxItemSize: 0, allowOversize: false },
|
|
918
|
+
map: { type: 'map', maxSize: 8, maxItemSize: 0, allowOversize: false }
|
|
919
|
+
};
|
|
920
|
+
static POOLS = {
|
|
921
|
+
uint16: new RingPool(64),
|
|
922
|
+
'number[]': new RingPool(16),
|
|
923
|
+
'string[]': new RingPool(2),
|
|
924
|
+
set: new RingPool(8),
|
|
925
|
+
map: new RingPool(8)
|
|
926
|
+
};
|
|
927
|
+
static allocate(type, size) {
|
|
928
|
+
switch (type) {
|
|
929
|
+
case 'uint16':
|
|
930
|
+
return new Uint16Array(size);
|
|
931
|
+
case 'number[]':
|
|
932
|
+
return new Float64Array(size);
|
|
933
|
+
case 'string[]':
|
|
934
|
+
return new Array(size);
|
|
935
|
+
case 'set':
|
|
936
|
+
return new Set();
|
|
937
|
+
case 'map':
|
|
938
|
+
return new Map();
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
static acquire(type, size) {
|
|
942
|
+
const CONFIG = this.CONFIG[type];
|
|
943
|
+
if (size > CONFIG.maxItemSize) return this.allocate(type, size);
|
|
944
|
+
const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
|
|
945
|
+
if (item) {
|
|
946
|
+
return type === 'uint16' ? item.buffer.subarray(0, size) : item.buffer;
|
|
947
|
+
}
|
|
948
|
+
return this.allocate(type, size);
|
|
949
|
+
}
|
|
950
|
+
static acquireMany(type, sizes) {
|
|
951
|
+
return sizes.map((size) => this.acquire(type, size));
|
|
952
|
+
}
|
|
953
|
+
static release(type, buffer, size) {
|
|
954
|
+
const CONFIG = this.CONFIG[type];
|
|
955
|
+
if (size <= CONFIG.maxItemSize) {
|
|
956
|
+
this.POOLS[type].release({ buffer, size });
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
class StructuredData {
|
|
962
|
+
static create(data, key) {
|
|
963
|
+
return new StructuredData(data, key);
|
|
964
|
+
}
|
|
965
|
+
data;
|
|
966
|
+
key;
|
|
967
|
+
constructor(data, key) {
|
|
968
|
+
this.data = data;
|
|
969
|
+
this.key = key;
|
|
970
|
+
}
|
|
971
|
+
extractFrom(arr, key) {
|
|
972
|
+
const result = Pool.acquire('string[]', arr.length);
|
|
973
|
+
for (let i = 0; i < arr.length; i++) {
|
|
974
|
+
const val = arr[i][key];
|
|
975
|
+
result[i] = typeof val === 'string' ? val : String(val ?? '');
|
|
976
|
+
}
|
|
977
|
+
return result;
|
|
978
|
+
}
|
|
979
|
+
extract() {
|
|
980
|
+
return this.extractFrom(this.data, this.key);
|
|
981
|
+
}
|
|
982
|
+
isMetricResult(v) {
|
|
983
|
+
return (
|
|
984
|
+
typeof v === 'object' &&
|
|
985
|
+
v !== null &&
|
|
986
|
+
'a' in v &&
|
|
987
|
+
'b' in v &&
|
|
988
|
+
'res' in v
|
|
989
|
+
);
|
|
990
|
+
}
|
|
991
|
+
isCmpStrResult(v) {
|
|
992
|
+
return (
|
|
993
|
+
typeof v === 'object' &&
|
|
994
|
+
v !== null &&
|
|
995
|
+
'source' in v &&
|
|
996
|
+
'target' in v &&
|
|
997
|
+
'match' in v
|
|
998
|
+
);
|
|
999
|
+
}
|
|
1000
|
+
normalizeResults(results) {
|
|
1001
|
+
if (!Array.isArray(results) || results.length === 0) return [];
|
|
1002
|
+
const first = results[0];
|
|
1003
|
+
let normalized = [];
|
|
1004
|
+
if (this.isMetricResult(first)) normalized = results;
|
|
1005
|
+
else if (this.isCmpStrResult(first)) {
|
|
1006
|
+
normalized = results.map((r) => ({
|
|
1007
|
+
metric: 'unknown',
|
|
1008
|
+
a: r.source,
|
|
1009
|
+
b: r.target,
|
|
1010
|
+
res: r.match,
|
|
1011
|
+
raw: r.raw
|
|
1012
|
+
}));
|
|
1013
|
+
}
|
|
1014
|
+
return normalized.map((r, idx) => ({ ...r, __idx: idx }));
|
|
1015
|
+
}
|
|
1016
|
+
rebuild(results, sourceData, extractedStrings, removeZero, objectsOnly) {
|
|
1017
|
+
const stringToIndices = new Map();
|
|
1018
|
+
for (let i = 0; i < extractedStrings.length; i++) {
|
|
1019
|
+
const str = extractedStrings[i];
|
|
1020
|
+
if (!stringToIndices.has(str)) stringToIndices.set(str, []);
|
|
1021
|
+
stringToIndices.get(str).push(i);
|
|
1022
|
+
}
|
|
1023
|
+
const output = new Array(results.length);
|
|
1024
|
+
const occurrenceCount = new Map();
|
|
1025
|
+
let out = 0;
|
|
1026
|
+
for (let i = 0; i < results.length; i++) {
|
|
1027
|
+
const result = results[i];
|
|
1028
|
+
if (removeZero && result.res === 0) continue;
|
|
1029
|
+
const targetStr = result.b || '';
|
|
1030
|
+
const indices = stringToIndices.get(targetStr);
|
|
1031
|
+
let dataIndex;
|
|
1032
|
+
if (indices && indices.length > 0) {
|
|
1033
|
+
const occurrence = occurrenceCount.get(targetStr) ?? 0;
|
|
1034
|
+
occurrenceCount.set(targetStr, occurrence + 1);
|
|
1035
|
+
dataIndex = indices[occurrence % indices.length];
|
|
1036
|
+
} else {
|
|
1037
|
+
dataIndex = result.__idx ?? i;
|
|
1038
|
+
}
|
|
1039
|
+
if (dataIndex < 0 || dataIndex >= sourceData.length) continue;
|
|
1040
|
+
const sourceObj = sourceData[dataIndex];
|
|
1041
|
+
const mappedTarget = extractedStrings[dataIndex] || targetStr;
|
|
1042
|
+
if (objectsOnly) output[out++] = sourceObj;
|
|
1043
|
+
else
|
|
1044
|
+
output[out++] = {
|
|
1045
|
+
obj: sourceObj,
|
|
1046
|
+
key: this.key,
|
|
1047
|
+
result: {
|
|
1048
|
+
source: result.a,
|
|
1049
|
+
target: mappedTarget,
|
|
1050
|
+
match: result.res
|
|
1051
|
+
},
|
|
1052
|
+
...(result.raw ? { raw: result.raw } : null)
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
output.length = out;
|
|
1056
|
+
return output;
|
|
1057
|
+
}
|
|
1058
|
+
sort(results, sort) {
|
|
1059
|
+
if (!sort || results.length <= 1) return results;
|
|
1060
|
+
const asc = sort === 'asc';
|
|
1061
|
+
return results.sort((a, b) => (asc ? a.res - b.res : b.res - a.res));
|
|
1062
|
+
}
|
|
1063
|
+
performLookup(fn, extractedStrings, opt) {
|
|
1064
|
+
return this.rebuild(
|
|
1065
|
+
this.sort(this.normalizeResults(fn()), opt?.sort),
|
|
1066
|
+
this.data,
|
|
1067
|
+
extractedStrings,
|
|
1068
|
+
opt?.removeZero,
|
|
1069
|
+
opt?.objectsOnly
|
|
1070
|
+
);
|
|
1071
|
+
}
|
|
1072
|
+
async performLookupAsync(fn, extractedStrings, opt) {
|
|
1073
|
+
return this.rebuild(
|
|
1074
|
+
this.sort(this.normalizeResults(await fn()), opt?.sort),
|
|
1075
|
+
this.data,
|
|
1076
|
+
extractedStrings,
|
|
1077
|
+
opt?.removeZero,
|
|
1078
|
+
opt?.objectsOnly
|
|
1079
|
+
);
|
|
1080
|
+
}
|
|
1081
|
+
lookup(fn, query, opt) {
|
|
1082
|
+
const b = this.extract();
|
|
1083
|
+
try {
|
|
1084
|
+
return this.performLookup(() => fn(query, b, opt), b, opt);
|
|
1085
|
+
} finally {
|
|
1086
|
+
Pool.release('string[]', b, b.length);
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
lookupPairs(fn, other, otherKey, opt) {
|
|
1090
|
+
const a = this.extract();
|
|
1091
|
+
const b = this.extractFrom(other, otherKey);
|
|
1092
|
+
try {
|
|
1093
|
+
return this.performLookup(() => fn(a, b, opt), a, opt);
|
|
1094
|
+
} finally {
|
|
1095
|
+
Pool.release('string[]', a, a.length);
|
|
1096
|
+
Pool.release('string[]', b, b.length);
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
async lookupAsync(fn, query, opt) {
|
|
1100
|
+
const b = this.extract();
|
|
1101
|
+
try {
|
|
1102
|
+
return await this.performLookupAsync(() => fn(query, b, opt), b, opt);
|
|
1103
|
+
} finally {
|
|
1104
|
+
Pool.release('string[]', b, b.length);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
async lookupPairsAsync(fn, other, otherKey, opt) {
|
|
1108
|
+
const a = this.extract();
|
|
1109
|
+
const b = this.extractFrom(other, otherKey);
|
|
1110
|
+
try {
|
|
1111
|
+
return await this.performLookupAsync(() => fn(a, b, opt), a, opt);
|
|
1112
|
+
} finally {
|
|
1113
|
+
Pool.release('string[]', a, a.length);
|
|
1114
|
+
Pool.release('string[]', b, b.length);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
|
|
850
1119
|
const registry = Object.create(null);
|
|
851
1120
|
const factory = Object.create(null);
|
|
852
1121
|
function Registry(reg, ctor) {
|
|
@@ -1076,93 +1345,6 @@
|
|
|
1076
1345
|
}
|
|
1077
1346
|
const MetricRegistry = Registry('metric', Metric);
|
|
1078
1347
|
|
|
1079
|
-
class RingPool {
|
|
1080
|
-
maxSize;
|
|
1081
|
-
buffers = [];
|
|
1082
|
-
pointer = 0;
|
|
1083
|
-
constructor(maxSize) {
|
|
1084
|
-
this.maxSize = maxSize;
|
|
1085
|
-
}
|
|
1086
|
-
acquire(minSize, allowOversize) {
|
|
1087
|
-
const len = this.buffers.length;
|
|
1088
|
-
for (let i = 0; i < len; i++) {
|
|
1089
|
-
const idx = (this.pointer + i) % len;
|
|
1090
|
-
const item = this.buffers[idx];
|
|
1091
|
-
if (item.size >= minSize) {
|
|
1092
|
-
this.pointer = (idx + 1) % len;
|
|
1093
|
-
return allowOversize || item.size === minSize ? item : null;
|
|
1094
|
-
}
|
|
1095
|
-
}
|
|
1096
|
-
return null;
|
|
1097
|
-
}
|
|
1098
|
-
release(item) {
|
|
1099
|
-
if (this.buffers.length < this.maxSize) {
|
|
1100
|
-
this.buffers.push(item);
|
|
1101
|
-
} else {
|
|
1102
|
-
this.buffers[this.pointer] = item;
|
|
1103
|
-
this.pointer = (this.pointer + 1) % this.maxSize;
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
clear() {
|
|
1107
|
-
this.buffers = [];
|
|
1108
|
-
this.pointer = 0;
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
class Pool {
|
|
1112
|
-
static CONFIG = {
|
|
1113
|
-
uint16: {
|
|
1114
|
-
type: 'uint16',
|
|
1115
|
-
maxSize: 32,
|
|
1116
|
-
maxItemSize: 2048,
|
|
1117
|
-
allowOversize: true
|
|
1118
|
-
},
|
|
1119
|
-
'number[]': {
|
|
1120
|
-
type: 'number[]',
|
|
1121
|
-
maxSize: 16,
|
|
1122
|
-
maxItemSize: 1024,
|
|
1123
|
-
allowOversize: false
|
|
1124
|
-
},
|
|
1125
|
-
set: { type: 'set', maxSize: 8, maxItemSize: 0, allowOversize: false },
|
|
1126
|
-
map: { type: 'map', maxSize: 8, maxItemSize: 0, allowOversize: false }
|
|
1127
|
-
};
|
|
1128
|
-
static POOLS = {
|
|
1129
|
-
uint16: new RingPool(32),
|
|
1130
|
-
'number[]': new RingPool(16),
|
|
1131
|
-
set: new RingPool(8),
|
|
1132
|
-
map: new RingPool(8)
|
|
1133
|
-
};
|
|
1134
|
-
static allocate(type, size) {
|
|
1135
|
-
switch (type) {
|
|
1136
|
-
case 'uint16':
|
|
1137
|
-
return new Uint16Array(size);
|
|
1138
|
-
case 'number[]':
|
|
1139
|
-
return new Array(size).fill(0);
|
|
1140
|
-
case 'set':
|
|
1141
|
-
return new Set();
|
|
1142
|
-
case 'map':
|
|
1143
|
-
return new Map();
|
|
1144
|
-
}
|
|
1145
|
-
}
|
|
1146
|
-
static acquire(type, size) {
|
|
1147
|
-
const CONFIG = this.CONFIG[type];
|
|
1148
|
-
if (size > CONFIG.maxItemSize) return this.allocate(type, size);
|
|
1149
|
-
const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
|
|
1150
|
-
if (item) {
|
|
1151
|
-
return type === 'uint16' ? item.buffer.subarray(0, size) : item.buffer;
|
|
1152
|
-
}
|
|
1153
|
-
return this.allocate(type, size);
|
|
1154
|
-
}
|
|
1155
|
-
static acquireMany(type, sizes) {
|
|
1156
|
-
return sizes.map((size) => this.acquire(type, size));
|
|
1157
|
-
}
|
|
1158
|
-
static release(type, buffer, size) {
|
|
1159
|
-
const CONFIG = this.CONFIG[type];
|
|
1160
|
-
if (size <= CONFIG.maxItemSize) {
|
|
1161
|
-
this.POOLS[type].release({ buffer, size });
|
|
1162
|
-
}
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
1348
|
class CosineSimilarity extends Metric {
|
|
1167
1349
|
constructor(a, b, opt = {}) {
|
|
1168
1350
|
super('cosine', a, b, opt, true);
|
|
@@ -2155,6 +2337,9 @@
|
|
|
2155
2337
|
? input.map((s) => phonetic.getIndex(s).join(delimiter))
|
|
2156
2338
|
: phonetic.getIndex(input).join(delimiter);
|
|
2157
2339
|
}
|
|
2340
|
+
structured(data, key) {
|
|
2341
|
+
return StructuredData.create(data, key);
|
|
2342
|
+
}
|
|
2158
2343
|
compute(a, b, opt, mode, raw, skip) {
|
|
2159
2344
|
const resolved = this.resolveOptions(opt);
|
|
2160
2345
|
this.assert('metric', resolved.metric);
|
|
@@ -2288,6 +2473,42 @@
|
|
|
2288
2473
|
const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
|
|
2289
2474
|
return this.index(input, { algo: algo ?? a, opt: opt ?? o });
|
|
2290
2475
|
}
|
|
2476
|
+
structuredLookup(query, data, key, opt) {
|
|
2477
|
+
return this.structured(data, key).lookup(
|
|
2478
|
+
(q, items, options) => this.batchTest(q, items, options),
|
|
2479
|
+
query,
|
|
2480
|
+
opt
|
|
2481
|
+
);
|
|
2482
|
+
}
|
|
2483
|
+
structuredMatch(query, data, key, threshold, opt) {
|
|
2484
|
+
return this.structured(data, key).lookup(
|
|
2485
|
+
(q, items, options) => this.match(q, items, threshold, options),
|
|
2486
|
+
query,
|
|
2487
|
+
{ ...opt, sort: 'desc' }
|
|
2488
|
+
);
|
|
2489
|
+
}
|
|
2490
|
+
structuredClosest(query, data, key, n = 1, opt) {
|
|
2491
|
+
return this.structured(data, key).lookup(
|
|
2492
|
+
(q, items, options) => this.closest(q, items, n, options),
|
|
2493
|
+
query,
|
|
2494
|
+
{ ...opt, sort: 'desc' }
|
|
2495
|
+
);
|
|
2496
|
+
}
|
|
2497
|
+
structuredFurthest(query, data, key, n = 1, opt) {
|
|
2498
|
+
return this.structured(data, key).lookup(
|
|
2499
|
+
(q, items, options) => this.furthest(q, items, n, options),
|
|
2500
|
+
query,
|
|
2501
|
+
{ ...opt, sort: 'asc' }
|
|
2502
|
+
);
|
|
2503
|
+
}
|
|
2504
|
+
structuredPairs(data, key, other, otherKey, opt) {
|
|
2505
|
+
return this.structured(data, key).lookupPairs(
|
|
2506
|
+
(items, otherItems, options) => this.pairs(items, otherItems, options),
|
|
2507
|
+
other,
|
|
2508
|
+
otherKey,
|
|
2509
|
+
opt
|
|
2510
|
+
);
|
|
2511
|
+
}
|
|
2291
2512
|
}
|
|
2292
2513
|
|
|
2293
2514
|
class CmpStrAsync extends CmpStr {
|
|
@@ -2404,12 +2625,60 @@
|
|
|
2404
2625
|
const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
|
|
2405
2626
|
return this.indexAsync(input, { algo: algo ?? a, opt: opt ?? o });
|
|
2406
2627
|
}
|
|
2628
|
+
async structuredLookupAsync(query, data, key, opt) {
|
|
2629
|
+
return await this.structured(data, key).lookupAsync(
|
|
2630
|
+
(q, items, options) => this.batchTestAsync(q, items, options),
|
|
2631
|
+
query,
|
|
2632
|
+
opt
|
|
2633
|
+
);
|
|
2634
|
+
}
|
|
2635
|
+
async structuredMatchAsync(query, data, key, threshold, opt) {
|
|
2636
|
+
return await this.structured(data, key).lookupAsync(
|
|
2637
|
+
(q, items, options) => this.matchAsync(q, items, threshold, options),
|
|
2638
|
+
query,
|
|
2639
|
+
{ ...opt, sort: 'desc' }
|
|
2640
|
+
);
|
|
2641
|
+
}
|
|
2642
|
+
async structuredClosestAsync(query, data, key, n = 1, opt) {
|
|
2643
|
+
return await this.structured(data, key).lookupAsync(
|
|
2644
|
+
(q, items, options) => this.closestAsync(q, items, n, options),
|
|
2645
|
+
query,
|
|
2646
|
+
{ ...opt, sort: 'desc' }
|
|
2647
|
+
);
|
|
2648
|
+
}
|
|
2649
|
+
async structuredFurthestAsync(query, data, key, n = 1, opt) {
|
|
2650
|
+
return await this.structured(data, key).lookupAsync(
|
|
2651
|
+
(q, items, options) => this.furthestAsync(q, items, n, options),
|
|
2652
|
+
query,
|
|
2653
|
+
{ ...opt, sort: 'asc' }
|
|
2654
|
+
);
|
|
2655
|
+
}
|
|
2656
|
+
async structuredPairsAsync(data, key, other, otherKey, opt) {
|
|
2657
|
+
return await this.structured(data, key).lookupPairsAsync(
|
|
2658
|
+
(items, otherItems, options) =>
|
|
2659
|
+
this.pairsAsync(items, otherItems, options),
|
|
2660
|
+
other,
|
|
2661
|
+
otherKey,
|
|
2662
|
+
opt
|
|
2663
|
+
);
|
|
2664
|
+
}
|
|
2407
2665
|
}
|
|
2408
2666
|
|
|
2409
2667
|
exports.CmpStr = CmpStr;
|
|
2410
2668
|
exports.CmpStrAsync = CmpStrAsync;
|
|
2669
|
+
exports.DeepMerge = DeepMerge;
|
|
2411
2670
|
exports.DiffChecker = DiffChecker;
|
|
2671
|
+
exports.Filter = Filter;
|
|
2672
|
+
exports.HashTable = HashTable;
|
|
2673
|
+
exports.Metric = Metric;
|
|
2674
|
+
exports.MetricRegistry = MetricRegistry;
|
|
2412
2675
|
exports.Normalizer = Normalizer;
|
|
2676
|
+
exports.Phonetic = Phonetic;
|
|
2677
|
+
exports.PhoneticMappingRegistry = PhoneticMappingRegistry;
|
|
2678
|
+
exports.PhoneticRegistry = PhoneticRegistry;
|
|
2679
|
+
exports.Pool = Pool;
|
|
2680
|
+
exports.Profiler = Profiler;
|
|
2681
|
+
exports.StructuredData = StructuredData;
|
|
2413
2682
|
exports.TextAnalyzer = TextAnalyzer;
|
|
2414
2683
|
});
|
|
2415
2684
|
//# sourceMappingURL=CmpStr.umd.js.map
|