Skip to content

Commit 561e07a

Browse files
committed
Sort database items by dateAdded
Before selecting an existing database, let's sort them by date. We're opting to exclude databases with errors during the sorting process.
1 parent dce94e8 commit 561e07a

File tree

2 files changed

+88
-72
lines changed

2 files changed

+88
-72
lines changed

extensions/ql-vscode/src/skeleton-query-wizard.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,8 @@ export class SkeletonQueryWizard {
273273
databaseNwo: string,
274274
databaseItems: readonly DatabaseItem[],
275275
): Promise<DatabaseItem | undefined> {
276-
const dbItems = databaseItems || [];
277-
const dbs = dbItems.filter(
278-
(db) =>
279-
db.language === language &&
280-
db.name === databaseNwo &&
281-
db.error === undefined,
276+
const dbs = databaseItems.filter(
277+
(db) => db.language === language && db.name === databaseNwo,
282278
);
283279

284280
if (dbs.length === 0) {
@@ -291,10 +287,7 @@ export class SkeletonQueryWizard {
291287
language: string,
292288
databaseItems: readonly DatabaseItem[],
293289
): Promise<DatabaseItem | undefined> {
294-
const dbItems = databaseItems || [];
295-
const dbs = dbItems.filter(
296-
(db) => db.language === language && db.error === undefined,
297-
);
290+
const dbs = databaseItems.filter((db) => db.language === language);
298291
if (dbs.length === 0) {
299292
return undefined;
300293
}
@@ -308,19 +301,38 @@ export class SkeletonQueryWizard {
308301

309302
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
310303

304+
const dbItems = await this.sortDatabaseItemsByDateAdded(
305+
this.databaseManager.databaseItems,
306+
);
307+
311308
const defaultDatabaseItem = await this.findDatabaseItemByNwo(
312309
this.language,
313310
defaultDatabaseNwo,
314-
this.databaseManager.databaseItems,
311+
dbItems,
315312
);
316313

317314
if (defaultDatabaseItem !== undefined) {
318315
return defaultDatabaseItem;
319316
}
320317

321-
return await this.findDatabaseItemByLanguage(
322-
this.language,
323-
this.databaseManager.databaseItems,
324-
);
318+
return await this.findDatabaseItemByLanguage(this.language, dbItems);
319+
}
320+
321+
public async sortDatabaseItemsByDateAdded(
322+
databaseItems: readonly DatabaseItem[],
323+
) {
324+
const validDbItems = databaseItems.filter((db) => db.error === undefined);
325+
326+
return validDbItems.sort((a, b) => {
327+
if (a.dateAdded === undefined) {
328+
return -1;
329+
}
330+
331+
if (b.dateAdded === undefined) {
332+
return 1;
333+
}
334+
335+
return a.dateAdded - b.dateAdded;
336+
});
325337
}
326338
}

extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -330,37 +330,6 @@ describe("SkeletonQueryWizard", () => {
330330
JSON.stringify(mockDbItem),
331331
);
332332
});
333-
334-
it("should ignore databases with errors", async () => {
335-
const mockDbItem = createMockDB(dir, {
336-
language: "ruby",
337-
dateAdded: 123,
338-
} as FullDatabaseOptions);
339-
const mockDbItem2 = createMockDB(dir, {
340-
language: "javascript",
341-
} as FullDatabaseOptions);
342-
const mockDbItem3 = createMockDB(dir, {
343-
language: "ruby",
344-
dateAdded: 345,
345-
} as FullDatabaseOptions);
346-
347-
jest.spyOn(mockDbItem, "name", "get").mockReturnValue("mock-name");
348-
jest.spyOn(mockDbItem3, "name", "get").mockReturnValue(mockDbItem.name);
349-
350-
jest
351-
.spyOn(mockDbItem, "error", "get")
352-
.mockReturnValue(asError("database go boom!"));
353-
354-
const databaseItem = await wizard.findDatabaseItemByNwo(
355-
mockDbItem.language,
356-
mockDbItem.name,
357-
[mockDbItem, mockDbItem2, mockDbItem3],
358-
);
359-
360-
expect(JSON.stringify(databaseItem)).toEqual(
361-
JSON.stringify(mockDbItem3),
362-
);
363-
});
364333
});
365334

366335
describe("when the item doesn't exist", () => {
@@ -396,32 +365,6 @@ describe("SkeletonQueryWizard", () => {
396365

397366
expect(databaseItem).toEqual(mockDbItem);
398367
});
399-
400-
it("should ignore databases with errors", async () => {
401-
const mockDbItem = createMockDB(dir, {
402-
language: "ruby",
403-
} as FullDatabaseOptions);
404-
const mockDbItem2 = createMockDB(dir, {
405-
language: "javascript",
406-
} as FullDatabaseOptions);
407-
const mockDbItem3 = createMockDB(dir, {
408-
language: "ruby",
409-
} as FullDatabaseOptions);
410-
411-
jest
412-
.spyOn(mockDbItem, "error", "get")
413-
.mockReturnValue(asError("database go boom!"));
414-
415-
const databaseItem = await wizard.findDatabaseItemByLanguage("ruby", [
416-
mockDbItem,
417-
mockDbItem2,
418-
mockDbItem3,
419-
]);
420-
421-
expect(JSON.stringify(databaseItem)).toEqual(
422-
JSON.stringify(mockDbItem3),
423-
);
424-
});
425368
});
426369

427370
describe("when the item doesn't exist", () => {
@@ -550,4 +493,65 @@ describe("SkeletonQueryWizard", () => {
550493
});
551494
});
552495
});
496+
497+
describe("sortDatabaseItemsByDateAdded", () => {
498+
describe("should return a sorted list", () => {
499+
it("should sort the items by dateAdded", async () => {
500+
const mockDbItem = createMockDB(dir, {
501+
dateAdded: 678,
502+
} as FullDatabaseOptions);
503+
const mockDbItem2 = createMockDB(dir, {
504+
dateAdded: 123,
505+
} as FullDatabaseOptions);
506+
const mockDbItem3 = createMockDB(dir, {
507+
dateAdded: undefined,
508+
} as FullDatabaseOptions);
509+
const mockDbItem4 = createMockDB(dir, {
510+
dateAdded: 345,
511+
} as FullDatabaseOptions);
512+
513+
const sortedList = await wizard.sortDatabaseItemsByDateAdded([
514+
mockDbItem,
515+
mockDbItem2,
516+
mockDbItem3,
517+
mockDbItem4,
518+
]);
519+
520+
expect(sortedList).toEqual([
521+
mockDbItem3,
522+
mockDbItem2,
523+
mockDbItem4,
524+
mockDbItem,
525+
]);
526+
});
527+
528+
it("should ignore databases with errors", async () => {
529+
const mockDbItem = createMockDB(dir, {
530+
dateAdded: 678,
531+
} as FullDatabaseOptions);
532+
const mockDbItem2 = createMockDB(dir, {
533+
dateAdded: undefined,
534+
} as FullDatabaseOptions);
535+
const mockDbItem3 = createMockDB(dir, {
536+
dateAdded: 345,
537+
} as FullDatabaseOptions);
538+
const mockDbItem4 = createMockDB(dir, {
539+
dateAdded: 123,
540+
} as FullDatabaseOptions);
541+
542+
jest
543+
.spyOn(mockDbItem, "error", "get")
544+
.mockReturnValue(asError("database go boom!"));
545+
546+
const sortedList = await wizard.sortDatabaseItemsByDateAdded([
547+
mockDbItem,
548+
mockDbItem2,
549+
mockDbItem3,
550+
mockDbItem4,
551+
]);
552+
553+
expect(sortedList).toEqual([mockDbItem2, mockDbItem4, mockDbItem3]);
554+
});
555+
});
556+
});
553557
});

0 commit comments

Comments
 (0)