@frogbotai/db-mongodb 0.29.0 → 0.30.0
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/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/jobIndexes.js +20 -12
- package/dist/jobIndexes.js.map +1 -1
- package/dist/jobLogs.js +35 -4
- package/dist/jobLogs.js.map +1 -1
- package/dist/jobModel.js +29 -12
- package/dist/jobModel.js.map +1 -1
- package/dist/search/buildSchema.js +15 -9
- package/dist/search/buildSchema.js.map +1 -1
- package/dist/search/buildSearchIndexes.js +135 -55
- package/dist/search/buildSearchIndexes.js.map +1 -1
- package/dist/search/capabilities.js +12 -15
- package/dist/search/capabilities.js.map +1 -1
- package/dist/search/createSearchSetupError.js +12 -5
- package/dist/search/createSearchSetupError.js.map +1 -1
- package/dist/search/ensureSearchIndexes.js +35 -20
- package/dist/search/ensureSearchIndexes.js.map +1 -1
- package/dist/search/findSearchIndex.js +3 -2
- package/dist/search/findSearchIndex.js.map +1 -1
- package/dist/search/getSearchIndexes.js +2 -1
- package/dist/search/getSearchIndexes.js.map +1 -1
- package/dist/search/getSearchModel.js +2 -1
- package/dist/search/getSearchModel.js.map +1 -1
- package/dist/search/getSearchPath.js +17 -13
- package/dist/search/getSearchPath.js.map +1 -1
- package/dist/search/index.js +2 -1
- package/dist/search/index.js.map +1 -1
- package/dist/search/isDraftSearch.js +2 -1
- package/dist/search/isDraftSearch.js.map +1 -1
- package/dist/search/isSearchIndexDefinitionEqual.js +26 -19
- package/dist/search/isSearchIndexDefinitionEqual.js.map +1 -1
- package/dist/search/pipelines/buildHybridPipeline.js +147 -40
- package/dist/search/pipelines/buildHybridPipeline.js.map +1 -1
- package/dist/search/pipelines/buildSearchStage.js +17 -5
- package/dist/search/pipelines/buildSearchStage.js.map +1 -1
- package/dist/search/pipelines/buildVectorScore.js +24 -4
- package/dist/search/pipelines/buildVectorScore.js.map +1 -1
- package/dist/search/pipelines/buildVectorSearchStage.js +15 -7
- package/dist/search/pipelines/buildVectorSearchStage.js.map +1 -1
- package/dist/search/queries/buildSearchFilter.js +13 -6
- package/dist/search/queries/buildSearchFilter.js.map +1 -1
- package/dist/search/queries/buildSearchOperator.js +41 -8
- package/dist/search/queries/buildSearchOperator.js.map +1 -1
- package/dist/search/queries/buildVectorSearchFilter.js +32 -8
- package/dist/search/queries/buildVectorSearchFilter.js.map +1 -1
- package/dist/search/queries/parseSearchFilter.js +125 -56
- package/dist/search/queries/parseSearchFilter.js.map +1 -1
- package/dist/search/readiness.js +23 -12
- package/dist/search/readiness.js.map +1 -1
- package/dist/search/search.js +180 -76
- package/dist/search/search.js.map +1 -1
- package/dist/search/supportsRankFusion.js +29 -10
- package/dist/search/supportsRankFusion.js.map +1 -1
- package/dist/search/types.js +2 -1
- package/dist/search/types.js.map +1 -1
- package/dist/updateJobLeases.js +20 -5
- package/dist/updateJobLeases.js.map +1 -1
- package/dist/updateJobs.js +79 -30
- package/dist/updateJobs.js.map +1 -1
- package/package.json +4 -4
package/dist/search/search.js
CHANGED
|
@@ -6,40 +6,75 @@ import { isDraftSearch } from './isDraftSearch.js';
|
|
|
6
6
|
import { buildHybridPipeline } from './pipelines/buildHybridPipeline.js';
|
|
7
7
|
import { buildSearchStage } from './pipelines/buildSearchStage.js';
|
|
8
8
|
import { buildVectorScore } from './pipelines/buildVectorScore.js';
|
|
9
|
-
import { buildVectorSearchStage, isApproximateVectorSearch
|
|
9
|
+
import { buildVectorSearchStage, isApproximateVectorSearch } from './pipelines/buildVectorSearchStage.js';
|
|
10
10
|
import { buildSearchFilter } from './queries/buildSearchFilter.js';
|
|
11
11
|
import { buildSearchOperator } from './queries/buildSearchOperator.js';
|
|
12
12
|
import { buildVectorSearchFilter } from './queries/buildVectorSearchFilter.js';
|
|
13
13
|
import { supportsRankFusion } from './supportsRankFusion.js';
|
|
14
14
|
const distinctParentStages = [
|
|
15
|
-
{
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
{
|
|
16
|
+
$sort: {
|
|
17
|
+
score: -1,
|
|
18
|
+
id: 1
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
$group: {
|
|
23
|
+
_id: '$id',
|
|
24
|
+
row: {
|
|
25
|
+
$first: '$$ROOT'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
$replaceRoot: {
|
|
31
|
+
newRoot: '$row'
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
$sort: {
|
|
36
|
+
score: -1,
|
|
37
|
+
id: 1
|
|
38
|
+
}
|
|
39
|
+
}
|
|
19
40
|
];
|
|
20
|
-
function getRanking({ approximate, index, mode
|
|
41
|
+
function getRanking({ approximate, index, mode }) {
|
|
21
42
|
const lexical = {
|
|
22
43
|
method: 'mongodb-search',
|
|
23
44
|
higherIsBetter: true,
|
|
24
|
-
approximate: false
|
|
45
|
+
approximate: false
|
|
25
46
|
};
|
|
26
47
|
const vector = {
|
|
27
48
|
method: approximate ? 'mongodb-hnsw' : 'mongodb-exact',
|
|
28
49
|
higherIsBetter: index.vector?.metric !== 'euclidean',
|
|
50
|
+
approximate
|
|
51
|
+
};
|
|
52
|
+
if (mode === 'lexical') return lexical;
|
|
53
|
+
if (mode === 'vector') return vector;
|
|
54
|
+
return {
|
|
55
|
+
method: 'rrf',
|
|
56
|
+
higherIsBetter: true,
|
|
29
57
|
approximate,
|
|
58
|
+
components: {
|
|
59
|
+
lexical,
|
|
60
|
+
vector
|
|
61
|
+
}
|
|
30
62
|
};
|
|
31
|
-
if (mode === 'lexical')
|
|
32
|
-
return lexical;
|
|
33
|
-
if (mode === 'vector')
|
|
34
|
-
return vector;
|
|
35
|
-
return { method: 'rrf', higherIsBetter: true, approximate, components: { lexical, vector } };
|
|
36
63
|
}
|
|
37
|
-
function buildScoreStage({ index, mode
|
|
38
|
-
if (mode === 'lexical')
|
|
39
|
-
return undefined;
|
|
64
|
+
function buildScoreStage({ index, mode }) {
|
|
65
|
+
if (mode === 'lexical') return undefined;
|
|
40
66
|
const { metric } = index.vector;
|
|
41
67
|
if (mode === 'vector') {
|
|
42
|
-
return {
|
|
68
|
+
return {
|
|
69
|
+
$project: {
|
|
70
|
+
_id: 0,
|
|
71
|
+
id: 1,
|
|
72
|
+
score: buildVectorScore({
|
|
73
|
+
metric,
|
|
74
|
+
score: '$score'
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
};
|
|
43
78
|
}
|
|
44
79
|
return {
|
|
45
80
|
$project: {
|
|
@@ -49,77 +84,141 @@ function buildScoreStage({ index, mode, }) {
|
|
|
49
84
|
lexical: 1,
|
|
50
85
|
vector: {
|
|
51
86
|
$cond: [
|
|
52
|
-
{
|
|
87
|
+
{
|
|
88
|
+
$eq: [
|
|
89
|
+
{
|
|
90
|
+
$ifNull: [
|
|
91
|
+
'$vector',
|
|
92
|
+
null
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
null
|
|
96
|
+
]
|
|
97
|
+
},
|
|
53
98
|
null,
|
|
54
|
-
{
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
99
|
+
{
|
|
100
|
+
rank: '$vector.rank',
|
|
101
|
+
score: buildVectorScore({
|
|
102
|
+
metric,
|
|
103
|
+
score: '$vector.score'
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
58
109
|
};
|
|
59
110
|
}
|
|
60
111
|
function getComponent(component) {
|
|
61
|
-
if (!component || typeof component !== 'object')
|
|
62
|
-
return null;
|
|
112
|
+
if (!component || typeof component !== 'object') return null;
|
|
63
113
|
const { rank, score } = component;
|
|
64
|
-
return {
|
|
114
|
+
return {
|
|
115
|
+
rank: Number(rank),
|
|
116
|
+
score: Number(score)
|
|
117
|
+
};
|
|
65
118
|
}
|
|
66
|
-
export const search = async ({ candidates, collection, db, draft, index, limit, locale: requestedLocale, mode, query, where
|
|
119
|
+
export const search = async ({ candidates, collection, db, draft, index, limit, locale: requestedLocale, mode, query, where })=>{
|
|
67
120
|
const adapter = db;
|
|
68
121
|
const { localization } = adapter.payload.config;
|
|
69
122
|
const locale = requestedLocale ?? (localization ? localization.defaultLocale : undefined);
|
|
70
|
-
const versions = isDraftSearch({
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
123
|
+
const versions = isDraftSearch({
|
|
124
|
+
adapter,
|
|
125
|
+
collection,
|
|
126
|
+
draft
|
|
127
|
+
});
|
|
128
|
+
const searchIndexes = getSearchIndexes(adapter).filter((searchIndex)=>searchIndex.collection === collection && searchIndex.index === index.name && searchIndex.versions === versions);
|
|
74
129
|
if (!searchIndexes.length) {
|
|
75
130
|
throw new SearchReadinessError(`Search index '${index.name}' is not set up for collection '${collection}'. Restart to apply search configuration changes.`);
|
|
76
131
|
}
|
|
77
|
-
const lexicalIndex = searchIndexes.find((searchIndex)
|
|
78
|
-
const vectorIndex = searchIndexes.find((searchIndex)
|
|
132
|
+
const lexicalIndex = searchIndexes.find((searchIndex)=>searchIndex.mode === 'lexical');
|
|
133
|
+
const vectorIndex = searchIndexes.find((searchIndex)=>searchIndex.mode === 'vector');
|
|
79
134
|
const depth = Math.max(limit, candidates ?? limit);
|
|
80
135
|
const vectorLimit = mode === 'hybrid' ? depth : limit;
|
|
81
|
-
const approximate = mode !== 'lexical' &&
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return { ranking, rows: [] };
|
|
87
|
-
const Model = getSearchModel({ adapter, collection, versions });
|
|
88
|
-
const fields = getSearchFields({ adapter, collection, versions });
|
|
89
|
-
const idPath = versions ? 'parent' : '_id';
|
|
90
|
-
const getPath = (path) => getSearchPath({ adapter, collection, fields, locale, path, versions }).path;
|
|
91
|
-
const getSearchPipeline = (searchLimit) => [
|
|
92
|
-
buildSearchStage({
|
|
93
|
-
filter: filter === true ? undefined : buildSearchOperator(filter),
|
|
94
|
-
name: lexicalIndex.name,
|
|
95
|
-
paths: index.lexical.fields.map(({ path }) => getPath(path)),
|
|
96
|
-
text: query.text,
|
|
97
|
-
}),
|
|
98
|
-
{ $limit: searchLimit },
|
|
99
|
-
];
|
|
100
|
-
const getVectorSearchStage = () => buildVectorSearchStage({
|
|
136
|
+
const approximate = mode !== 'lexical' && isApproximateVectorSearch({
|
|
137
|
+
approximate: index.vector.approximate,
|
|
138
|
+
limit: vectorLimit
|
|
139
|
+
});
|
|
140
|
+
const ranking = getRanking({
|
|
101
141
|
approximate,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
142
|
+
index,
|
|
143
|
+
mode
|
|
144
|
+
});
|
|
145
|
+
const filter = await buildSearchFilter({
|
|
146
|
+
adapter,
|
|
147
|
+
locale,
|
|
148
|
+
searchIndex: searchIndexes[0],
|
|
149
|
+
where
|
|
108
150
|
});
|
|
151
|
+
if (filter === false) return {
|
|
152
|
+
ranking,
|
|
153
|
+
rows: []
|
|
154
|
+
};
|
|
155
|
+
const Model = getSearchModel({
|
|
156
|
+
adapter,
|
|
157
|
+
collection,
|
|
158
|
+
versions
|
|
159
|
+
});
|
|
160
|
+
const fields = getSearchFields({
|
|
161
|
+
adapter,
|
|
162
|
+
collection,
|
|
163
|
+
versions
|
|
164
|
+
});
|
|
165
|
+
const idPath = versions ? 'parent' : '_id';
|
|
166
|
+
const getPath = (path)=>getSearchPath({
|
|
167
|
+
adapter,
|
|
168
|
+
collection,
|
|
169
|
+
fields,
|
|
170
|
+
locale,
|
|
171
|
+
path,
|
|
172
|
+
versions
|
|
173
|
+
}).path;
|
|
174
|
+
const getSearchPipeline = (searchLimit)=>[
|
|
175
|
+
buildSearchStage({
|
|
176
|
+
filter: filter === true ? undefined : buildSearchOperator(filter),
|
|
177
|
+
name: lexicalIndex.name,
|
|
178
|
+
paths: index.lexical.fields.map(({ path })=>getPath(path)),
|
|
179
|
+
text: query.text
|
|
180
|
+
}),
|
|
181
|
+
{
|
|
182
|
+
$limit: searchLimit
|
|
183
|
+
}
|
|
184
|
+
];
|
|
185
|
+
const getVectorSearchStage = ()=>buildVectorSearchStage({
|
|
186
|
+
approximate,
|
|
187
|
+
candidates: depth,
|
|
188
|
+
filter: filter === true ? undefined : buildVectorSearchFilter(filter),
|
|
189
|
+
limit: vectorLimit,
|
|
190
|
+
name: vectorIndex.name,
|
|
191
|
+
path: getPath(index.vector.path),
|
|
192
|
+
vector: query.vector
|
|
193
|
+
});
|
|
109
194
|
let pipeline;
|
|
110
195
|
if (mode === 'lexical') {
|
|
111
196
|
pipeline = [
|
|
112
197
|
...getSearchPipeline(limit),
|
|
113
|
-
{
|
|
198
|
+
{
|
|
199
|
+
$project: {
|
|
200
|
+
_id: 0,
|
|
201
|
+
id: `$${idPath}`,
|
|
202
|
+
score: {
|
|
203
|
+
$meta: 'searchScore'
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
114
207
|
];
|
|
115
|
-
}
|
|
116
|
-
else if (mode === 'vector') {
|
|
208
|
+
} else if (mode === 'vector') {
|
|
117
209
|
pipeline = [
|
|
118
210
|
getVectorSearchStage(),
|
|
119
|
-
{
|
|
211
|
+
{
|
|
212
|
+
$project: {
|
|
213
|
+
_id: 0,
|
|
214
|
+
id: `$${idPath}`,
|
|
215
|
+
score: {
|
|
216
|
+
$meta: 'vectorSearchScore'
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
120
220
|
];
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
221
|
+
} else {
|
|
123
222
|
pipeline = buildHybridPipeline({
|
|
124
223
|
collection: Model.collection.name,
|
|
125
224
|
idPath,
|
|
@@ -127,24 +226,29 @@ export const search = async ({ candidates, collection, db, draft, index, limit,
|
|
|
127
226
|
rankFusion: await supportsRankFusion(Model),
|
|
128
227
|
searchPipeline: getSearchPipeline(depth),
|
|
129
228
|
vectorSearchStage: getVectorSearchStage(),
|
|
130
|
-
weights: index.hybrid.weights
|
|
229
|
+
weights: index.hybrid.weights
|
|
131
230
|
});
|
|
132
231
|
}
|
|
133
|
-
if (versions)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
232
|
+
if (versions) pipeline.push(...distinctParentStages);
|
|
233
|
+
const scoreStage = buildScoreStage({
|
|
234
|
+
index,
|
|
235
|
+
mode
|
|
236
|
+
});
|
|
237
|
+
if (scoreStage) pipeline.push(scoreStage);
|
|
138
238
|
const rows = await Model.aggregate(pipeline).exec();
|
|
139
239
|
return {
|
|
140
240
|
ranking,
|
|
141
|
-
rows: rows.map(({ id, lexical, score, vector })
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
241
|
+
rows: rows.map(({ id, lexical, score, vector })=>({
|
|
242
|
+
id: typeof id === 'number' ? id : String(id),
|
|
243
|
+
score,
|
|
244
|
+
...mode === 'hybrid' ? {
|
|
245
|
+
components: {
|
|
246
|
+
lexical: getComponent(lexical),
|
|
247
|
+
vector: getComponent(vector)
|
|
248
|
+
}
|
|
249
|
+
} : {}
|
|
250
|
+
}))
|
|
148
251
|
};
|
|
149
252
|
};
|
|
253
|
+
|
|
150
254
|
//# sourceMappingURL=search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/search/search.ts"],"names":["SearchReadinessError","getSearchIndexes","getSearchModel","getSearchFields","getSearchPath","isDraftSearch","buildHybridPipeline","buildSearchStage","buildVectorScore","buildVectorSearchStage","isApproximateVectorSearch","buildSearchFilter","buildSearchOperator","buildVectorSearchFilter","supportsRankFusion","distinctParentStages","$sort","score","id","$group","_id","row","$first","$replaceRoot","newRoot","getRanking","approximate","index","mode","lexical","method","higherIsBetter","vector","metric","components","buildScoreStage","undefined","$project","$cond","$eq","$ifNull","rank","getComponent","component","Number","search","candidates","collection","db","draft","limit","locale","requestedLocale","query","where","adapter","localization","payload","config","defaultLocale","versions","searchIndexes","filter","searchIndex","name","length","lexicalIndex","find","vectorIndex","depth","Math","max","vectorLimit","ranking","rows","Model","fields","idPath","getPath","path","getSearchPipeline","searchLimit","paths","map","text","$limit","getVectorSearchStage","pipeline","$meta","rankFusion","searchPipeline","vectorSearchStage","weights","hybrid","push","scoreStage","aggregate","exec","String"],"mappings":"AASA,SAASA,oBAAoB,QAAQ,iBAAiB;AAEtD,SAASC,gBAAgB,QAAQ,wBAAwB;AAEzD,SAASC,cAAc,QAAQ,sBAAsB;AACrD,SAASC,eAAe,EAAEC,aAAa,QAAQ,qBAAqB;AACpE,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,mBAAmB,QAAQ,qCAAqC;AACzE,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SACEC,sBAAsB,EACtBC,yBAAyB,QACpB,wCAAwC;AAC/C,SAASC,iBAAiB,QAAQ,iCAAiC;AACnE,SAASC,mBAAmB,QAAQ,mCAAmC;AACvE,SAASC,uBAAuB,QAAQ,uCAAuC;AAC/E,SAASC,kBAAkB,QAAQ,0BAA0B;AAS7D,MAAMC,uBAAuB;IAC3B;QAAEC,OAAO;YAAEC,OAAO,CAAC;YAAGC,IAAI;QAAE;IAAE;IAC9B;QAAEC,QAAQ;YAAEC,KAAK;YAAOC,KAAK;gBAAEC,QAAQ;YAAS;QAAE;IAAE;IACpD;QAAEC,cAAc;YAAEC,SAAS;QAAO;IAAE;IACpC;QAAER,OAAO;YAAEC,OAAO,CAAC;YAAGC,IAAI;QAAE;IAAE;CAC/B;AAED,SAASO,WAAW,EAClBC,WAAW,EACXC,KAAK,EACLC,IAAI,EAKL;IACC,MAAMC,UAAkC;QACtCC,QAAQ;QACRC,gBAAgB;QAChBL,aAAa;IACf;IAEA,MAAMM,SAAiC;QACrCF,QAAQJ,cAAc,iBAAiB;QACvCK,gBAAgBJ,MAAMK,MAAM,EAAEC,WAAW;QACzCP;IACF;IAEA,IAAIE,SAAS,WAAW,OAAOC;IAE/B,IAAID,SAAS,UAAU,OAAOI;IAE9B,OAAO;QAAEF,QAAQ;QAAOC,gBAAgB;QAAML;QAAaQ,YAAY;YAAEL;YAASG;QAAO;IAAE;AAC7F;AAEA,SAASG,gBAAgB,EACvBR,KAAK,EACLC,IAAI,EAIL;IACC,IAAIA,SAAS,WAAW,OAAOQ;IAE/B,MAAM,EAAEH,MAAM,EAAE,GAAGN,MAAMK,MAAM;IAE/B,IAAIJ,SAAS,UAAU;QACrB,OAAO;YAAES,UAAU;gBAAEjB,KAAK;gBAAGF,IAAI;gBAAGD,OAAOT,iBAAiB;oBAAEyB;oBAAQhB,OAAO;gBAAS;YAAG;QAAE;IAC7F;IAEA,OAAO;QACLoB,UAAU;YACRjB,KAAK;YACLF,IAAI;YACJD,OAAO;YACPY,SAAS;YACTG,QAAQ;gBACNM,OAAO;oBACL;wBAAEC,KAAK;4BAAC;gCAAEC,SAAS;oCAAC;oCAAW;iCAAK;4BAAC;4BAAG;yBAAK;oBAAC;oBAC9C;oBACA;wBAAEC,MAAM;wBAAgBxB,OAAOT,iBAAiB;4BAAEyB;4BAAQhB,OAAO;wBAAgB;oBAAG;iBACrF;YACH;QACF;IACF;AACF;AAEA,SAASyB,aAAaC,SAAkB;IACtC,IAAI,CAACA,aAAa,OAAOA,cAAc,UAAU,OAAO;IAExD,MAAM,EAAEF,IAAI,EAAExB,KAAK,EAAE,GAAG0B;IAExB,OAAO;QAAEF,MAAMG,OAAOH;QAAOxB,OAAO2B,OAAO3B;IAAO;AACpD;AAEA,OAAO,MAAM4B,SAAwB,OAAO,EAC1CC,UAAU,EACVC,UAAU,EACVC,EAAE,EACFC,KAAK,EACLtB,KAAK,EACLuB,KAAK,EACLC,QAAQC,eAAe,EACvBxB,IAAI,EACJyB,KAAK,EACLC,KAAK,EACN;IACC,MAAMC,UAAUP;IAChB,MAAM,EAAEQ,YAAY,EAAE,GAAGD,QAAQE,OAAO,CAACC,MAAM;IAC/C,MAAMP,SAASC,mBAAoBI,CAAAA,eAAeA,aAAaG,aAAa,GAAGvB,SAAQ;IACvF,MAAMwB,WAAWvD,cAAc;QAAEkD;QAASR;QAAYE;IAAM;IAE5D,MAAMY,gBAAgB5D,iBAAiBsD,SAASO,MAAM,CACpD,CAACC,cACCA,YAAYhB,UAAU,KAAKA,cAC3BgB,YAAYpC,KAAK,KAAKA,MAAMqC,IAAI,IAChCD,YAAYH,QAAQ,KAAKA;IAG7B,IAAI,CAACC,cAAcI,MAAM,EAAE;QACzB,MAAM,IAAIjE,qBACR,CAAC,cAAc,EAAE2B,MAAMqC,IAAI,CAAC,gCAAgC,EAAEjB,WAAW,iDAAiD,CAAC;IAE/H;IAEA,MAAMmB,eAAeL,cAAcM,IAAI,CAAC,CAACJ,cAAgBA,YAAYnC,IAAI,KAAK;IAC9E,MAAMwC,cAAcP,cAAcM,IAAI,CAAC,CAACJ,cAAgBA,YAAYnC,IAAI,KAAK;IAE7E,MAAMyC,QAAQC,KAAKC,GAAG,CAACrB,OAAOJ,cAAcI;IAC5C,MAAMsB,cAAc5C,SAAS,WAAWyC,QAAQnB;IAEhD,MAAMxB,cACJE,SAAS,aACTlB,0BAA0B;QAAEgB,aAAaC,MAAMK,MAAM,CAAEN,WAAW;QAAEwB,OAAOsB;IAAY;IAEzF,MAAMC,UAAUhD,WAAW;QAAEC;QAAaC;QAAOC;IAAK;IACtD,MAAMkC,SAAS,MAAMnD,kBAAkB;QAAE4C;QAASJ;QAAQY,aAAaF,aAAa,CAAC,EAAE;QAAEP;IAAM;IAE/F,IAAIQ,WAAW,OAAO,OAAO;QAAEW;QAASC,MAAM,EAAE;IAAC;IAEjD,MAAMC,QAAQzE,eAAe;QAAEqD;QAASR;QAAYa;IAAS;IAC7D,MAAMgB,SAASzE,gBAAgB;QAAEoD;QAASR;QAAYa;IAAS;IAC/D,MAAMiB,SAASjB,WAAW,WAAW;IAErC,MAAMkB,UAAU,CAACC,OACf3E,cAAc;YAAEmD;YAASR;YAAY6B;YAAQzB;YAAQ4B;YAAMnB;QAAS,GAAGmB,IAAI;IAE7E,MAAMC,oBAAoB,CAACC,cAAwB;YACjD1E,iBAAiB;gBACfuD,QAAQA,WAAW,OAAO1B,YAAYxB,oBAAoBkD;gBAC1DE,MAAME,aAAcF,IAAI;gBACxBkB,OAAOvD,MAAME,OAAO,CAAE+C,MAAM,CAACO,GAAG,CAAC,CAAC,EAAEJ,IAAI,EAAE,GAAKD,QAAQC;gBACvDK,MAAM/B,MAAM+B,IAAI;YAClB;YACA;gBAAEC,QAAQJ;YAAY;SACvB;IAED,MAAMK,uBAAuB,IAC3B7E,uBAAuB;YACrBiB;YACAoB,YAAYuB;YACZP,QAAQA,WAAW,OAAO1B,YAAYvB,wBAAwBiD;YAC9DZ,OAAOsB;YACPR,MAAMI,YAAaJ,IAAI;YACvBe,MAAMD,QAAQnD,MAAMK,MAAM,CAAE+C,IAAI;YAChC/C,QAAQqB,MAAMrB,MAAM;QACtB;IAEF,IAAIuD;IAEJ,IAAI3D,SAAS,WAAW;QACtB2D,WAAW;eACNP,kBAAkB9B;YACrB;gBAAEb,UAAU;oBAAEjB,KAAK;oBAAGF,IAAI,CAAC,CAAC,EAAE2D,QAAQ;oBAAE5D,OAAO;wBAAEuE,OAAO;oBAAc;gBAAE;YAAE;SAC3E;IACH,OAAO,IAAI5D,SAAS,UAAU;QAC5B2D,WAAW;YACTD;YACA;gBAAEjD,UAAU;oBAAEjB,KAAK;oBAAGF,IAAI,CAAC,CAAC,EAAE2D,QAAQ;oBAAE5D,OAAO;wBAAEuE,OAAO;oBAAoB;gBAAE;YAAE;SACjF;IACH,OAAO;QACLD,WAAWjF,oBAAoB;YAC7ByC,YAAY4B,MAAM5B,UAAU,CAACiB,IAAI;YACjCa;YACA3B;YACAuC,YAAY,MAAM3E,mBAAmB6D;YACrCe,gBAAgBV,kBAAkBX;YAClCsB,mBAAmBL;YACnBM,SAASjE,MAAMkE,MAAM,CAAED,OAAO;QAChC;IACF;IAEA,IAAIhC,UAAU2B,SAASO,IAAI,IAAI/E;IAE/B,MAAMgF,aAAa5D,gBAAgB;QAAER;QAAOC;IAAK;IAEjD,IAAImE,YAAYR,SAASO,IAAI,CAACC;IAE9B,MAAMrB,OAAoB,MAAMC,MAAMqB,SAAS,CAACT,UAAuCU,IAAI;IAE3F,OAAO;QACLxB;QACAC,MAAMA,KAAKS,GAAG,CAAC,CAAC,EAAEjE,EAAE,EAAEW,OAAO,EAAEZ,KAAK,EAAEe,MAAM,EAAE,GAAM,CAAA;gBAClDd,IAAI,OAAOA,OAAO,WAAWA,KAAKgF,OAAOhF;gBACzCD;gBACA,GAAIW,SAAS,WACT;oBAAEM,YAAY;wBAAEL,SAASa,aAAab;wBAAUG,QAAQU,aAAaV;oBAAQ;gBAAE,IAC/E,CAAC,CAAC;YACR,CAAA;IACF;AACF,EAAE","file":"search.js"}
|
|
@@ -1,25 +1,44 @@
|
|
|
1
1
|
import { getErrorCode } from './createSearchSetupError.js';
|
|
2
|
-
const unsupportedCodes = new Set([
|
|
2
|
+
const unsupportedCodes = new Set([
|
|
3
|
+
224,
|
|
4
|
+
40324
|
|
5
|
+
]);
|
|
3
6
|
const rankFusionSupport = new WeakMap();
|
|
4
7
|
export function supportsRankFusion(Model) {
|
|
5
8
|
const connection = Model.db;
|
|
6
9
|
const cached = rankFusionSupport.get(connection);
|
|
7
|
-
if (cached)
|
|
8
|
-
return cached;
|
|
10
|
+
if (cached) return cached;
|
|
9
11
|
const pipeline = [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
+
{
|
|
13
|
+
$rankFusion: {
|
|
14
|
+
input: {
|
|
15
|
+
pipelines: {
|
|
16
|
+
probe: [
|
|
17
|
+
{
|
|
18
|
+
$sort: {
|
|
19
|
+
_id: 1
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
$limit: 1
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
$limit: 1
|
|
32
|
+
}
|
|
12
33
|
];
|
|
13
|
-
const supported = Model.aggregate(pipeline)
|
|
14
|
-
.exec()
|
|
15
|
-
.then(() => true, (error) => {
|
|
34
|
+
const supported = Model.aggregate(pipeline).exec().then(()=>true, (error)=>{
|
|
16
35
|
const code = getErrorCode(error);
|
|
17
|
-
if (typeof code === 'number' && unsupportedCodes.has(code))
|
|
18
|
-
return false;
|
|
36
|
+
if (typeof code === 'number' && unsupportedCodes.has(code)) return false;
|
|
19
37
|
rankFusionSupport.delete(connection);
|
|
20
38
|
throw error;
|
|
21
39
|
});
|
|
22
40
|
rankFusionSupport.set(connection, supported);
|
|
23
41
|
return supported;
|
|
24
42
|
}
|
|
43
|
+
|
|
25
44
|
//# sourceMappingURL=supportsRankFusion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/search/supportsRankFusion.ts"],"names":["getErrorCode","unsupportedCodes","Set","rankFusionSupport","WeakMap","supportsRankFusion","Model","connection","db","cached","get","pipeline","$rankFusion","input","pipelines","probe","$sort","_id","$limit","supported","aggregate","exec","then","error","code","has","delete","set"],"mappings":"AAAA,SAASA,YAAY,QAAQ,8BAA8B;AAG3D,MAAMC,mBAAmB,IAAIC,IAAI;IAAC;IAAK;CAAM;AAE7C,MAAMC,oBAAoB,IAAIC;AAE9B,OAAO,SAASC,mBAAmBC,KAAkB;IACnD,MAAMC,aAAaD,MAAME,EAAE;IAC3B,MAAMC,SAASN,kBAAkBO,GAAG,CAACH;IAErC,IAAIE,QAAQ,OAAOA;IAEnB,MAAME,WAAW;QACf;YAAEC,aAAa;gBAAEC,OAAO;oBAAEC,WAAW;wBAAEC,OAAO;4BAAC;gCAAEC,OAAO;oCAAEC,KAAK;gCAAE;4BAAE;4BAAG;gCAAEC,QAAQ;4BAAE;yBAAE;oBAAC;gBAAE;YAAE;QAAE;QAC3F;YAAEA,QAAQ;QAAE;KACb;IAED,MAAMC,YAAYb,MAAMc,SAAS,CAACT,UAC/BU,IAAI,GACJC,IAAI,CACH,IAAM,MACN,CAACC;QACC,MAAMC,OAAOxB,aAAauB;QAE1B,IAAI,OAAOC,SAAS,YAAYvB,iBAAiBwB,GAAG,CAACD,OAAO,OAAO;QAEnErB,kBAAkBuB,MAAM,CAACnB;QAEzB,MAAMgB;IACR;IAGJpB,kBAAkBwB,GAAG,CAACpB,YAAYY;IAElC,OAAOA;AACT","file":"supportsRankFusion.js"}
|
package/dist/search/types.js
CHANGED
package/dist/search/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/search/types.ts"],"names":[],"mappings":"AA4BA,WAAsD","file":"types.js"}
|
package/dist/updateJobLeases.js
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import { getJobModel, getJobSession, transformJobUpdate } from './jobModel.js';
|
|
2
|
-
export async function updateJobLeases({ adapter, data, req, where
|
|
2
|
+
export async function updateJobLeases({ adapter, data, req, where }) {
|
|
3
3
|
if (req.payload !== adapter.payload) {
|
|
4
4
|
throw new Error('FrogBot job lease updates require a request for this runtime.');
|
|
5
5
|
}
|
|
6
6
|
const { Model } = getJobModel(adapter);
|
|
7
|
-
const query = await Model.buildQuery({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const query = await Model.buildQuery({
|
|
8
|
+
payload: adapter.payload,
|
|
9
|
+
where
|
|
10
|
+
});
|
|
11
|
+
const update = transformJobUpdate({
|
|
12
|
+
adapter,
|
|
13
|
+
data: {
|
|
14
|
+
...data
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const session = await getJobSession({
|
|
18
|
+
adapter,
|
|
19
|
+
req
|
|
20
|
+
});
|
|
21
|
+
await Model.updateMany(query, update, {
|
|
22
|
+
session,
|
|
23
|
+
timestamps: false
|
|
24
|
+
});
|
|
11
25
|
}
|
|
26
|
+
|
|
12
27
|
//# sourceMappingURL=updateJobLeases.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/updateJobLeases.ts"],"names":["getJobModel","getJobSession","transformJobUpdate","updateJobLeases","adapter","data","req","where","payload","Error","Model","query","buildQuery","update","session","updateMany","timestamps"],"mappings":"AAGA,SAASA,WAAW,EAAEC,aAAa,EAAEC,kBAAkB,QAAQ,gBAAgB;AAE/E,OAAO,eAAeC,gBAAgB,EACpCC,OAAO,EACPC,IAAI,EACJC,GAAG,EACHC,KAAK,EAC2C;IAChD,IAAID,IAAIE,OAAO,KAAKJ,QAAQI,OAAO,EAAE;QACnC,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAM,EAAEC,KAAK,EAAE,GAAGV,YAAYI;IAE9B,MAAMO,QAAQ,MAAMD,MAAME,UAAU,CAAC;QAAEJ,SAASJ,QAAQI,OAAO;QAAED;IAAM;IAEvE,MAAMM,SAASX,mBAAmB;QAAEE;QAASC,MAAM;YAAE,GAAGA,IAAI;QAAC;IAAE;IAE/D,MAAMS,UAAU,MAAMb,cAAc;QAAEG;QAASE;IAAI;IAEnD,MAAMI,MAAMK,UAAU,CAACJ,OAAOE,QAAQ;QAAEC;QAASE,YAAY;IAAM;AACrE","file":"updateJobLeases.js"}
|
package/dist/updateJobs.js
CHANGED
|
@@ -3,9 +3,8 @@ import { getJobClaimFields, getJobLeaseContext, recordJobClaims } from 'frogbot/
|
|
|
3
3
|
import { getJobModel, getJobSession, transformJobUpdate } from './jobModel.js';
|
|
4
4
|
export function createUpdateJobs(adapter) {
|
|
5
5
|
const updateJobs = adapter.updateJobs;
|
|
6
|
-
return async (args)
|
|
7
|
-
if (args.data.processing !== true)
|
|
8
|
-
return updateJobs.call(adapter, args);
|
|
6
|
+
return async (args)=>{
|
|
7
|
+
if (args.data.processing !== true) return updateJobs.call(adapter, args);
|
|
9
8
|
const context = getJobLeaseContext();
|
|
10
9
|
if (!context || context.payload !== adapter.payload) {
|
|
11
10
|
throw new Error('FrogBot job claims require an active jobs run for this runtime.');
|
|
@@ -15,43 +14,93 @@ export function createUpdateJobs(adapter) {
|
|
|
15
14
|
const where = {
|
|
16
15
|
and: [
|
|
17
16
|
args.where ?? {},
|
|
18
|
-
...
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
...id !== undefined ? [
|
|
18
|
+
{
|
|
19
|
+
id: {
|
|
20
|
+
equals: id
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
] : [],
|
|
24
|
+
{
|
|
25
|
+
processing: {
|
|
26
|
+
equals: false
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
21
30
|
};
|
|
22
|
-
const query = await Model.buildQuery({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
const query = await Model.buildQuery({
|
|
32
|
+
payload: adapter.payload,
|
|
33
|
+
where
|
|
34
|
+
});
|
|
35
|
+
const session = await getJobSession({
|
|
36
|
+
adapter,
|
|
37
|
+
req
|
|
38
|
+
});
|
|
39
|
+
const candidates = id !== undefined ? [
|
|
40
|
+
{
|
|
41
|
+
id
|
|
42
|
+
}
|
|
43
|
+
] : (await adapter.find({
|
|
44
|
+
collection: 'payload-jobs',
|
|
45
|
+
where,
|
|
46
|
+
sort,
|
|
47
|
+
limit: typeof limit === 'number' && limit > 0 ? limit : 0,
|
|
48
|
+
pagination: false,
|
|
49
|
+
select: {
|
|
50
|
+
id: true
|
|
51
|
+
},
|
|
52
|
+
req
|
|
53
|
+
})).docs;
|
|
54
|
+
const data = {
|
|
55
|
+
...args.data
|
|
56
|
+
};
|
|
57
|
+
if (!(Array.isArray(data.log) && data.log.length) && !(data.log && typeof data.log === 'object' && '$push' in data.log)) {
|
|
38
58
|
delete data.log;
|
|
39
59
|
}
|
|
40
|
-
const update = transformJobUpdate({
|
|
60
|
+
const update = transformJobUpdate({
|
|
61
|
+
adapter,
|
|
62
|
+
data
|
|
63
|
+
});
|
|
41
64
|
const result = [];
|
|
42
|
-
for (const candidate of candidates)
|
|
65
|
+
for (const candidate of candidates){
|
|
43
66
|
const candidateQuery = await Model.buildQuery({
|
|
44
67
|
payload: adapter.payload,
|
|
45
|
-
where: {
|
|
68
|
+
where: {
|
|
69
|
+
id: {
|
|
70
|
+
equals: candidate.id
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const doc = await Model.findOneAndUpdate({
|
|
75
|
+
$and: [
|
|
76
|
+
query,
|
|
77
|
+
candidateQuery
|
|
78
|
+
]
|
|
79
|
+
}, {
|
|
80
|
+
...update,
|
|
81
|
+
$set: {
|
|
82
|
+
...update.$set,
|
|
83
|
+
...getJobClaimFields()
|
|
84
|
+
}
|
|
85
|
+
}, {
|
|
86
|
+
session,
|
|
87
|
+
timestamps: false,
|
|
88
|
+
new: true
|
|
89
|
+
}).lean();
|
|
90
|
+
if (!doc) continue;
|
|
91
|
+
transform({
|
|
92
|
+
adapter,
|
|
93
|
+
data: doc,
|
|
94
|
+
fields,
|
|
95
|
+
operation: 'read'
|
|
46
96
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
transform({ adapter, data: doc, fields, operation: 'read' });
|
|
51
|
-
recordJobClaims([doc.id]);
|
|
97
|
+
recordJobClaims([
|
|
98
|
+
doc.id
|
|
99
|
+
]);
|
|
52
100
|
result.push(doc);
|
|
53
101
|
}
|
|
54
102
|
return returning === false ? null : result;
|
|
55
103
|
};
|
|
56
104
|
}
|
|
105
|
+
|
|
57
106
|
//# sourceMappingURL=updateJobs.js.map
|