Skip to content

Commit 8af7a45

Browse files
authored
feat: moving query time over (#4750)
1 parent 6dd7bd0 commit 8af7a45

File tree

5 files changed

+126
-12
lines changed

5 files changed

+126
-12
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
@import '@influxdata/clockface/dist/variables.scss';
2+
3+
.query-status {
4+
flex-grow: 1;
5+
6+
.status {
7+
width: 12px;
8+
height: 12px;
9+
border-radius: 50%;
10+
background: $g10-wolf;
11+
12+
display: inline-block;
13+
margin-right: 10px;
14+
margin-bottom: -2px;
15+
16+
&.loading {
17+
background: $c-rainforest;
18+
filter: drop-shadow(0 0 4px $c-rainforest);
19+
}
20+
21+
&.error {
22+
background: $c-fire;
23+
}
24+
25+
&.done {
26+
background: $c-rainforest;
27+
}
28+
}
29+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import React, {FC, useContext} from 'react'
2+
import {ResultsContext} from 'src/dataExplorer/components/ResultsContext'
3+
import {RemoteDataState} from 'src/types'
4+
5+
import 'src/dataExplorer/components/QueryTime.scss'
6+
7+
const humanReadable = (time: number): string => {
8+
return '' + time + 'ms'
9+
}
10+
11+
const QueryTime: FC = () => {
12+
const {status, time} = useContext(ResultsContext)
13+
14+
if (status === RemoteDataState.Done) {
15+
return (
16+
<div className="query-status">
17+
<div className="status done" />
18+
<label>Ready ({humanReadable(time)})</label>
19+
</div>
20+
)
21+
}
22+
23+
if (status === RemoteDataState.Loading) {
24+
if (time < 1000) {
25+
return (
26+
<div className="query-status">
27+
<div className="status loading" />
28+
<label>Running...</label>
29+
</div>
30+
)
31+
}
32+
return (
33+
<div className="query-status">
34+
<div className="status loading" />
35+
<label>Running ({humanReadable(time)})...</label>
36+
</div>
37+
)
38+
}
39+
40+
if (status === RemoteDataState.Error) {
41+
return (
42+
<div className="query-status">
43+
<div className="status error" />
44+
<label>Error ({humanReadable(time)})</label>
45+
</div>
46+
)
47+
}
48+
49+
return (
50+
<div className="query-status">
51+
<div className="status pending" />
52+
</div>
53+
)
54+
}
55+
56+
export default QueryTime

src/dataExplorer/components/Results.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import './Results.scss'
1212

1313
// simplified version migrated from src/flows/pipes/Table/view.tsx
1414
const QueryStat: FC = () => {
15-
const {result, time} = useContext(ResultsContext)
15+
const {result} = useContext(ResultsContext)
1616

1717
const tableColumn = result?.parsed?.table?.getColumn('table') || []
1818
const lastTableValue = tableColumn[tableColumn.length - 1] || -1
@@ -33,7 +33,6 @@ const QueryStat: FC = () => {
3333
<span className="query-stat--bold">{`${tableNum} tables`}</span>
3434
<span className="query-stat--bold">{`${result?.parsed?.table?.length ||
3535
0} rows`}</span>
36-
<span className="query-stat--normal">{`${time} ms`}</span>
3736
</div>
3837
)
3938
}

src/dataExplorer/components/ResultsContext.tsx

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {FC, createContext, useState} from 'react'
1+
import React, {FC, createContext, useState, useRef, useEffect} from 'react'
22
import {FluxResult} from 'src/types/flows'
33
import {RemoteDataState} from 'src/types'
44

@@ -9,25 +9,57 @@ interface ResultsContextType {
99

1010
setStatus: (status: RemoteDataState) => void
1111
setResult: (result: FluxResult) => void
12-
setTime: (time: number) => void
1312
}
1413

1514
export const ResultsContext = createContext<ResultsContextType>({
1615
status: RemoteDataState.NotStarted,
1716
result: {} as FluxResult,
18-
time: 0,
17+
time: null,
1918

2019
setStatus: _ => {},
2120
setResult: _ => {},
22-
setTime: _ => {},
2321
})
2422

2523
export const ResultsProvider: FC = ({children}) => {
2624
const [result, setResult] = useState<FluxResult>({} as FluxResult)
27-
const [time, setTime] = useState<number>(0)
25+
const timeStart = useRef<number>(null)
26+
const [time, setTime] = useState<number>(null)
2827
const [status, setStatus] = useState<RemoteDataState>(
2928
RemoteDataState.NotStarted
3029
)
30+
31+
useEffect(() => {
32+
let running = false
33+
const check = () => {
34+
if (!running) {
35+
return
36+
}
37+
38+
setTime(Date.now() - timeStart.current)
39+
40+
window.requestAnimationFrame(check)
41+
}
42+
43+
if (status === RemoteDataState.Loading) {
44+
if (!timeStart.current) {
45+
timeStart.current = Date.now()
46+
}
47+
48+
running = true
49+
window.requestAnimationFrame(check)
50+
} else if (
51+
status === RemoteDataState.Done ||
52+
status === RemoteDataState.Error
53+
) {
54+
running = false
55+
timeStart.current = null
56+
}
57+
58+
return () => {
59+
running = false
60+
}
61+
}, [status])
62+
3163
return (
3264
<ResultsContext.Provider
3365
value={{
@@ -37,7 +69,6 @@ export const ResultsProvider: FC = ({children}) => {
3769

3870
setStatus,
3971
setResult,
40-
setTime,
4172
}}
4273
>
4374
{children}

src/dataExplorer/components/ResultsPane.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {notify} from 'src/shared/actions/notifications'
2727
import {TIME_RANGE_START, TIME_RANGE_STOP} from 'src/variables/constants'
2828
import {getRangeVariable} from 'src/variables/utils/getTimeRangeVars'
2929
import {getWindowPeriodVariableFromVariables} from 'src/variables/utils/getWindowVars'
30+
import QueryTime from 'src/dataExplorer/components/QueryTime'
3031

3132
import {DEFAULT_TIME_RANGE} from 'src/shared/constants/timeRanges'
3233

@@ -46,7 +47,7 @@ const ResultsPane: FC = () => {
4647
INITIAL_HORIZ_RESIZER_HANDLE,
4748
])
4849
const {basic, query} = useContext(QueryContext)
49-
const {status, setStatus, setResult, setTime} = useContext(ResultsContext)
50+
const {status, setStatus, setResult} = useContext(ResultsContext)
5051

5152
const [text, setText] = useLocalStorageState()
5253
const [timeRange, setTimeRange] = useState<TimeRange>(DEFAULT_TIME_RANGE)
@@ -88,7 +89,6 @@ const ResultsPane: FC = () => {
8889
}
8990

9091
setStatus(RemoteDataState.Loading)
91-
const time = Date.now()
9292
query(text, {
9393
vars: {
9494
timeRangeStart,
@@ -98,11 +98,9 @@ const ResultsPane: FC = () => {
9898
.then(r => {
9999
setResult(r)
100100
setStatus(RemoteDataState.Done)
101-
setTime(Date.now() - time)
102101
})
103102
.catch(() => {
104103
setStatus(RemoteDataState.Error)
105-
setTime(0)
106104
})
107105
}
108106

@@ -150,6 +148,7 @@ const ResultsPane: FC = () => {
150148
justifyContent={JustifyContent.FlexEnd}
151149
margin={ComponentSize.Small}
152150
>
151+
<QueryTime />
153152
<Button
154153
titleText="Download query results as a .CSV file"
155154
text="CSV"

0 commit comments

Comments
 (0)