Skip to content

Commit 5a96987

Browse files
show only non-composite aliases in drop down (#1947)
* show only non-composite aliases in drop down * fix type errors in test * snapshots * correct type * fix alias default value * update snapshots
1 parent a039ffc commit 5a96987

File tree

6 files changed

+95
-19
lines changed

6 files changed

+95
-19
lines changed

src/browser/modules/DBMSInfo/DBMSInfo.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ import {
4242
forceCount,
4343
getCountAutomaticRefreshLoading,
4444
getCountAutomaticRefreshEnabled,
45-
getUniqueDatbases
45+
getUniqueDatabases,
46+
getAliases
4647
} from 'shared/modules/dbMeta/dbMetaDuck'
4748
import { getGraphStyleData } from 'shared/modules/grass/grassDuck'
4849
import { Button } from '@neo4j-ndl/react'
@@ -73,14 +74,22 @@ export function DBMSInfo(props: any): JSX.Element {
7374
nodes,
7475
relationships
7576
} = props.meta
76-
const { user, onItemClick, onDbSelect, useDb, uniqueDatabases = [] } = props
77+
const {
78+
user,
79+
onItemClick,
80+
onDbSelect,
81+
useDb,
82+
uniqueDatabases = [],
83+
aliases
84+
} = props
7785

7886
return (
7987
<Drawer id="db-drawer">
8088
<DrawerHeader>Database Information</DrawerHeader>
8189
<DrawerBody>
8290
<DatabaseSelector
8391
uniqueDatabases={uniqueDatabases}
92+
aliases={aliases}
8493
selectedDb={useDb ?? ''}
8594
onChange={onDbSelect}
8695
/>
@@ -141,14 +150,16 @@ const mapStateToProps = (state: any) => {
141150
const countAutoRefreshing = getCountAutomaticRefreshEnabled(state)
142151
const countLoading = getCountAutomaticRefreshLoading(state)
143152

144-
const uniqueDatabases = getUniqueDatbases(state)
153+
const uniqueDatabases = getUniqueDatabases(state)
154+
const aliases = getAliases(state)
145155

146156
return {
147157
graphStyleData: getGraphStyleData(state),
148158
meta: state.meta,
149159
user: getCurrentUser(state),
150160
useDb,
151161
uniqueDatabases,
162+
aliases,
152163
countAutoRefreshing,
153164
countLoading
154165
}

src/browser/modules/DBMSInfo/DatabaseSelector.test.tsx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ describe('DatabaseSelector', () => {
4545

4646
// When
4747
const { container } = render(
48-
<DatabaseSelector selectedDb="" uniqueDatabases={databases} />
48+
<DatabaseSelector
49+
selectedDb=""
50+
uniqueDatabases={databases}
51+
aliases={[]}
52+
/>
4953
)
5054

5155
// Then
@@ -58,7 +62,11 @@ describe('DatabaseSelector', () => {
5862

5963
// When
6064
const { getByDisplayValue, queryByDisplayValue, rerender } = render(
61-
<DatabaseSelector uniqueDatabases={databases} selectedDb={selected} />
65+
<DatabaseSelector
66+
uniqueDatabases={databases}
67+
selectedDb={selected}
68+
aliases={[]}
69+
/>
6270
)
6371

6472
// Then
@@ -68,7 +76,11 @@ describe('DatabaseSelector', () => {
6876
// When
6977
selected = 'molly'
7078
rerender(
71-
<DatabaseSelector uniqueDatabases={databases} selectedDb={selected} />
79+
<DatabaseSelector
80+
uniqueDatabases={databases}
81+
selectedDb={selected}
82+
aliases={[]}
83+
/>
7284
)
7385

7486
// Then
@@ -78,7 +90,11 @@ describe('DatabaseSelector', () => {
7890
// When
7991
selected = ''
8092
rerender(
81-
<DatabaseSelector uniqueDatabases={databases} selectedDb={selected} />
93+
<DatabaseSelector
94+
uniqueDatabases={databases}
95+
selectedDb={selected}
96+
aliases={[]}
97+
/>
8298
)
8399

84100
// Then select db text should be shown
@@ -97,6 +113,7 @@ describe('DatabaseSelector', () => {
97113
uniqueDatabases={databases}
98114
selectedDb=""
99115
onChange={onChange}
116+
aliases={[]}
100117
/>
101118
)
102119
const select = getByTestId(testId)
@@ -126,6 +143,7 @@ describe('DatabaseSelector', () => {
126143
selectedDb=""
127144
uniqueDatabases={databases}
128145
onChange={onChange}
146+
aliases={[]}
129147
/>
130148
)
131149
const select = getByTestId(testId)

src/browser/modules/DBMSInfo/DatabaseSelector.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
DrawerSubHeader
2727
} from 'browser-components/drawer/drawer-styled'
2828
import { escapeCypherIdentifier } from 'services/utils'
29-
import { Database } from 'shared/modules/dbMeta/dbMetaDuck'
29+
import { Alias, Database } from 'shared/modules/dbMeta/dbMetaDuck'
3030

3131
const Select = styled.select`
3232
width: 100%;
@@ -43,10 +43,12 @@ type DatabaseSelectorProps = {
4343
uniqueDatabases?: Database[]
4444
selectedDb: string
4545
onChange?: (dbName: string) => void
46+
aliases: Alias[]
4647
}
4748
export const DatabaseSelector = ({
4849
uniqueDatabases = [],
4950
selectedDb,
51+
aliases,
5052
onChange = () => undefined
5153
}: DatabaseSelectorProps): JSX.Element | null => {
5254
if (uniqueDatabases.length === 0) {
@@ -64,15 +66,23 @@ export const DatabaseSelector = ({
6466
uniqueDatabases.find(db => db.home) ||
6567
uniqueDatabases.find(db => db.default)
6668

67-
const aliasList = uniqueDatabases.flatMap(db =>
68-
db.aliases
69-
? db.aliases.map(alias => ({
70-
databaseName: db.name,
71-
name: alias,
72-
status: db.status
73-
}))
74-
: []
75-
)
69+
const aliasList = aliases.flatMap(alias => {
70+
const aliasedDb = uniqueDatabases.find(db => db.name === alias.database)
71+
72+
// Don't show composite aliases since they can't be queried directly
73+
if (alias.composite) {
74+
return []
75+
}
76+
77+
if (aliasedDb === undefined) {
78+
return []
79+
}
80+
81+
return {
82+
name: alias.name,
83+
status: aliasedDb.status
84+
}
85+
})
7686

7787
const databasesAndAliases = [...aliasList, ...uniqueDatabases].sort((a, b) =>
7888
a.name.localeCompare(b.name)

src/shared/modules/dbMeta/__snapshots__/dbMetaDuck.test.ts.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
exports[`hydrating state can CLEAR to reset state 1`] = `
44
Object {
5+
"aliases": Array [],
56
"countAutomaticRefresh": Object {
67
"enabled": true,
78
"loading": false,
@@ -69,6 +70,7 @@ Object {
6970

7071
exports[`hydrating state should merge inital state and state on load 1`] = `
7172
Object {
73+
"aliases": Array [],
7274
"countAutomaticRefresh": Object {
7375
"enabled": true,
7476
"loading": false,

src/shared/modules/dbMeta/dbMetaDuck.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ export const initialState = {
206206
storeSize: null
207207
},
208208
databases: [],
209+
aliases: [],
209210
serverConfigDone: false,
210211
settings: initialClientSettings,
211212
countAutomaticRefresh: {
@@ -229,6 +230,14 @@ export type Database = {
229230
status: string
230231
}
231232

233+
export const ALIAS_COMPOSITE_FIELD_FIRST_VERSION = '5.11.0'
234+
export type Alias = {
235+
name: string
236+
database: string
237+
location: string
238+
composite?: string | null // introduced in neo4j 5.11
239+
}
240+
232241
// Selectors
233242
export function findDatabaseByNameOrAlias(
234243
state: GlobalState,
@@ -249,7 +258,7 @@ export function findDatabaseByNameOrAlias(
249258
)
250259
}
251260

252-
export function getUniqueDatbases(state: GlobalState): Database[] {
261+
export function getUniqueDatabases(state: GlobalState): Database[] {
253262
const uniqueDatabaseNames = uniq(
254263
state[NAME].databases.map((db: Database) => db.name)
255264
)
@@ -335,6 +344,10 @@ export const getMetricsPrefix = (state: GlobalState): string =>
335344

336345
export const getDatabases = (state: any): Database[] =>
337346
(state[NAME] || initialState).databases
347+
348+
export const getAliases = (state: any): null | Alias[] =>
349+
(state[NAME] || initialState).aliases
350+
338351
export const getActiveDbName = (state: any) =>
339352
((state[NAME] || {}).settings || {})['dbms.active_database']
340353

src/shared/modules/dbMeta/dbMetaEpics.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,27 @@ async function databaseList(store: any) {
135135
} catch {}
136136
}
137137

138+
async function aliasList(store: any) {
139+
try {
140+
const hasMultidb = supportsMultiDb(store.getState())
141+
if (!hasMultidb) {
142+
return
143+
}
144+
145+
const res = await bolt.backgroundWorkerlessRoutedRead(
146+
'SHOW ALIASES FOR DATABASE',
147+
{ useDb: SYSTEM_DB },
148+
store
149+
)
150+
151+
if (!res) return
152+
153+
const aliases = res.records.map((record: any) => record.toObject())
154+
155+
store.dispatch(update({ aliases }))
156+
} catch {}
157+
}
158+
138159
async function getLabelsAndTypes(store: any) {
139160
const db = getCurrentDatabase(store.getState())
140161

@@ -395,7 +416,8 @@ async function pollDbMeta(store: any) {
395416
await Promise.all([
396417
getFunctionsAndProcedures(store),
397418
clusterRole(store),
398-
databaseList(store)
419+
databaseList(store),
420+
aliasList(store)
399421
])
400422
}
401423

0 commit comments

Comments
 (0)