@futdevpro/nts-dynamo 1.15.24 → 1.15.29
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/_specifications/BACKLOG.md +28 -0
- package/build/_models/interfaces/compare-data-options.interface.d.ts +27 -0
- package/build/_models/interfaces/compare-data-options.interface.d.ts.map +1 -0
- package/build/_models/interfaces/compare-data-options.interface.js +3 -0
- package/build/_models/interfaces/compare-data-options.interface.js.map +1 -0
- package/build/_models/interfaces/compare-data-result.interface.d.ts +13 -0
- package/build/_models/interfaces/compare-data-result.interface.d.ts.map +1 -0
- package/build/_models/interfaces/compare-data-result.interface.js +3 -0
- package/build/_models/interfaces/compare-data-result.interface.js.map +1 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event-callback.interface.d.ts +14 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event-callback.interface.d.ts.map +1 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event-callback.interface.js +3 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event-callback.interface.js.map +1 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.d.ts +50 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.d.ts.map +1 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.js +3 -0
- package/build/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.js.map +1 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.d.ts.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.js +32 -0
- package/build/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.js.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.d.ts.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.js +20 -2
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.js.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.d.ts +4 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.d.ts.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.js +28 -1
- package/build/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.js.map +1 -1
- package/build/_modules/ai/_services/ai-provider.service-base.d.ts +21 -0
- package/build/_modules/ai/_services/ai-provider.service-base.d.ts.map +1 -1
- package/build/_modules/ai/_services/ai-provider.service-base.js +32 -0
- package/build/_modules/ai/_services/ai-provider.service-base.js.map +1 -1
- package/build/_modules/local-vector-search/_enums/lvs-search-mode.enum.d.ts +17 -1
- package/build/_modules/local-vector-search/_enums/lvs-search-mode.enum.d.ts.map +1 -1
- package/build/_modules/local-vector-search/_enums/lvs-search-mode.enum.js +16 -0
- package/build/_modules/local-vector-search/_enums/lvs-search-mode.enum.js.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-bm25.util.d.ts +89 -0
- package/build/_modules/local-vector-search/_services/lvs-bm25.util.d.ts.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-bm25.util.js +190 -0
- package/build/_modules/local-vector-search/_services/lvs-bm25.util.js.map +1 -0
- package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.d.ts +18 -2
- package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.d.ts.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.js +57 -3
- package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.js.map +1 -1
- package/build/_services/base/data.service.d.ts +63 -0
- package/build/_services/base/data.service.d.ts.map +1 -1
- package/build/_services/base/data.service.js +189 -0
- package/build/_services/base/data.service.js.map +1 -1
- package/package.json +1 -1
- package/src/_models/interfaces/compare-data-options.interface.ts +27 -0
- package/src/_models/interfaces/compare-data-result.interface.ts +12 -0
- package/src/_modules/ai/_models/interfaces/dynts-ai-cost-event-callback.interface.ts +14 -0
- package/src/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.ts +56 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +92 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +38 -4
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +24 -5
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +52 -0
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +39 -10
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -0
- package/src/_modules/ai/_services/ai-provider.service-base.ts +41 -3
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +16 -0
- package/src/_modules/local-vector-search/_services/lvs-bm25.util.spec.ts +159 -0
- package/src/_modules/local-vector-search/_services/lvs-bm25.util.ts +206 -0
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +135 -0
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +95 -9
- package/src/_services/base/data.service.spec.ts +181 -0
- package/src/_services/base/data.service.ts +196 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lvs-search-mode.enum.d.ts","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,eAAe;IACzB;;;;OAIG;IACH,gBAAgB,sBAAsB;IACtC;;;;OAIG;IACH,UAAU,gBAAgB;
|
|
1
|
+
{"version":3,"file":"lvs-search-mode.enum.d.ts","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,eAAe;IACzB;;;;OAIG;IACH,gBAAgB,sBAAsB;IACtC;;;;OAIG;IACH,UAAU,gBAAgB;IAC1B;;;;;;;;;;;;;;OAcG;IACH,MAAM,WAAW;CAClB"}
|
|
@@ -19,5 +19,21 @@ var LVS_Search_Mode;
|
|
|
19
19
|
* Eredmények növekvő sorrendben (legkisebb távolság először)
|
|
20
20
|
*/
|
|
21
21
|
LVS_Search_Mode["l2Distance"] = "l2-distance";
|
|
22
|
+
/**
|
|
23
|
+
* Hybrid search: cosine similarity (vektor-fele) + BM25 (text-fele) score-merge.
|
|
24
|
+
*
|
|
25
|
+
* Hasznalat:
|
|
26
|
+
* - `searchMode: LVS_Search_Mode.hybrid`
|
|
27
|
+
* - `textSearchKey: keyof T` — KOTELEZO; melyik string property-n fut a BM25
|
|
28
|
+
* - `hybridWeight?: { vector: number; text: number }` — default { vector: 0.5, text: 0.5 }
|
|
29
|
+
*
|
|
30
|
+
* BM25 min-max normalizalva [0,1] a candidate-szettre (cosine mar 0..1), igy
|
|
31
|
+
* a `weight` direkt linearis kombinacio. Ha minden BM25 score 0 (egyetlen
|
|
32
|
+
* query term sem matchel), a hybrid effektivan cosine-only-re degradalodik.
|
|
33
|
+
*
|
|
34
|
+
* L2+hybrid kombinacio NEM tamogatott — a hybrid mindig cosine-alapu
|
|
35
|
+
* vector-half-fel mukodik.
|
|
36
|
+
*/
|
|
37
|
+
LVS_Search_Mode["hybrid"] = "hybrid";
|
|
22
38
|
})(LVS_Search_Mode || (exports.LVS_Search_Mode = LVS_Search_Mode = {}));
|
|
23
39
|
//# sourceMappingURL=lvs-search-mode.enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lvs-search-mode.enum.js","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,IAAY,
|
|
1
|
+
{"version":3,"file":"lvs-search-mode.enum.js","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,IAAY,eA6BX;AA7BD,WAAY,eAAe;IACzB;;;;OAIG;IACH,yDAAsC,CAAA;IACtC;;;;OAIG;IACH,6CAA0B,CAAA;IAC1B;;;;;;;;;;;;;;OAcG;IACH,oCAAiB,CAAA;AACnB,CAAC,EA7BW,eAAe,+BAAf,eAAe,QA6B1B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BM25 text-search ranking util a LVS hybrid search-hez (FR-004).
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript, dependency-free. In-memory corpus alapjan szamol score-okat,
|
|
5
|
+
* NEM perzisztal indexet (a hybrid hivasonkent ujraepiti a corpus-t a candidate
|
|
6
|
+
* dokumentumokon — kis (~100..10000 dokumentum) LVS-corpus eseten ez gyors es
|
|
7
|
+
* egyszeru).
|
|
8
|
+
*
|
|
9
|
+
* Canonical params: k1=1.2, b=0.75 (industry standard a "lucene-szeru"
|
|
10
|
+
* implementaciokban). NEM expose-oltak — ha kell, FR-002 kovetkezo iteracioban
|
|
11
|
+
* tehetjuk parameterizalhatova.
|
|
12
|
+
*
|
|
13
|
+
* Tokenizer: `text.toLowerCase().match(/\w+/g) || []`. Case-insensitive,
|
|
14
|
+
* alphanumeric+underscore boundary-k. `UserController` egy token marad (jo az
|
|
15
|
+
* identifier match-re), `auth-flow` ket tokenre esik (auth + flow).
|
|
16
|
+
*
|
|
17
|
+
* IDF formula (BM25+): `log((N - df + 0.5) / (df + 0.5) + 1)`. A +1 a logon
|
|
18
|
+
* belul garantalja, hogy a kozos szavak is pozitiv (kicsi) IDF-et kapjanak,
|
|
19
|
+
* NEM negativ-t — fontos a hybrid score-merge-nel hogy ne huzzon le dokumentumot
|
|
20
|
+
* ahol kozos szo szerepel.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Egy dokumentum BM25-score-ja egy query ellen, egy elore-felepitett corpus
|
|
24
|
+
* konteztusaban.
|
|
25
|
+
*/
|
|
26
|
+
export interface DyNTS_LVS_BM25_DocScore {
|
|
27
|
+
/** Dokumentum azonosito (mint az LVS_SearchResult `id`-jaben). */
|
|
28
|
+
id: string;
|
|
29
|
+
/** Nyers BM25 score (0..∞). NEM normalizalt. */
|
|
30
|
+
score: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Felepitett BM25 corpus — egy adott dokumentumhalmaz indexe. A `score()` az
|
|
34
|
+
* indexen kerdez le egy query-t es minden dokumentumra ad egy score-t.
|
|
35
|
+
*
|
|
36
|
+
* Egy corpus egyszer-hasznalatos a hybrid search hivasban — NEM kell cache-elni,
|
|
37
|
+
* a felepites O(N * |doc|) ami pici N-re elhanyagolhato.
|
|
38
|
+
*/
|
|
39
|
+
export declare class DyNTS_LVS_BM25_Corpus {
|
|
40
|
+
/** Tokenizalt dokumentumok: id -> tokens. */
|
|
41
|
+
private readonly docTokens;
|
|
42
|
+
/** Doc-length: id -> token count. */
|
|
43
|
+
private readonly docLengths;
|
|
44
|
+
/** Term -> doc-frequency (hany docban szerepel az adott term, legalabb 1x). */
|
|
45
|
+
private readonly termDocFreq;
|
|
46
|
+
/** Term -> id -> term-frequency a docban. */
|
|
47
|
+
private readonly termFreqByDoc;
|
|
48
|
+
/** Atlagos dokumentum-hossz (token count). */
|
|
49
|
+
private avgDocLength;
|
|
50
|
+
/** Total doc count. */
|
|
51
|
+
private docCount;
|
|
52
|
+
/**
|
|
53
|
+
* Letrehoz egy uj corpus-t a megadott id->text parok-bol.
|
|
54
|
+
* NEM dob hibat ures input-ra — ures corpus ervenyes (minden score = 0).
|
|
55
|
+
*/
|
|
56
|
+
constructor(docs: {
|
|
57
|
+
id: string;
|
|
58
|
+
text: string;
|
|
59
|
+
}[]);
|
|
60
|
+
/**
|
|
61
|
+
* Public tokenizer — exportalt, hogy spec-ek + hivok ugyanazt a normalizalast
|
|
62
|
+
* tudjak hasznalni mint a corpus.
|
|
63
|
+
*/
|
|
64
|
+
static tokenize(text: string): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Visszaadja a corpus dokumentum-szamat (NEM-ures docok).
|
|
67
|
+
*/
|
|
68
|
+
size(): number;
|
|
69
|
+
/**
|
|
70
|
+
* BM25 score minden dokumentumra a query-re.
|
|
71
|
+
*
|
|
72
|
+
* Ures query → minden score 0 (degenerate case; a hivo kezelje ha kell).
|
|
73
|
+
* Ures corpus → ures array.
|
|
74
|
+
*/
|
|
75
|
+
score(query: string): DyNTS_LVS_BM25_DocScore[];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Min-max normalizalas [0,1] tartomanyra. A hybrid score-merge-hez kell a BM25
|
|
79
|
+
* score-okat a candidate-szetten 0..1 sav-ba hozni (a cosine mar 0..1).
|
|
80
|
+
*
|
|
81
|
+
* Edge case-ek:
|
|
82
|
+
* - Ures array → [].
|
|
83
|
+
* - Minden score azonos (max-min === 0) → minden 0.0 (NEM 0.5 vagy 1.0; ha
|
|
84
|
+
* nincs diszkriminacio, ne tegyunk hozza signal-t).
|
|
85
|
+
* - Negativ score-ok (BM25+IDF garantal pozitivat, de defensive): a min-max
|
|
86
|
+
* ugyanugy mukodik.
|
|
87
|
+
*/
|
|
88
|
+
export declare function dyNTS_LVS_BM25_minMaxNormalize(scores: DyNTS_LVS_BM25_DocScore[]): DyNTS_LVS_BM25_DocScore[];
|
|
89
|
+
//# sourceMappingURL=lvs-bm25.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lvs-bm25.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-bm25.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAGD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAEhC,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsD;IAChF,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkD;IAC7E,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;IAC9E,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4E;IAC1G,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAa;IACjC,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAa;IAE7B;;;OAGG;gBACS,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;IAmChD;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAMvC;;OAEG;IACH,IAAI,IAAI,MAAM;IAKd;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,EAAE;CAwChD;AAGD;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,uBAAuB,EAAE,GAChC,uBAAuB,EAAE,CAmB3B"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BM25 text-search ranking util a LVS hybrid search-hez (FR-004).
|
|
4
|
+
*
|
|
5
|
+
* Pure TypeScript, dependency-free. In-memory corpus alapjan szamol score-okat,
|
|
6
|
+
* NEM perzisztal indexet (a hybrid hivasonkent ujraepiti a corpus-t a candidate
|
|
7
|
+
* dokumentumokon — kis (~100..10000 dokumentum) LVS-corpus eseten ez gyors es
|
|
8
|
+
* egyszeru).
|
|
9
|
+
*
|
|
10
|
+
* Canonical params: k1=1.2, b=0.75 (industry standard a "lucene-szeru"
|
|
11
|
+
* implementaciokban). NEM expose-oltak — ha kell, FR-002 kovetkezo iteracioban
|
|
12
|
+
* tehetjuk parameterizalhatova.
|
|
13
|
+
*
|
|
14
|
+
* Tokenizer: `text.toLowerCase().match(/\w+/g) || []`. Case-insensitive,
|
|
15
|
+
* alphanumeric+underscore boundary-k. `UserController` egy token marad (jo az
|
|
16
|
+
* identifier match-re), `auth-flow` ket tokenre esik (auth + flow).
|
|
17
|
+
*
|
|
18
|
+
* IDF formula (BM25+): `log((N - df + 0.5) / (df + 0.5) + 1)`. A +1 a logon
|
|
19
|
+
* belul garantalja, hogy a kozos szavak is pozitiv (kicsi) IDF-et kapjanak,
|
|
20
|
+
* NEM negativ-t — fontos a hybrid score-merge-nel hogy ne huzzon le dokumentumot
|
|
21
|
+
* ahol kozos szo szerepel.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.DyNTS_LVS_BM25_Corpus = void 0;
|
|
25
|
+
exports.dyNTS_LVS_BM25_minMaxNormalize = dyNTS_LVS_BM25_minMaxNormalize;
|
|
26
|
+
/** BM25 k1 parameter (term saturation control). Canonical default. */
|
|
27
|
+
const BM25_K1 = 1.2;
|
|
28
|
+
/** BM25 b parameter (length normalization weight, 0=off, 1=full). Canonical default. */
|
|
29
|
+
const BM25_B = 0.75;
|
|
30
|
+
/** Token regex — alphanumeric + underscore. */
|
|
31
|
+
const TOKEN_REGEX = /\w+/g;
|
|
32
|
+
/**
|
|
33
|
+
* Felepitett BM25 corpus — egy adott dokumentumhalmaz indexe. A `score()` az
|
|
34
|
+
* indexen kerdez le egy query-t es minden dokumentumra ad egy score-t.
|
|
35
|
+
*
|
|
36
|
+
* Egy corpus egyszer-hasznalatos a hybrid search hivasban — NEM kell cache-elni,
|
|
37
|
+
* a felepites O(N * |doc|) ami pici N-re elhanyagolhato.
|
|
38
|
+
*/
|
|
39
|
+
class DyNTS_LVS_BM25_Corpus {
|
|
40
|
+
/** Tokenizalt dokumentumok: id -> tokens. */
|
|
41
|
+
docTokens = new Map();
|
|
42
|
+
/** Doc-length: id -> token count. */
|
|
43
|
+
docLengths = new Map();
|
|
44
|
+
/** Term -> doc-frequency (hany docban szerepel az adott term, legalabb 1x). */
|
|
45
|
+
termDocFreq = new Map();
|
|
46
|
+
/** Term -> id -> term-frequency a docban. */
|
|
47
|
+
termFreqByDoc = new Map();
|
|
48
|
+
/** Atlagos dokumentum-hossz (token count). */
|
|
49
|
+
avgDocLength = 0;
|
|
50
|
+
/** Total doc count. */
|
|
51
|
+
docCount = 0;
|
|
52
|
+
/**
|
|
53
|
+
* Letrehoz egy uj corpus-t a megadott id->text parok-bol.
|
|
54
|
+
* NEM dob hibat ures input-ra — ures corpus ervenyes (minden score = 0).
|
|
55
|
+
*/
|
|
56
|
+
constructor(docs) {
|
|
57
|
+
if (!Array.isArray(docs) || docs.length === 0) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let totalLength = 0;
|
|
61
|
+
for (const doc of docs) {
|
|
62
|
+
if (!doc || typeof doc.id !== 'string' || typeof doc.text !== 'string') {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const tokens = DyNTS_LVS_BM25_Corpus.tokenize(doc.text);
|
|
66
|
+
this.docTokens.set(doc.id, tokens);
|
|
67
|
+
this.docLengths.set(doc.id, tokens.length);
|
|
68
|
+
totalLength += tokens.length;
|
|
69
|
+
// Term-frequency a docban
|
|
70
|
+
const localTf = new Map();
|
|
71
|
+
for (const tok of tokens) {
|
|
72
|
+
localTf.set(tok, (localTf.get(tok) ?? 0) + 1);
|
|
73
|
+
}
|
|
74
|
+
for (const [term, tf] of localTf) {
|
|
75
|
+
// Doc-frequency: +1 per term, per doc
|
|
76
|
+
this.termDocFreq.set(term, (this.termDocFreq.get(term) ?? 0) + 1);
|
|
77
|
+
// Term-freq-by-doc reverse index
|
|
78
|
+
let perDoc = this.termFreqByDoc.get(term);
|
|
79
|
+
if (!perDoc) {
|
|
80
|
+
perDoc = new Map();
|
|
81
|
+
this.termFreqByDoc.set(term, perDoc);
|
|
82
|
+
}
|
|
83
|
+
perDoc.set(doc.id, tf);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.docCount = this.docTokens.size;
|
|
87
|
+
this.avgDocLength = this.docCount > 0 ? totalLength / this.docCount : 0;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Public tokenizer — exportalt, hogy spec-ek + hivok ugyanazt a normalizalast
|
|
91
|
+
* tudjak hasznalni mint a corpus.
|
|
92
|
+
*/
|
|
93
|
+
static tokenize(text) {
|
|
94
|
+
if (typeof text !== 'string' || text.length === 0) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
return text.toLowerCase().match(TOKEN_REGEX) ?? [];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Visszaadja a corpus dokumentum-szamat (NEM-ures docok).
|
|
101
|
+
*/
|
|
102
|
+
size() {
|
|
103
|
+
return this.docCount;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* BM25 score minden dokumentumra a query-re.
|
|
107
|
+
*
|
|
108
|
+
* Ures query → minden score 0 (degenerate case; a hivo kezelje ha kell).
|
|
109
|
+
* Ures corpus → ures array.
|
|
110
|
+
*/
|
|
111
|
+
score(query) {
|
|
112
|
+
if (this.docCount === 0) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const queryTokens = DyNTS_LVS_BM25_Corpus.tokenize(query);
|
|
116
|
+
if (queryTokens.length === 0) {
|
|
117
|
+
// Minden doc 0 score-t kap
|
|
118
|
+
const results = [];
|
|
119
|
+
for (const id of this.docTokens.keys()) {
|
|
120
|
+
results.push({ id: id, score: 0 });
|
|
121
|
+
}
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
// Egyedi query-termek halmaza (ismetlodes nem ad nagyobb IDF-et)
|
|
125
|
+
const uniqueTerms = Array.from(new Set(queryTokens));
|
|
126
|
+
// Pre-compute IDF a query-termekre
|
|
127
|
+
const idfMap = new Map();
|
|
128
|
+
for (const term of uniqueTerms) {
|
|
129
|
+
const df = this.termDocFreq.get(term) ?? 0;
|
|
130
|
+
// BM25+ IDF: log((N - df + 0.5) / (df + 0.5) + 1)
|
|
131
|
+
const idf = Math.log((this.docCount - df + 0.5) / (df + 0.5) + 1);
|
|
132
|
+
idfMap.set(term, idf);
|
|
133
|
+
}
|
|
134
|
+
// Per-doc BM25 score
|
|
135
|
+
const results = [];
|
|
136
|
+
for (const [docId, docLen] of this.docLengths) {
|
|
137
|
+
let score = 0;
|
|
138
|
+
for (const term of uniqueTerms) {
|
|
139
|
+
const tf = this.termFreqByDoc.get(term)?.get(docId) ?? 0;
|
|
140
|
+
if (tf === 0) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const idf = idfMap.get(term) ?? 0;
|
|
144
|
+
const norm = 1 - BM25_B + BM25_B * (docLen / (this.avgDocLength || 1));
|
|
145
|
+
score += idf * (tf * (BM25_K1 + 1)) / (tf + BM25_K1 * norm);
|
|
146
|
+
}
|
|
147
|
+
results.push({ id: docId, score: score });
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.DyNTS_LVS_BM25_Corpus = DyNTS_LVS_BM25_Corpus;
|
|
153
|
+
/**
|
|
154
|
+
* Min-max normalizalas [0,1] tartomanyra. A hybrid score-merge-hez kell a BM25
|
|
155
|
+
* score-okat a candidate-szetten 0..1 sav-ba hozni (a cosine mar 0..1).
|
|
156
|
+
*
|
|
157
|
+
* Edge case-ek:
|
|
158
|
+
* - Ures array → [].
|
|
159
|
+
* - Minden score azonos (max-min === 0) → minden 0.0 (NEM 0.5 vagy 1.0; ha
|
|
160
|
+
* nincs diszkriminacio, ne tegyunk hozza signal-t).
|
|
161
|
+
* - Negativ score-ok (BM25+IDF garantal pozitivat, de defensive): a min-max
|
|
162
|
+
* ugyanugy mukodik.
|
|
163
|
+
*/
|
|
164
|
+
function dyNTS_LVS_BM25_minMaxNormalize(scores) {
|
|
165
|
+
if (!Array.isArray(scores) || scores.length === 0) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
let min = Infinity;
|
|
169
|
+
let max = -Infinity;
|
|
170
|
+
for (const s of scores) {
|
|
171
|
+
if (s.score < min) {
|
|
172
|
+
min = s.score;
|
|
173
|
+
}
|
|
174
|
+
if (s.score > max) {
|
|
175
|
+
max = s.score;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const range = max - min;
|
|
179
|
+
if (range === 0) {
|
|
180
|
+
// Nincs diszkriminacio — minden 0.0 (NEM huzzon le, NEM huzzon fel)
|
|
181
|
+
return scores.map((s) => ({
|
|
182
|
+
id: s.id, score: 0,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
return scores.map((s) => ({
|
|
186
|
+
id: s.id,
|
|
187
|
+
score: (s.score - min) / range,
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=lvs-bm25.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lvs-bm25.util.js","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-bm25.util.ts"],"names":[],"mappings":"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"}
|
package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.d.ts
CHANGED
|
@@ -89,10 +89,26 @@ export declare class DyNTS_LVS_VectorDataService<T extends DyFM_Metadata> extend
|
|
|
89
89
|
*/
|
|
90
90
|
filterBy?: DyFM_DBFilter<T>;
|
|
91
91
|
/**
|
|
92
|
-
* Search mode (cosine similarity
|
|
93
|
-
* Defaults to this.defaultSearchMode
|
|
92
|
+
* Search mode (cosine similarity, L2 distance, or hybrid).
|
|
93
|
+
* Defaults to this.defaultSearchMode.
|
|
94
|
+
*
|
|
95
|
+
* `hybrid` mode combines cosine similarity (vector half) with BM25
|
|
96
|
+
* text scoring (text half) — `textSearchKey` is REQUIRED in hybrid mode.
|
|
94
97
|
*/
|
|
95
98
|
searchMode?: LVS_Search_Mode;
|
|
99
|
+
/**
|
|
100
|
+
* Csak `hybrid` modban — weighted score-merge a cosine es a BM25 kozott.
|
|
101
|
+
* Default: { vector: 0.5, text: 0.5 }. Mindkettonek 0..1 tartomany javasolt.
|
|
102
|
+
*/
|
|
103
|
+
hybridWeight?: {
|
|
104
|
+
vector: number;
|
|
105
|
+
text: number;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Csak `hybrid` modban — KOTELEZO; melyik string property-n fut a BM25
|
|
109
|
+
* text-search. NEM kell hogy a vectorized property legyen.
|
|
110
|
+
*/
|
|
111
|
+
textSearchKey?: keyof T;
|
|
96
112
|
}): Promise<T[]>;
|
|
97
113
|
}
|
|
98
114
|
/**
|
package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lvs-local-vector-search.data-service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAErB,aAAa,EACb,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"lvs-local-vector-search.data-service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAErB,aAAa,EACb,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAQjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2EAA2E,CAAC;AAGxH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,2BAA2B,CAAC,CAAC,SAAS,aAAa,CAAE,SAAQ,2BAA2B,CAAC,CAAC,CAAC;IAEtG;;;OAGG;IACH,iBAAiB,EAAE,eAAe,CAAoC;IAEtE;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAQ;IAEnC;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAsE;;IAGtF;;OAEG;IACH,IAAI,EAAE,CAAC;IACP;;OAEG;IACH,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACpC;;OAEG;IACH,cAAc,EAAE,iBAAiB;IACjC;;OAEG;IACH,MAAM,EAAE,MAAM;IAKhB;;;;;;;;;;;;;OAaG;IACY,YAAY,CACzB,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,iDAAiD;QACjD,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;;WAGG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B;;WAEG;QACH,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;QAC5B;;;;;;WAMG;QACH,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B;;;WAGG;QACH,YAAY,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAChD;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;KACzB,GACA,OAAO,CAAC,CAAC,EAAE,CAAC;CAuPhB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG"}
|
package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.DyNTS_LVS_VectorDataService = void 0;
|
|
|
4
4
|
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
5
|
const lvs_search_mode_enum_1 = require("../_enums/lvs-search-mode.enum");
|
|
6
6
|
const lvs_vector_pool_control_service_1 = require("./lvs-vector-pool.control-service");
|
|
7
|
+
const lvs_bm25_util_1 = require("./lvs-bm25.util");
|
|
7
8
|
const oai_vector_data_service_1 = require("../../ai/_modules/open-ai/_services/data-services/oai-vector-data.service");
|
|
8
9
|
const global_settings_const_1 = require("../../../_collections/global-settings.const");
|
|
9
10
|
/**
|
|
@@ -89,7 +90,26 @@ class DyNTS_LVS_VectorDataService extends oai_vector_data_service_1.DyNTS_OAI_Ve
|
|
|
89
90
|
});
|
|
90
91
|
}
|
|
91
92
|
set.limit ??= 3;
|
|
92
|
-
const { input, searchInKey, limit, filterBy, searchMode } = set;
|
|
93
|
+
const { input, searchInKey, limit, filterBy, searchMode, hybridWeight, textSearchKey } = set;
|
|
94
|
+
const effectiveMode = searchMode ?? this.defaultSearchMode;
|
|
95
|
+
// Hybrid mode korai validacio
|
|
96
|
+
if (effectiveMode === lvs_search_mode_enum_1.LVS_Search_Mode.hybrid) {
|
|
97
|
+
if (!textSearchKey) {
|
|
98
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
99
|
+
...this.getDefaultErrorSettings('vectorSearch', new Error('textSearchKey is required when searchMode is hybrid')),
|
|
100
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-LVS-VS4`,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (hybridWeight) {
|
|
104
|
+
const w = hybridWeight;
|
|
105
|
+
if (!Number.isFinite(w.vector) || !Number.isFinite(w.text) || w.vector < 0 || w.text < 0) {
|
|
106
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
107
|
+
...this.getDefaultErrorSettings('vectorSearch', new Error('hybridWeight.vector and .text must be non-negative finite numbers')),
|
|
108
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-LVS-VS5`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
93
113
|
// Validáljuk, hogy a searchInKey létezik-e
|
|
94
114
|
const property = this.dataParams.properties[searchInKey];
|
|
95
115
|
if (!property) {
|
|
@@ -175,11 +195,45 @@ class DyNTS_LVS_VectorDataService extends oai_vector_data_service_1.DyNTS_OAI_Ve
|
|
|
175
195
|
}
|
|
176
196
|
const queryVector = await this.vectorize(input, property.embeddingModel);
|
|
177
197
|
// 4. Végrehajtjuk a local vector search-t
|
|
178
|
-
const mode =
|
|
198
|
+
const mode = effectiveMode;
|
|
179
199
|
if (this.debugLog) {
|
|
180
200
|
fsm_dynamo_1.DyFM_Log.log(`Local vector search: searching with mode "${mode}", limit: ${limit}...`);
|
|
181
201
|
}
|
|
182
|
-
|
|
202
|
+
let searchResults;
|
|
203
|
+
if (mode === lvs_search_mode_enum_1.LVS_Search_Mode.hybrid) {
|
|
204
|
+
// Hybrid: cosine ALL candidate-re + BM25 ALL candidate-re + min-max norm + weighted sum
|
|
205
|
+
const allCandidatesCosine = this.vectorPool.search(queryVector, dataMap.size, lvs_search_mode_enum_1.LVS_Search_Mode.cosineSimilarity);
|
|
206
|
+
// BM25 corpus epitese a `textSearchKey` property-bol
|
|
207
|
+
const docs = [];
|
|
208
|
+
for (const [docId, dataItem] of dataMap) {
|
|
209
|
+
const textValue = dataItem[textSearchKey];
|
|
210
|
+
docs.push({
|
|
211
|
+
id: docId,
|
|
212
|
+
text: typeof textValue === 'string' ? textValue : '',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const bm25Corpus = new lvs_bm25_util_1.DyNTS_LVS_BM25_Corpus(docs);
|
|
216
|
+
const bm25Raw = bm25Corpus.score(input);
|
|
217
|
+
const bm25Normalized = (0, lvs_bm25_util_1.dyNTS_LVS_BM25_minMaxNormalize)(bm25Raw);
|
|
218
|
+
const bm25ScoreById = new Map();
|
|
219
|
+
for (const s of bm25Normalized) {
|
|
220
|
+
bm25ScoreById.set(s.id, s.score);
|
|
221
|
+
}
|
|
222
|
+
const wVector = hybridWeight?.vector ?? 0.5;
|
|
223
|
+
const wText = hybridWeight?.text ?? 0.5;
|
|
224
|
+
const merged = allCandidatesCosine.map((c) => {
|
|
225
|
+
const bm25Score = bm25ScoreById.get(c.id) ?? 0;
|
|
226
|
+
return {
|
|
227
|
+
id: c.id,
|
|
228
|
+
score: wVector * c.score + wText * bm25Score,
|
|
229
|
+
};
|
|
230
|
+
});
|
|
231
|
+
merged.sort((a, b) => b.score - a.score);
|
|
232
|
+
searchResults = merged.slice(0, limit);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
searchResults = this.vectorPool.search(queryVector, limit, mode);
|
|
236
|
+
}
|
|
183
237
|
if (this.debugLog) {
|
|
184
238
|
fsm_dynamo_1.DyFM_Log.log(`Local vector search: found ${searchResults.length} results`);
|
|
185
239
|
}
|
package/build/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lvs-local-vector-search.data-service.js","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts"],"names":[],"mappings":";;;AAAA,sDAA6D;AAS7D,yEAAiE;AAEjE,uFAAkF;AAClF,uHAAwH;AACxH,uFAAoF;AAEpF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAa,2BAAqD,SAAQ,qDAA8B;IAEtG;;;OAGG;IACH,iBAAiB,GAAoB,sCAAe,CAAC,gBAAgB,CAAC;IAEtE;;;OAGG;IACH,kBAAkB,GAAY,IAAI,CAAC;IAEnC;;;OAGG;IACK,UAAU,GAAkC,IAAI,+DAA6B,EAAE,CAAC;IAExF;IACE;;OAEG;IACH,IAAO;IACP;;OAEG;IACH,UAAoC;IACpC;;OAEG;IACH,cAAiC;IACjC;;OAEG;IACH,MAAc;QAEd,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACM,KAAK,CAAC,YAAY,CACzB,
|
|
1
|
+
{"version":3,"file":"lvs-local-vector-search.data-service.js","sourceRoot":"","sources":["../../../../src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { DyFM_AnyError, DyFM_BasicProperty_Type, DyFM_DataModel_Params, DyFM_DBFilter, DyFM_DSSort, DyFM_Error_Settings, DyFM_Metadata, DyFM_RangeValue, DyFM_SearchQuery, DyFM_SearchResult, DyFM_SpecialSearch } from '@futdevpro/fsm-dynamo';
|
|
2
|
+
import { DyNTS_CompareData_Options } from '../../_models/interfaces/compare-data-options.interface';
|
|
3
|
+
import { DyNTS_CompareData_Result } from '../../_models/interfaces/compare-data-result.interface';
|
|
2
4
|
import { DyNTS_DBUpdate } from '../../_models/types/db-update.type';
|
|
3
5
|
import { DyNTS_ArchiveDataService } from './archive-data.service';
|
|
4
6
|
import { DyNTS_DBService } from './db.service';
|
|
@@ -315,5 +317,66 @@ export declare class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
315
317
|
protected getDefaultErrorSettings(fnName: string, error: DyFM_AnyError,
|
|
316
318
|
/** @deprecated we wont support the separate user message in the future, use the message instead */
|
|
317
319
|
useMessageAsUserMessage?: boolean): DyFM_Error_Settings;
|
|
320
|
+
/**
|
|
321
|
+
* Generic, field-szintu osszehasonlitas ket adat-objektum kozott.
|
|
322
|
+
*
|
|
323
|
+
* **Auto-discovery mod** (`options.fields` nelkul): a metodus mindket
|
|
324
|
+
* objektum kulcs-uniojan iter, KIVEVE a `DyFM_Metadata` skip-listet
|
|
325
|
+
* (`_id`, `__created`, `__createdBy`, `__lastModified`, `__lastModifiedBy`).
|
|
326
|
+
*
|
|
327
|
+
* **Scope-szukito mod** (`options.fields = [...]`): KIZAROLAG a felsorolt
|
|
328
|
+
* mezoket vizsgalja. A skip-list IGNORALODIK — explicit fields override.
|
|
329
|
+
*
|
|
330
|
+
* **Custom comparator** (`options.customComparators`): per-field override
|
|
331
|
+
* a default deep-equal helyett (pl. set-equality array-ekre,
|
|
332
|
+
* case-insensitive string compare-re). A custom function `true`-val signal-ozza
|
|
333
|
+
* az equality-t.
|
|
334
|
+
*
|
|
335
|
+
* **Return:** `'equal'` ha minden vizsgalt field egyezik; `'modified'` ha
|
|
336
|
+
* legalabb egy elter — ilyenkor `changedFields` tartalmazza a TELJES
|
|
337
|
+
* mismatch-listat (nem early-return).
|
|
338
|
+
*
|
|
339
|
+
* **Throws:**
|
|
340
|
+
* - `newData` vagy `oldData` null/undefined → `DyFM_Error(400, DyNTS-DS0-CD1)`
|
|
341
|
+
* - `options.fields = []` ures array → `DyFM_Error(400, DyNTS-DS0-CD2)`
|
|
342
|
+
*
|
|
343
|
+
* **Sync method** (nincs I/O szukseglet); a host wrappel-i ha async kell.
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* const result = userService.compareData(newUser, oldUser);
|
|
347
|
+
* if (result.result === 'modified') {
|
|
348
|
+
* console.log('Changed:', result.changedFields);
|
|
349
|
+
* }
|
|
350
|
+
*
|
|
351
|
+
* @example // Scope-szukites + custom comparator
|
|
352
|
+
* userService.compareData(newUser, oldUser, {
|
|
353
|
+
* fields: ['email', 'roles'],
|
|
354
|
+
* customComparators: {
|
|
355
|
+
* roles: (a, b) => new Set(a).size === new Set([...a, ...b]).size,
|
|
356
|
+
* },
|
|
357
|
+
* });
|
|
358
|
+
*/
|
|
359
|
+
compareData(newData: T, oldData: T, options?: DyNTS_CompareData_Options<T>): DyNTS_CompareData_Result<T>;
|
|
360
|
+
/**
|
|
361
|
+
* Eldonti az osszehasonlitando fields-listat:
|
|
362
|
+
* - explicit `options.fields` esetan annak masolata (skip-list ignoralt)
|
|
363
|
+
* - egyebkent `Object.keys(newData) UNION Object.keys(oldData)` minus skip-list
|
|
364
|
+
*/
|
|
365
|
+
private _resolveCompareFields;
|
|
366
|
+
/**
|
|
367
|
+
* Deep-equal helper.
|
|
368
|
+
*
|
|
369
|
+
* - Primitive (`string`/`number`/`boolean`/`null`/`undefined`): `===` / `Object.is`
|
|
370
|
+
* (a `NaN === NaN` esetet `Object.is` kezeli helyesen)
|
|
371
|
+
* - `Date`: `.getTime()` egyenloseg (kulonbozo Date instance-ok same-time-mal egyenlonek)
|
|
372
|
+
* - Array: length + index-szerinti rekurziv deep-equal
|
|
373
|
+
* - POJO: keys-union + per-key rekurzio
|
|
374
|
+
* - Egyeb (RegExp / Map / Set / Buffer): `Object.is` fallback (reference compare)
|
|
375
|
+
*
|
|
376
|
+
* NEM kezelt: cyclic references — a hivo objektum-grafja flat / fa kell legyen
|
|
377
|
+
* (a tipikus FDP data-model esete; cycle eseten stack overflow lesz, ami ertelmes
|
|
378
|
+
* jelzes a programozonak).
|
|
379
|
+
*/
|
|
380
|
+
private _deepEqual;
|
|
318
381
|
}
|
|
319
382
|
//# sourceMappingURL=data.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/data.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAEb,uBAAuB,EACvB,qBAAqB,EAGrB,aAAa,EAIb,WAAW,EAEX,mBAAmB,EAGnB,aAAa,EAGb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAInB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/data.service.ts"],"names":[],"mappings":"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"}
|