diff --git a/web-console/src/components/menu-checkbox/menu-checkbox.tsx b/web-console/src/components/menu-checkbox/menu-checkbox.tsx index d305249bdb16..a22dff58e074 100644 --- a/web-console/src/components/menu-checkbox/menu-checkbox.tsx +++ b/web-console/src/components/menu-checkbox/menu-checkbox.tsx @@ -18,13 +18,14 @@ import type { MenuItemProps } from '@blueprintjs/core'; import { MenuItem } from '@blueprintjs/core'; +import { IconNames } from '@blueprintjs/icons'; import classNames from 'classnames'; import React from 'react'; import { checkedCircleIcon } from '../../utils'; export interface MenuCheckboxProps extends Omit { - checked: boolean; + checked: boolean | undefined; onChange: () => void; } @@ -34,7 +35,7 @@ export function MenuCheckbox(props: MenuCheckboxProps) { return ( - + ●  {status} - {errorMsg && errorMsg !== CANCELED_ERROR_MSG && ( - this.setState({ alertErrorMsg: errorMsg })} - title={errorMsg} - > -  ? - + {errorMsg && !TASK_CANCELED_ERROR_MESSAGES.includes(errorMsg) && ( + this.setState({ alertErrorMsg: errorMsg })}> ? )} diff --git a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx index 13e8f716a7c0..718f5315c109 100644 --- a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx +++ b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx @@ -28,7 +28,7 @@ import { useStore } from 'zustand'; import { Loader } from '../../../components'; import type { TaskStatusWithCanceled } from '../../../druid-models'; -import { Execution, WorkbenchQuery } from '../../../druid-models'; +import { Execution, TASK_CANCELED_PREDICATE, WorkbenchQuery } from '../../../druid-models'; import { cancelTaskExecution, getTaskExecution } from '../../../helpers'; import { useClock, useInterval, useQueryManager } from '../../../hooks'; import { AppToaster } from '../../../singletons'; @@ -105,7 +105,7 @@ export const RecentQueryTaskPanel = React.memo(function RecentQueryTaskPanel( processQuery: async _ => { return await queryDruidSql({ query: `SELECT - CASE WHEN "error_msg" = 'Shutdown request from user' THEN 'CANCELED' ELSE "status" END AS "taskStatus", + CASE WHEN ${TASK_CANCELED_PREDICATE} THEN 'CANCELED' ELSE "status" END AS "taskStatus", "task_id" AS "taskId", "datasource", "created_time" AS "createdTime", diff --git a/web-console/src/views/workbench-view/run-panel/run-panel.tsx b/web-console/src/views/workbench-view/run-panel/run-panel.tsx index e5bc24b62be8..07b915332dbc 100644 --- a/web-console/src/views/workbench-view/run-panel/run-panel.tsx +++ b/web-console/src/views/workbench-view/run-panel/run-panel.tsx @@ -109,6 +109,7 @@ export const RunPanel = React.memo(function RunPanel(props: RunPanelProps) { const finalizeAggregations = getFinalizeAggregations(queryContext); const groupByEnableMultiValueUnnesting = getGroupByEnableMultiValueUnnesting(queryContext); const sqlJoinAlgorithm = queryContext.sqlJoinAlgorithm ?? 'broadcast'; + const selectDestination = queryContext.selectDestination ?? 'taskReport'; const durableShuffleStorage = getDurableShuffleStorage(queryContext); const indexSpec: IndexSpec | undefined = deepGet(queryContext, 'indexSpec'); const useApproximateCountDistinct = getUseApproximateCountDistinct(queryContext); @@ -189,6 +190,12 @@ export const RunPanel = React.memo(function RunPanel(props: RunPanelProps) { return items; } + const overloadWarning = + query.unlimited && + (queryEngine === 'sql-native' || + (queryEngine === 'sql-msq-task' && selectDestination === 'taskReport')); + const intent = overloadWarning ? Intent.WARNING : undefined; + const effectiveEngine = query.getEffectiveEngine(); return (
@@ -322,14 +329,36 @@ export const RunPanel = React.memo(function RunPanel(props: RunPanelProps) { ))} { - setIndexSpecDialogSpec(indexSpec || {}); - }} - /> + icon={IconNames.MANUALLY_ENTERED_DATA} + text="SELECT destination" + label={selectDestination} + intent={intent} + > + {['taskReport', 'durableStorage'].map(o => ( + + changeQueryContext(deepSet(queryContext, 'selectDestination', o)) + } + /> + ))} + + : undefined + } + onChange={() => { + onQueryChange(query.toggleUnlimited()); + }} + /> + + { + setIndexSpecDialogSpec(indexSpec || {}); + }} + /> ) : ( <> @@ -372,24 +410,26 @@ export const RunPanel = React.memo(function RunPanel(props: RunPanelProps) { } /> )} - : undefined - } - onChange={() => { - onQueryChange(query.toggleUnlimited()); - }} - /> + {effectiveEngine === 'sql-native' && ( + : undefined + } + onChange={() => { + onQueryChange(query.toggleUnlimited()); + }} + /> + )} } >