Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/dataExplorer/components/DeleteScript.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {ResultsContext} from 'src/dataExplorer/context/results'
import {RemoteDataState} from 'src/types'
import {QueryContext} from 'src/shared/contexts/query'
import {SCRIPT_EDITOR_PARAMS} from 'src/dataExplorer/components/resources'
import {ResultsViewContext} from 'src/dataExplorer/context/resultsView'

let deleteScript

Expand All @@ -28,6 +29,7 @@ const DeleteScript: FC<Props> = ({onBack, onClose}) => {
const {resource} = useContext(PersistanceContext)
const {cancel} = useContext(QueryContext)
const {setStatus, setResult} = useContext(ResultsContext)
const {clear: clearViewOptions} = useContext(ResultsViewContext)
const history = useHistory()
const dispatch = useDispatch()
const org = useSelector(getOrg)
Expand All @@ -43,6 +45,7 @@ const DeleteScript: FC<Props> = ({onBack, onClose}) => {

setStatus(RemoteDataState.NotStarted)
setResult(null)
clearViewOptions()
cancel()
history.replace(
`/orgs/${org.id}/data-explorer/from/script${SCRIPT_EDITOR_PARAMS}`
Expand Down
91 changes: 68 additions & 23 deletions src/dataExplorer/components/Results.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import React, {FC, useState, useContext, useMemo, useCallback} from 'react'
import React, {
FC,
useCallback,
useContext,
useEffect,
useMemo,
useState,
} from 'react'
import {
FlexBox,
FlexDirection,
Expand All @@ -7,9 +14,21 @@ import {
IconFont,
ComponentStatus,
ComponentColor,
SpinnerContainer,
TechnoSpinner,
} from '@influxdata/clockface'

import {RemoteDataState, SimpleTableViewProperties} from 'src/types'
// Components
import {SearchWidget} from 'src/shared/components/search_widget/SearchWidget'
import {
View,
ViewTypeDropdown,
ViewOptions,
SUPPORTED_VISUALIZATIONS,
} from 'src/visualization'
import {SqlViewOptions} from 'src/dataExplorer/components/SqlViewOptions'

// Contexts
import {ResultsContext} from 'src/dataExplorer/context/results'
import {
ResultsViewContext,
Expand All @@ -18,18 +37,17 @@ import {
import {ChildResultsContext} from 'src/dataExplorer/context/results/childResults'
import {SidebarContext} from 'src/dataExplorer/context/sidebar'
import {PersistanceContext} from 'src/dataExplorer/context/persistance'
import {SearchWidget} from 'src/shared/components/search_widget/SearchWidget'
import {
View,
ViewTypeDropdown,
ViewOptions,
SUPPORTED_VISUALIZATIONS,
} from 'src/visualization'

// Types
import {FluxResult} from 'src/types/flows'
import {RemoteDataState, SimpleTableViewProperties} from 'src/types'

import './Results.scss'
// Utils
import {bytesFormatter} from 'src/shared/copy/notifications'

import './Results.scss'
import {LanguageType} from './resources'

const QueryStat: FC = () => {
const {result} = useContext(ResultsContext)

Expand Down Expand Up @@ -154,13 +172,15 @@ const GraphResults: FC = () => {

return (
<div className="data-explorer-results--view">
<View
loading={status}
properties={view.properties}
result={result?.parsed}
timeRange={range}
hideTimer
/>
<SpinnerContainer loading={status} spinnerComponent={<TechnoSpinner />}>
<View
loading={status}
properties={view.properties}
result={result?.parsed}
timeRange={range}
hideTimer
/>
</SpinnerContainer>
</div>
)
}
Expand All @@ -169,7 +189,10 @@ const WrappedOptions: FC = () => {
// use parent `results` so all metadata is present for the viz options
const {result} = useContext(ResultsContext)
const {setResult, setStatus} = useContext(ChildResultsContext)
const {view, setView /* setViewOptions*/} = useContext(ResultsViewContext)
const {view, setView, selectViewOptions, viewOptions, selectedViewOptions} =
useContext(ResultsViewContext)
const {resource} = useContext(PersistanceContext)
const dataExists = !!result?.parsed

const updateChildResults = useCallback(
update => {
Expand All @@ -184,8 +207,19 @@ const WrappedOptions: FC = () => {
[setStatus, setResult]
)

// TODO: make component with `update={setViewOptions}`, for QxBuilder-specific graph subquery options
const subQueryOptions = null
if (!dataExists) {
return null
}

const subQueryOptions =
resource?.language === LanguageType.SQL &&
view.state == ViewStateType.Graph ? (
<SqlViewOptions
selectViewOptions={selectViewOptions}
allViewOptions={viewOptions}
selectedViewOptions={selectedViewOptions}
/>
) : null

return (
<>
Expand All @@ -200,14 +234,26 @@ const WrappedOptions: FC = () => {
}

const GraphHeader: FC = () => {
const {view, setView} = useContext(ResultsViewContext)
const {view, setView, viewOptions} = useContext(ResultsViewContext)
const {result} = useContext(ResultsContext)
const {result: subQueryResult} = useContext(ChildResultsContext)
const {launch} = useContext(SidebarContext)
const {launch, clear: closeSidebar} = useContext(SidebarContext)

const dataExists = !!result?.parsed

const launcher = () => {
launch(<WrappedOptions />)
}
useEffect(() => {
if (dataExists) {
launcher()
}
}, [viewOptions])
useEffect(() => {
if (!dataExists) {
closeSidebar()
}
}, [dataExists])

const updateType = viewType => {
setView({
Expand All @@ -216,7 +262,6 @@ const GraphHeader: FC = () => {
})
}

const dataExists = !!result?.parsed
const subqueryReturnsData = !!subQueryResult?.parsed
let titleText = 'Configure Visualization'
if (!dataExists) {
Expand Down
3 changes: 3 additions & 0 deletions src/dataExplorer/components/SaveAsScript.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {
copyToClipboardFailed,
copyToClipboardSuccess,
} from 'src/shared/copy/notifications'
import {ResultsViewContext} from 'src/dataExplorer/context/resultsView'
interface Props {
language: LanguageType
onClose: () => void
Expand All @@ -52,6 +53,7 @@ const SaveAsScript: FC<Props> = ({language, onClose, setOverlayType, type}) => {
const isIoxOrg = useSelector(isOrgIOx)
const {cancel} = useContext(QueryContext)
const {setStatus, setResult} = useContext(ResultsContext)
const {clear: clearViewOptions} = useContext(ResultsViewContext)
const [error, setError] = useState<string>()
// Setting the name to state rather than persisting it to session storage
// so that we can cancel out of a name change if needed
Expand Down Expand Up @@ -96,6 +98,7 @@ const SaveAsScript: FC<Props> = ({language, onClose, setOverlayType, type}) => {
cancel()
setStatus(RemoteDataState.NotStarted)
setResult(null)
clearViewOptions()

if (isIoxOrg) {
history.replace(
Expand Down
7 changes: 6 additions & 1 deletion src/dataExplorer/components/ScriptQueryBuilder.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ import {QueryProvider} from 'src/shared/contexts/query'
import {EditorProvider} from 'src/shared/contexts/editor'
import {ResultsProvider, ResultsContext} from 'src/dataExplorer/context/results'
import {ChildResultsProvider} from 'src/dataExplorer/context/results/childResults'
import {ResultsViewProvider} from 'src/dataExplorer/context/resultsView'
import {
ResultsViewProvider,
ResultsViewContext,
} from 'src/dataExplorer/context/resultsView'
import {SidebarProvider} from 'src/dataExplorer/context/sidebar'
import {
PersistanceProvider,
Expand Down Expand Up @@ -59,12 +62,14 @@ const ScriptQueryBuilder: FC = () => {
const isIoxOrg = useSelector(isOrgIOx)
const {cancel} = useContext(QueryContext)
const {setStatus, setResult} = useContext(ResultsContext)
const {clear: clearViewOptions} = useContext(ResultsViewContext)
const org = useSelector(getOrg)

const handleClear = useCallback(() => {
cancel()
setStatus(RemoteDataState.NotStarted)
setResult(null)
clearViewOptions()

if (isIoxOrg) {
history.replace(
Expand Down
11 changes: 11 additions & 0 deletions src/dataExplorer/components/SqlViewOptions.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@import '@influxdata/clockface/dist/variables.scss';

.sql-view-options {
.cf-list {
flex: 1 0 !important;

.selector-list--item {
height: $cf-form-xs-height;
}
}
}
77 changes: 77 additions & 0 deletions src/dataExplorer/components/SqlViewOptions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import React, {FC} from 'react'
import {Columns, Grid} from '@influxdata/clockface'

import SelectorList from 'src/timeMachine/components/SelectorList'
import SelectorTitle from 'src/dataExplorer/components/SelectorTitle'
import {ViewOptions} from 'src/dataExplorer/context/resultsView'

import './SqlViewOptions.scss'

interface SqlViewOptionsT {
selectViewOptions: (_: Partial<ViewOptions>) => void
allViewOptions: ViewOptions
selectedViewOptions: ViewOptions
}

export const SqlViewOptions: FC<SqlViewOptionsT> = ({
selectViewOptions,
allViewOptions,
selectedViewOptions,
}) => {
const handleSelectedListItem = (propKey, value) => {
if ((selectedViewOptions[propKey] ?? []).includes(value)) {
selectViewOptions({
[propKey]: selectedViewOptions[propKey].filter(v => v !== value),
})
} else {
selectViewOptions({
[propKey]: (selectedViewOptions[propKey] ?? []).concat([value]),
})
}
}

const groupbyTooltipContents = (
<div>
<span>Select the GROUPBY used for the graph subquery.</span>
<br />
<br />
<span>
Options are based on returned data results (refer to your table
columns).
</span>
<br />
<br />
<span>
By default, the GROUPBY is done on all tagKeys in order to produce a
dataseries.
</span>
</div>
)

return (
<div className="view-options sql-view-options">
<Grid>
<Grid.Row>
<Grid.Column
widthXS={Columns.Twelve}
widthMD={Columns.Six}
widthLG={Columns.Four}
className="view-options-container"
>
<h5 className="view-options--header">Query Modifier</h5>
<SelectorTitle
label="Grouping"
tooltipContents={groupbyTooltipContents}
/>
<SelectorList
items={allViewOptions?.groupby ?? []}
selectedItems={selectedViewOptions?.groupby ?? []}
onSelectItem={tagKey => handleSelectedListItem('groupby', tagKey)}
multiSelect={true}
/>
</Grid.Column>
</Grid.Row>
</Grid>
</div>
)
}
41 changes: 32 additions & 9 deletions src/dataExplorer/context/results/childResults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,33 @@ import {LanguageType} from 'src/dataExplorer/components/resources'
// Utils
import {rangeToParam} from 'src/dataExplorer/shared/utils'

const modifiersToApply = (_viewOptions: ViewOptions): SqlQueryModifiers => {
const modifiersToApply = (viewOptions: ViewOptions): SqlQueryModifiers => {
const prepend = []
const append = []

// 1. groupby first
if (viewOptions.groupby?.length) {
append.push(
`|> group(columns: [${viewOptions.groupby
.map(columnName => `"${columnName}"`)
.join(',')}])`
)
}

// 2. smoothing transformation next
// e.g. to smooth by selected column foo. Rough example.
const shouldSmooth = false
if (shouldSmooth) {
return {
prepend: `import "experimental/polyline"`,
append: `|> polyline.rdp(valColumn: "foo", timeColumn: "time")`,
}
prepend.push(`import "experimental/polyline"`)
// append.push(`|> polyline.rdp(valColumn: "foo", timeColumn: "time")`) // TODO
}

return null
return Boolean(prepend.length + append.length)
? {
prepend: prepend.join('\n'),
append: append.join('\n'),
}
: null
}

interface ChildResultsContextType {
Expand All @@ -51,12 +67,13 @@ export const ChildResultsContext =

export const ChildResultsProvider: FC = ({children}) => {
const [result, setResult] = useState<FluxResult>({} as FluxResult)
const [queryModifers, setQueryModifiers] = useState(null)
const [status, setStatus] = useState<RemoteDataState>(
RemoteDataState.NotStarted
)
const {status: statusFromParent, result: resultFromParent} =
useContext(ResultsContext)
const {viewOptions} = useContext(ResultsViewContext)
const {selectedViewOptions: viewOptions} = useContext(ResultsViewContext)
const {
query: queryText,
selection,
Expand All @@ -78,10 +95,16 @@ export const ChildResultsProvider: FC = ({children}) => {
return
}

// TODO: tranform functions, based on viewOptions change
const cannotRunIoxSqlMethod = !selection?.bucket
if (cannotRunIoxSqlMethod) {
return
}

const sqlQueryModifiers = modifiersToApply(viewOptions)
const previousQueryModifiers = queryModifers
setQueryModifiers(sqlQueryModifiers)

if (!sqlQueryModifiers) {
if (sqlQueryModifiers === previousQueryModifiers) {
return
}

Expand Down
Loading