Skip to content

Commit c436688

Browse files
authored
Merge pull request #1830 from github/nora/selected-db-item
Create method that returns selected DbItem
2 parents 127baea + 425befa commit c436688

File tree

3 files changed

+333
-0
lines changed

3 files changed

+333
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { DbItem, DbItemKind, LocalDbItem, RemoteDbItem } from "./db-item";
2+
3+
export function getSelectedDbItem(dbItems: DbItem[]): DbItem | undefined {
4+
for (const dbItem of dbItems) {
5+
if (
6+
dbItem.kind === DbItemKind.RootRemote ||
7+
dbItem.kind === DbItemKind.RootLocal
8+
) {
9+
for (const child of dbItem.children) {
10+
const selectedItem = extractSelected(child);
11+
if (selectedItem) return selectedItem;
12+
}
13+
} else {
14+
const selectedItem = extractSelected(dbItem);
15+
if (selectedItem) return selectedItem;
16+
}
17+
}
18+
return undefined;
19+
}
20+
21+
function extractSelected(
22+
dbItem: RemoteDbItem | LocalDbItem,
23+
): DbItem | undefined {
24+
if (dbItem.selected) {
25+
return dbItem;
26+
}
27+
switch (dbItem.kind) {
28+
case DbItemKind.LocalList:
29+
for (const database of dbItem.databases) {
30+
if (database.selected) {
31+
return database;
32+
}
33+
}
34+
break;
35+
case DbItemKind.RemoteUserDefinedList:
36+
for (const repo of dbItem.repos) {
37+
if (repo.selected) {
38+
return repo;
39+
}
40+
}
41+
break;
42+
}
43+
return undefined;
44+
}

extensions/ql-vscode/src/databases/db-manager.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { AppEvent, AppEventEmitter } from "../common/events";
33
import { ValueResult } from "../common/value-result";
44
import { DbConfigStore } from "./config/db-config-store";
55
import { DbItem } from "./db-item";
6+
import { getSelectedDbItem } from "./db-item-selection";
67
import { createLocalTree, createRemoteTree } from "./db-tree-creator";
78

89
export class DbManager {
@@ -18,6 +19,16 @@ export class DbManager {
1819
});
1920
}
2021

22+
public getSelectedDbItem(): DbItem | undefined {
23+
const dbItems = this.getDbItems();
24+
25+
if (dbItems.isFailure) {
26+
return undefined;
27+
}
28+
29+
return getSelectedDbItem(dbItems.value);
30+
}
31+
2132
public getDbItems(): ValueResult<DbItem[]> {
2233
const configResult = this.dbConfigStore.getConfig();
2334
if (configResult.isFailure) {
Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
import { DbItem, DbItemKind } from "../../../src/databases/db-item";
2+
import { getSelectedDbItem } from "../../../src/databases/db-item-selection";
3+
describe("db item selection", () => {
4+
it("should return undefined if no item is selected", () => {
5+
const dbItems: DbItem[] = [
6+
{
7+
kind: DbItemKind.RootRemote,
8+
children: [
9+
{
10+
kind: DbItemKind.RemoteSystemDefinedList,
11+
listName: "top_10",
12+
listDisplayName: "Top 10 repositories",
13+
listDescription: "Top 10 repositories of a language",
14+
selected: false,
15+
},
16+
{
17+
kind: DbItemKind.RemoteSystemDefinedList,
18+
listName: "top_100",
19+
listDisplayName: "Top 100 repositories",
20+
listDescription: "Top 100 repositories of a language",
21+
selected: false,
22+
},
23+
{
24+
kind: DbItemKind.RemoteOwner,
25+
ownerName: "github",
26+
selected: false,
27+
},
28+
{
29+
kind: DbItemKind.RemoteUserDefinedList,
30+
listName: "my list",
31+
repos: [
32+
{
33+
kind: DbItemKind.RemoteRepo,
34+
repoFullName: "owner1/repo2",
35+
selected: false,
36+
},
37+
{
38+
kind: DbItemKind.RemoteRepo,
39+
repoFullName: "owner1/repo3",
40+
selected: false,
41+
},
42+
],
43+
selected: false,
44+
},
45+
],
46+
},
47+
{
48+
kind: DbItemKind.RootLocal,
49+
children: [
50+
{
51+
kind: DbItemKind.LocalList,
52+
listName: "list-1",
53+
databases: [
54+
{
55+
kind: DbItemKind.LocalDatabase,
56+
databaseName: "db1",
57+
dateAdded: 1234,
58+
language: "javascript",
59+
storagePath: "/foo/bar",
60+
selected: false,
61+
},
62+
{
63+
kind: DbItemKind.LocalDatabase,
64+
databaseName: "db2",
65+
dateAdded: 1234,
66+
language: "javascript",
67+
storagePath: "/foo/bar",
68+
selected: false,
69+
},
70+
],
71+
selected: false,
72+
},
73+
{
74+
kind: DbItemKind.LocalDatabase,
75+
databaseName: "db3",
76+
dateAdded: 1234,
77+
language: "javascript",
78+
storagePath: "/foo/bar",
79+
selected: false,
80+
},
81+
],
82+
},
83+
];
84+
85+
expect(getSelectedDbItem(dbItems)).toBeUndefined();
86+
});
87+
88+
it("should return correct local database item from DbItem list", () => {
89+
const dbItems: DbItem[] = [
90+
{
91+
kind: DbItemKind.RootLocal,
92+
children: [
93+
{
94+
kind: DbItemKind.LocalList,
95+
listName: "list-1",
96+
databases: [
97+
{
98+
kind: DbItemKind.LocalDatabase,
99+
databaseName: "db1",
100+
dateAdded: 1234,
101+
language: "javascript",
102+
storagePath: "/foo/bar",
103+
selected: false,
104+
},
105+
{
106+
kind: DbItemKind.LocalDatabase,
107+
databaseName: "db2",
108+
dateAdded: 1234,
109+
language: "javascript",
110+
storagePath: "/foo/bar",
111+
selected: true,
112+
},
113+
],
114+
selected: false,
115+
},
116+
{
117+
kind: DbItemKind.LocalDatabase,
118+
databaseName: "db3",
119+
dateAdded: 1234,
120+
language: "javascript",
121+
storagePath: "/foo/bar",
122+
selected: false,
123+
},
124+
],
125+
},
126+
];
127+
128+
expect(getSelectedDbItem(dbItems)).toEqual({
129+
kind: DbItemKind.LocalDatabase,
130+
databaseName: "db2",
131+
dateAdded: 1234,
132+
language: "javascript",
133+
storagePath: "/foo/bar",
134+
selected: true,
135+
});
136+
});
137+
138+
it("should return correct remote database list item from DbItem list", () => {
139+
const dbItems: DbItem[] = [
140+
{
141+
kind: DbItemKind.RootRemote,
142+
children: [
143+
{
144+
kind: DbItemKind.RemoteSystemDefinedList,
145+
listName: "top_10",
146+
listDisplayName: "Top 10 repositories",
147+
listDescription: "Top 10 repositories of a language",
148+
selected: false,
149+
},
150+
{
151+
kind: DbItemKind.RemoteOwner,
152+
ownerName: "github",
153+
selected: false,
154+
},
155+
{
156+
kind: DbItemKind.RemoteUserDefinedList,
157+
listName: "my list",
158+
repos: [
159+
{
160+
kind: DbItemKind.RemoteRepo,
161+
repoFullName: "owner1/repo2",
162+
selected: false,
163+
},
164+
{
165+
kind: DbItemKind.RemoteRepo,
166+
repoFullName: "owner1/repo3",
167+
selected: false,
168+
},
169+
],
170+
selected: true,
171+
},
172+
],
173+
},
174+
];
175+
176+
expect(getSelectedDbItem(dbItems)).toEqual({
177+
kind: DbItemKind.RemoteUserDefinedList,
178+
listName: "my list",
179+
repos: [
180+
{
181+
kind: DbItemKind.RemoteRepo,
182+
repoFullName: "owner1/repo2",
183+
selected: false,
184+
},
185+
{
186+
kind: DbItemKind.RemoteRepo,
187+
repoFullName: "owner1/repo3",
188+
selected: false,
189+
},
190+
],
191+
selected: true,
192+
});
193+
});
194+
195+
it("should handle arbitrary list of db items", () => {
196+
const dbItems: DbItem[] = [
197+
{
198+
kind: DbItemKind.RootRemote,
199+
children: [
200+
{
201+
kind: DbItemKind.RemoteSystemDefinedList,
202+
listName: "top_10",
203+
listDisplayName: "Top 10 repositories",
204+
listDescription: "Top 10 repositories of a language",
205+
selected: false,
206+
},
207+
{
208+
kind: DbItemKind.RemoteOwner,
209+
ownerName: "github",
210+
selected: false,
211+
},
212+
{
213+
kind: DbItemKind.RemoteUserDefinedList,
214+
listName: "my list",
215+
repos: [
216+
{
217+
kind: DbItemKind.RemoteRepo,
218+
repoFullName: "owner1/repo2",
219+
selected: false,
220+
},
221+
{
222+
kind: DbItemKind.RemoteRepo,
223+
repoFullName: "owner1/repo3",
224+
selected: false,
225+
},
226+
],
227+
selected: false,
228+
},
229+
],
230+
},
231+
{
232+
kind: DbItemKind.RemoteSystemDefinedList,
233+
listName: "top_10",
234+
listDisplayName: "Top 10 repositories",
235+
listDescription: "Top 10 repositories of a language",
236+
selected: true,
237+
},
238+
];
239+
240+
expect(getSelectedDbItem(dbItems)).toEqual({
241+
kind: DbItemKind.RemoteSystemDefinedList,
242+
listName: "top_10",
243+
listDisplayName: "Top 10 repositories",
244+
listDescription: "Top 10 repositories of a language",
245+
selected: true,
246+
});
247+
});
248+
249+
it("should handle empty db item lists", () => {
250+
const dbItems: DbItem[] = [
251+
{
252+
kind: DbItemKind.RootRemote,
253+
children: [
254+
{
255+
kind: DbItemKind.RemoteSystemDefinedList,
256+
listName: "top_10",
257+
listDisplayName: "Top 10 repositories",
258+
listDescription: "Top 10 repositories of a language",
259+
selected: false,
260+
},
261+
{
262+
kind: DbItemKind.RemoteOwner,
263+
ownerName: "github",
264+
selected: false,
265+
},
266+
{
267+
kind: DbItemKind.RemoteUserDefinedList,
268+
listName: "my list",
269+
repos: [],
270+
selected: false,
271+
},
272+
],
273+
},
274+
];
275+
276+
expect(getSelectedDbItem(dbItems)).toBeUndefined();
277+
});
278+
});

0 commit comments

Comments
 (0)