queryAll method
Implementation
@override
Future<VectorSpaceResult> queryAll(
List<String> queries, {
int maxResults = 100,
int compactQueriesTo = 10,
int maxTokens = 50000,
}) async {
if (queries.isEmpty || await getCollection() == null) {
return const VectorSpaceResult(results: []);
}
queries = mergeQueries(queries.toList(), compactQueriesTo);
List<DenseVector> openAiVectors = await onEmbed(queries);
int mre = max((maxTokens / queries.length).floor(), 1);
QueryBatchResponse r = await points.queryBatch(
buildQueryBatch(maxResultsEach: mre, openAiVectors: openAiVectors),
);
List<VectorResult> results = [];
List<List<ScoredPoint>> sc = r.result.map((i) => i.result).toList();
mre = sc.isEmpty ? 0 : sc.map((i) => i.length).max();
int cc = (chunkSize * 0.6).ceil();
Map<String, double> selectedScores = {};
List<PointId> pointRequests = [];
int ttc = 0;
splade:
for (int i = 0; i < mre; i++) {
for (int j = 0; j < sc.length; j++) {
if (i >= sc[j].length) {
continue;
}
final sp = sc[j][i];
if (selectedScores.containsKey(sp.id.uuid)) {
continue;
}
selectedScores[sp.id.uuid] = sp.score;
pointRequests.add(sp.id);
ttc += cc;
if (pointRequests.length >= maxResults || ttc > maxTokens) {
break splade;
}
}
}
if (pointRequests.isEmpty) {
return const VectorSpaceResult(results: []);
}
for (final batch in pointRequests.chunked(32)) {
final response = await points.get(
GetPoints(
collectionName: namespace,
withPayload: WithPayloadSelector(
include: PayloadIncludeSelector(
fields: ["id", "text", "record", "entry", "metadata"],
),
),
ids: batch,
),
);
results.addAll(
await Future.wait(
response.result.map(
(point) => _toVectorResult(
point.id,
point.payload,
score: selectedScores[point.id.uuid] ?? 0,
),
),
),
);
}
VectorSpaceResult rx = VectorSpaceResult(results: results);
rx = rx.baked(maxResults: maxResults, maxTokens: maxTokens);
return rx;
}