Skip to content

Commit 56cea21

Browse files
authored
Merge pull request neo4j#910 from oskarhane/moar-tx-metadata
Add tx metadata to queries that's generated by user actions
2 parents 0b0ae4a + a2caab8 commit 56cea21

File tree

13 files changed

+282
-43
lines changed

13 files changed

+282
-43
lines changed

src/browser/modules/Editor/Editor.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import ratingStar from 'icons/rating-star.svg'
5555
import controlsPlay from 'icons/controls-play.svg'
5656
import eraser2 from 'icons/eraser-2.svg'
5757
import pencil from 'icons/pencil.svg'
58+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
5859

5960
const shouldCheckForHints = code =>
6061
code.trim().length > 0 &&
@@ -280,7 +281,10 @@ export class Editor extends Component {
280281
;((text, offset) => {
281282
this.props.bus.self(
282283
CYPHER_REQUEST,
283-
{ query: 'EXPLAIN ' + text },
284+
{
285+
query: 'EXPLAIN ' + text,
286+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
287+
},
284288
response => {
285289
if (
286290
response.success === true &&

src/browser/modules/Stream/CypherFrame/VisualizationView.jsx

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { ExplorerComponent } from '../../D3Visualization/components/Explorer'
2828
import { StyledVisContainer } from './VisualizationView.styled'
2929

3030
import { CYPHER_REQUEST } from 'shared/modules/cypher/cypherDuck'
31+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
3132

3233
export class Visualization extends Component {
3334
state = {
@@ -95,22 +96,29 @@ export class Visualization extends Component {
9596
currentNeighbourIds.length}`
9697
return new Promise((resolve, reject) => {
9798
this.props.bus &&
98-
this.props.bus.self(CYPHER_REQUEST, { query: query }, response => {
99-
if (!response.success) {
100-
reject(new Error())
101-
} else {
102-
let count =
103-
response.result.records.length > 0
104-
? parseInt(response.result.records[0].get('c').toString())
105-
: 0
106-
const resultGraph = bolt.extractNodesAndRelationshipsFromRecordsForOldVis(
107-
response.result.records,
108-
false
109-
)
110-
this.autoCompleteRelationships(this.graph._nodes, resultGraph.nodes)
111-
resolve({ ...resultGraph, count: count })
99+
this.props.bus.self(
100+
CYPHER_REQUEST,
101+
{ query: query, queryType: NEO4J_BROWSER_USER_ACTION_QUERY },
102+
response => {
103+
if (!response.success) {
104+
reject(new Error())
105+
} else {
106+
let count =
107+
response.result.records.length > 0
108+
? parseInt(response.result.records[0].get('c').toString())
109+
: 0
110+
const resultGraph = bolt.extractNodesAndRelationshipsFromRecordsForOldVis(
111+
response.result.records,
112+
false
113+
)
114+
this.autoCompleteRelationships(
115+
this.graph._nodes,
116+
resultGraph.nodes
117+
)
118+
resolve({ ...resultGraph, count: count })
119+
}
112120
}
113-
})
121+
)
114122
})
115123
}
116124
getInternalRelationships (existingNodeIds, newNodeIds) {
@@ -123,7 +131,11 @@ export class Visualization extends Component {
123131
this.props.bus &&
124132
this.props.bus.self(
125133
CYPHER_REQUEST,
126-
{ query, params: { existingNodeIds, newNodeIds } },
134+
{
135+
query,
136+
params: { existingNodeIds, newNodeIds },
137+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
138+
},
127139
response => {
128140
if (!response.success) {
129141
reject(new Error())

src/browser/modules/Stream/Queries/QueriesFrame.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import { EnterpriseOnlyFrame } from 'browser-components/EditionView'
5757
import { RefreshIcon } from 'browser-components/icons/Icons'
5858
import Render from 'browser-components/Render'
5959
import FrameError from '../FrameError'
60+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
6061

6162
export class QueriesFrame extends Component {
6263
state = {
@@ -97,7 +98,10 @@ export class QueriesFrame extends Component {
9798
getRunningQueries (suppressQuerySuccessMessage = false) {
9899
this.props.bus.self(
99100
this.isCC() ? CLUSTER_CYPHER_REQUEST : CYPHER_REQUEST,
100-
{ query: listQueriesProcedure() },
101+
{
102+
query: listQueriesProcedure(),
103+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
104+
},
101105
response => {
102106
if (response.success) {
103107
const queries = this.extractQueriesFromBoltResult(response.result)

src/browser/modules/Stream/SchemaFrame.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { withBus } from 'react-suber'
2323
import { CYPHER_REQUEST } from 'shared/modules/cypher/cypherDuck'
2424
import FrameTemplate from '../Stream/FrameTemplate'
2525
import { StyledSchemaBody } from './styled'
26+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
2627

2728
export class SchemaFrame extends Component {
2829
constructor (props) {
@@ -53,15 +54,17 @@ export class SchemaFrame extends Component {
5354
this.props.bus.self(
5455
CYPHER_REQUEST,
5556
{
56-
query: 'CALL db.indexes()'
57+
query: 'CALL db.indexes()',
58+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
5759
},
5860
this.responseHandler('indexes')
5961
)
6062
// Constraints
6163
this.props.bus.self(
6264
CYPHER_REQUEST,
6365
{
64-
query: 'CALL db.constraints()'
66+
query: 'CALL db.constraints()',
67+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
6568
},
6669
this.responseHandler('constraints')
6770
)

src/browser/modules/Stream/SysInfoFrame/index.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
AutoRefreshSpan,
4444
StatusbarWrapper
4545
} from '../AutoRefresh/styled'
46+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
4647

4748
export class SysInfoFrame extends Component {
4849
constructor (props) {
@@ -235,15 +236,17 @@ export class SysInfoFrame extends Component {
235236
this.props.bus.self(
236237
CYPHER_REQUEST,
237238
{
238-
query: 'CALL dbms.queryJmx("org.neo4j:*")'
239+
query: 'CALL dbms.queryJmx("org.neo4j:*")',
240+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
239241
},
240242
this.responseHandler.bind(this)
241243
)
242244
if (this.props.isACausalCluster) {
243245
this.props.bus.self(
244246
CYPHER_REQUEST,
245247
{
246-
query: 'CALL dbms.cluster.overview'
248+
query: 'CALL dbms.cluster.overview',
249+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
247250
},
248251
this.clusterResponseHandler.bind(this)
249252
)

src/browser/modules/User/UserAdd.jsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
StyledTh
4646
} from 'browser-components/DataTables'
4747
import { StyledUserTd, StyledInput, StyledButtonContainer } from './styled'
48+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
4849

4950
export class UserAdd extends Component {
5051
constructor (props) {
@@ -93,7 +94,10 @@ export class UserAdd extends Component {
9394
this.props.bus &&
9495
this.props.bus.self(
9596
CYPHER_REQUEST,
96-
{ query: addRoleToUser(this.state.username, role) },
97+
{
98+
query: addRoleToUser(this.state.username, role),
99+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
100+
},
97101
response => {
98102
if (!response.success) {
99103
return errors.add(response.error)
@@ -110,7 +114,7 @@ export class UserAdd extends Component {
110114
this.props.bus &&
111115
this.props.bus.self(
112116
CYPHER_REQUEST,
113-
{ query: listRolesQuery() },
117+
{ query: listRolesQuery(), queryType: NEO4J_BROWSER_USER_ACTION_QUERY },
114118
response => {
115119
if (!response.success) {
116120
const error =
@@ -153,7 +157,10 @@ export class UserAdd extends Component {
153157
this.props.bus &&
154158
this.props.bus.self(
155159
CYPHER_REQUEST,
156-
{ query: createDatabaseUser(this.state) },
160+
{
161+
query: createDatabaseUser(this.state),
162+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
163+
},
157164
response => {
158165
if (!response.success) {
159166
const error =

src/browser/modules/User/UserInformation.jsx

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { StyledBodyTr } from 'browser-components/DataTables'
3737
import { StyledUserTd, StyledButtonContainer } from './styled'
3838

3939
import RolesSelector from './RolesSelector'
40+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
4041

4142
export class UserInformation extends Component {
4243
constructor (props) {
@@ -51,21 +52,30 @@ export class UserInformation extends Component {
5152
removeClick (thing) {
5253
this.props.bus.self(
5354
CYPHER_REQUEST,
54-
{ query: deleteUser(this.state.username) },
55+
{
56+
query: deleteUser(this.state.username),
57+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
58+
},
5559
this.handleResponse.bind(this)
5660
)
5761
}
5862
suspendUser () {
5963
this.props.bus.self(
6064
CYPHER_REQUEST,
61-
{ query: suspendUser(this.state.username) },
65+
{
66+
query: suspendUser(this.state.username),
67+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
68+
},
6269
this.handleResponse.bind(this)
6370
)
6471
}
6572
activateUser () {
6673
this.props.bus.self(
6774
CYPHER_REQUEST,
68-
{ query: activateUser(this.state.username) },
75+
{
76+
query: activateUser(this.state.username),
77+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
78+
},
6979
this.handleResponse.bind(this)
7080
)
7181
}
@@ -96,7 +106,10 @@ export class UserInformation extends Component {
96106
onClick={() => {
97107
this.props.bus.self(
98108
CYPHER_REQUEST,
99-
{ query: removeRoleFromUser(role, this.state.username) },
109+
{
110+
query: removeRoleFromUser(role, this.state.username),
111+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
112+
},
100113
this.handleResponse.bind(this)
101114
)
102115
}}
@@ -107,7 +120,10 @@ export class UserInformation extends Component {
107120
onRoleSelect (event) {
108121
this.props.bus.self(
109122
CYPHER_REQUEST,
110-
{ query: addRoleToUser(this.state.username, event.target.value) },
123+
{
124+
query: addRoleToUser(this.state.username, event.target.value),
125+
queryType: NEO4J_BROWSER_USER_ACTION_QUERY
126+
},
111127
this.handleResponse.bind(this)
112128
)
113129
}

src/browser/modules/User/UserList.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { StyledButtonContainer } from './styled'
3535

3636
import FrameTemplate from '../Stream/FrameTemplate'
3737
import { forceFetch } from 'shared/modules/currentUser/currentUserDuck'
38+
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
3839

3940
export class UserList extends Component {
4041
constructor (props) {
@@ -52,7 +53,7 @@ export class UserList extends Component {
5253
getUserList () {
5354
this.props.bus.self(
5455
CYPHER_REQUEST,
55-
{ query: listUsersQuery() },
56+
{ query: listUsersQuery(), queryType: NEO4J_BROWSER_USER_ACTION_QUERY },
5657
response => {
5758
if (response.success) {
5859
this.setState({
@@ -66,7 +67,7 @@ export class UserList extends Component {
6667
getRoles () {
6768
this.props.bus.self(
6869
CYPHER_REQUEST,
69-
{ query: listRolesQuery() },
70+
{ query: listRolesQuery(), queryType: NEO4J_BROWSER_USER_ACTION_QUERY },
7071
response => {
7172
const flatten = arr =>
7273
arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), [])

src/shared/modules/cypher/cypherDuck.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { getCausalClusterAddresses } from './queriesProcedureHelper'
2626
import { getEncryptionMode } from 'services/bolt/boltHelpers'
2727
import { flatten } from 'services/utils'
2828
import { shouldUseCypherThread } from 'shared/modules/settings/settingsDuck'
29+
import { getUserTxMetadata } from 'services/bolt/txMetadata'
30+
import { canSendTxMetadata } from '../features/versionedFeatures'
2931

3032
const NAME = 'cypher'
3133
export const CYPHER_REQUEST = NAME + '/REQUEST'
@@ -80,7 +82,10 @@ export const cypherRequestEpic = (some$, store) =>
8082
if (!action.$$responseChannel) return Rx.Observable.of(null)
8183
return bolt
8284
.directTransaction(action.query, action.params || undefined, {
83-
useCypherThread: shouldUseCypherThread(store.getState())
85+
useCypherThread: shouldUseCypherThread(store.getState()),
86+
...getUserTxMetadata(action.queryType || null)({
87+
hasServerSupport: canSendTxMetadata(store.getState())
88+
})
8489
})
8590
.then(r => ({ type: action.$$responseChannel, success: true, result: r }))
8691
.catch(e => ({

0 commit comments

Comments
 (0)