fix(mongodb): support collation for find queries
This commit is contained in:
21 files changed
+373
-30
No files matched your search
@@ -904,7 +904,7 @@ async function load(options: { page?: number } = {}) {
|
||||
}
|
||||
const sort = currentDocumentSortJson(sortInput.value);
|
||||
const skip = requestPage * pageSize.value;
|
||||
const result = await api.documentFindDocuments(connectionId, database, collection, skip, documentRequestLimit.value, filter, undefined, sort, executionId);
|
||||
const result = await api.documentFindDocuments(connectionId, database, collection, skip, documentRequestLimit.value, filter, undefined, sort, undefined, executionId);
|
||||
if (documentLoadExecutionId.value !== executionId) return;
|
||||
if (connectionId !== props.connectionId || database !== props.database || collection !== props.collection || storeKind !== documentStoreProvider.value.kind) return;
|
||||
const nextDocuments =
|
||||
|
||||
@@ -2937,8 +2937,8 @@ export async function vectorGetCollectionDetail(connectionId: string, database:
|
||||
});
|
||||
}
|
||||
|
||||
export async function mongoFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, executionId?: string): Promise<MongoDocumentResult> {
|
||||
return documentFindDocuments(connectionId, database, collection, skip, limit, filter, projection, sort, executionId);
|
||||
export async function mongoFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, collation?: string, executionId?: string): Promise<MongoDocumentResult> {
|
||||
return documentFindDocuments(connectionId, database, collection, skip, limit, filter, projection, sort, collation, executionId);
|
||||
}
|
||||
|
||||
export async function mongoParseShellCommand(source: string): Promise<MongoCommand> {
|
||||
@@ -2958,7 +2958,7 @@ export async function mongoFindOne(connectionId: string, database: string, colle
|
||||
});
|
||||
}
|
||||
|
||||
export async function documentFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, executionId?: string): Promise<DocumentQueryResult> {
|
||||
export async function documentFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, collation?: string, executionId?: string): Promise<DocumentQueryResult> {
|
||||
return post("/api/document-store/find-documents", {
|
||||
connectionId,
|
||||
database,
|
||||
@@ -2968,6 +2968,7 @@ export async function documentFindDocuments(connectionId: string, database: stri
|
||||
filter,
|
||||
projection,
|
||||
sort,
|
||||
collation,
|
||||
executionId,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2895,8 +2895,8 @@ export async function vectorListCollections(connectionId: string, database?: str
|
||||
return documentListCollections(connectionId, database || "default");
|
||||
}
|
||||
|
||||
export async function mongoFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, executionId?: string): Promise<MongoDocumentResult> {
|
||||
return documentFindDocuments(connectionId, database, collection, skip, limit, filter, projection, sort, executionId);
|
||||
export async function mongoFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, collation?: string, executionId?: string): Promise<MongoDocumentResult> {
|
||||
return documentFindDocuments(connectionId, database, collection, skip, limit, filter, projection, sort, collation, executionId);
|
||||
}
|
||||
|
||||
export async function mongoFindOne(connectionId: string, database: string, collection: string, filter?: string, projection?: string, options?: string, executionId?: string): Promise<MongoDocumentResult> {
|
||||
@@ -2916,7 +2916,7 @@ export async function mongoParseShellCommand(source: string): Promise<MongoComma
|
||||
return normalizeRustMongoCommand(raw);
|
||||
}
|
||||
|
||||
export async function documentFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, executionId?: string): Promise<DocumentQueryResult> {
|
||||
export async function documentFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, projection?: string, sort?: string, collation?: string, executionId?: string): Promise<DocumentQueryResult> {
|
||||
return invoke("document_find_documents", {
|
||||
connectionId,
|
||||
database,
|
||||
@@ -2926,6 +2926,7 @@ export async function documentFindDocuments(connectionId: string, database: stri
|
||||
filter,
|
||||
projection,
|
||||
sort,
|
||||
collation,
|
||||
executionId,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ export interface MongoFindCommand {
|
||||
skip: number;
|
||||
limit: number;
|
||||
sort?: string;
|
||||
collation?: string;
|
||||
}
|
||||
|
||||
export interface MongoFindPaginationPlan {
|
||||
@@ -162,6 +163,14 @@ export function parseMongoFindCommand(input: string): MongoFindCommand | null {
|
||||
sort = parsedSort;
|
||||
}
|
||||
|
||||
const collationArg = readChainedCallArgument(chain, "collation");
|
||||
let collation: string | undefined;
|
||||
if (collationArg !== undefined) {
|
||||
const parsedCollation = normalizeJsonArgument(collationArg);
|
||||
if (!parsedCollation) return null;
|
||||
collation = parsedCollation;
|
||||
}
|
||||
|
||||
const skip = readChainedIntegerArgument(chain, "skip", 0);
|
||||
const limit = readChainedIntegerArgument(chain, "limit", DEFAULT_LIMIT);
|
||||
if (skip === null || limit === null) return null;
|
||||
@@ -173,6 +182,7 @@ export function parseMongoFindCommand(input: string): MongoFindCommand | null {
|
||||
skip,
|
||||
limit,
|
||||
sort,
|
||||
...(collation ? { collation } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -3536,7 +3536,7 @@ export const useQueryStore = defineStore("query", () => {
|
||||
if (!pagePlan) throw new Error(describeMongoCommandParseFailure(sourceStatement));
|
||||
// A stale request can point past an explicit .limit() bound. Keep
|
||||
// the backend call bounded so limit(0) cannot become unbounded.
|
||||
const result = await api.mongoFindDocuments(tab.connectionId, currentDatabase, mongoCommand.collection, pagePlan.requestSkip, Math.max(1, pagePlan.requestLimit), mongoCommand.filter, mongoCommand.projection, mongoCommand.sort, executionId);
|
||||
const result = await api.mongoFindDocuments(tab.connectionId, currentDatabase, mongoCommand.collection, pagePlan.requestSkip, Math.max(1, pagePlan.requestLimit), mongoCommand.filter, mongoCommand.projection, mongoCommand.sort, mongoCommand.collation, executionId);
|
||||
const documents = pagePlan.requestLimit === 0 ? [] : result.documents;
|
||||
const extendedDocuments = pagePlan.requestLimit === 0 ? [] : result.extended_documents;
|
||||
const totalIsExact = result.total_is_exact !== false;
|
||||
@@ -5046,7 +5046,7 @@ export const useQueryStore = defineStore("query", () => {
|
||||
if (!plan) throw new Error(QUERY_RESULT_EXPORT_UNSUPPORTED_ERROR);
|
||||
if (plan.requestLimit === 0) break;
|
||||
|
||||
const result = await api.mongoFindDocuments(tab.connectionId, tab.database, mongoCommand.collection, plan.requestSkip, plan.requestLimit, mongoCommand.filter, mongoCommand.projection, mongoCommand.sort, exportExecutionId);
|
||||
const result = await api.mongoFindDocuments(tab.connectionId, tab.database, mongoCommand.collection, plan.requestSkip, plan.requestLimit, mongoCommand.filter, mongoCommand.projection, mongoCommand.sort, mongoCommand.collation, exportExecutionId);
|
||||
const pageDocuments = result.documents.slice(0, plan.requestLimit);
|
||||
documents.push(...pageDocuments);
|
||||
|
||||
|
||||
Reference in new issue
Block a user