Skip to content

Commit

Permalink
chore(Queries): add query suggestions store [YTFRONT-4612]
Browse files Browse the repository at this point in the history
  • Loading branch information
SimbiozizV committed Feb 7, 2025
1 parent 4639d41 commit 066de49
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 3 deletions.
2 changes: 2 additions & 0 deletions packages/ui/src/ui/pages/query-tracker/module/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export interface DraftQuery {
query: string;
annotations?: {
title?: string;
contextId?: string;
};
settings?: {
cluster?: string;
Expand Down Expand Up @@ -134,6 +135,7 @@ export interface QueryItem extends DraftQuery {
error?: QueryError;
annotations?: {
title?: string;
contextId?: string;
chartConfig?: Visualization;
};
}
Expand Down
2 changes: 2 additions & 0 deletions packages/ui/src/ui/pages/query-tracker/module/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {queryFilesFormReducer} from './queryFilesForm/queryFilesFormSlice';
import {vcsReducer} from './vcs/vcsSlice';
import {queryNavigationReducer} from './queryNavigation/queryNavigationSlice';
import {queryChartReducer} from './queryChart/queryChartSlice';
import {querySuggestionsReducer} from './querySuggestions/querySuggestionsSlice';

export const queryTracker = combineReducers({
list: listReducer,
Expand All @@ -17,4 +18,5 @@ export const queryTracker = combineReducers({
vcs: vcsReducer,
queryNavigation: queryNavigationReducer,
queryChart: queryChartReducer,
querySuggestions: querySuggestionsReducer,
});
22 changes: 19 additions & 3 deletions packages/ui/src/ui/pages/query-tracker/module/query/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ import {chytApiAction, spytApiAction} from '../../../../utils/strawberryControll
import guid from '../../../../common/hammer/guid';
import {getSettingQueryTrackerStage} from '../../../../store/selectors/settings/settings-ts';
import {getDefaultQueryACO, selectIsMultipleAco} from '../query_aco/selectors';
import {createContextId} from '../querySuggestions/actions';
import {setContextId} from '../querySuggestions/querySuggestionsSlice';

import {
REQUEST_QUERY,
Expand All @@ -50,6 +52,7 @@ import {
UPDATE_QUERY,
} from '../query-tracker-contants';
import {loadVisualization} from '../queryChart/actions';
import {selectQuerySuggestionsContextId} from '../querySuggestions/selectors';

export const setCurrentClusterToQuery =
(): ThunkAction<void, RootState, unknown, any> => (dispatch, getState) => {
Expand Down Expand Up @@ -111,7 +114,12 @@ export const loadCliqueByCluster =
export function loadQuery(
queryId: string,
config?: {dontReplaceQueryText?: boolean},
): ThunkAction<any, RootState, any, SetQueryAction | RequestQueryAction | SetQueryErrorLoadAction> {
): ThunkAction<
any,
RootState,
any,
SetQueryAction | RequestQueryAction | SetQueryErrorLoadAction | ReturnType<typeof setContextId>
> {
return async (dispatch, getState) => {
const state = getState();
const stage = getSettingQueryTrackerStage(state);
Expand All @@ -135,6 +143,12 @@ export function loadQuery(
queryItem.query = state.queryTracker.query.draft.query;
}

if (!queryItem.annotations?.contextId) {
dispatch(createContextId(queryId));
} else {
dispatch(setContextId(queryItem.annotations?.contextId));
}

dispatch({
type: SET_QUERY,
data: {
Expand Down Expand Up @@ -211,11 +225,12 @@ export function createEmptyQuery(
engine = QueryEngine.YQL,
query?: string,
settings?: Record<string, string>,
): ThunkAction<any, RootState, any, SetQueryAction> {
): ThunkAction<any, RootState, any, SetQueryAction | ReturnType<typeof setContextId>> {
return (dispatch, getState) => {
const state = getState();
const defaultQueryACO = getDefaultQueryACO(state);

dispatch(setContextId(guid()));
dispatch({
type: SET_QUERY,
data: {
Expand All @@ -239,8 +254,9 @@ export function runQuery(
return async (dispatch, getState) => {
const state = getState();
const query = getQueryDraft(state);
const contextId = selectQuerySuggestionsContextId(state);

const newQuery = {...query};
const newQuery = {...query, annotations: {...query.annotations, contextId}};
if ('access_control_objects' in newQuery) {
newQuery.access_control_objects = newQuery.access_control_objects?.filter(
(i) => i !== SHARED_QUERY_ACO,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export const DEFAULT_QUERY_ACO = 'nobody';
export const SHARED_QUERY_ACO = 'everyone-share';

export const getQuery = (state: RootState) => getState(state).queryItem;
export const getQueryId = (state: RootState) => getState(state).queryItem?.id;
export const getQueryGetParams = (state: RootState) => getState(state).params;

export const getQueryDraft = (state: RootState) => getState(state).draft;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import {ThunkAction} from 'redux-thunk';
import {RootState} from '../../../../store/reducers';
import {wrapApiPromiseByToaster} from '../../../../utils/utils';
import {YTApiId, ytApiV4Id} from '../../../../rum/rum-wrap-api';
import {setContextId} from './querySuggestionsSlice';
import guid from '../../../../common/hammer/guid';

export const createContextId =
(queryId: string): ThunkAction<void, RootState, unknown, any> =>
async (dispatch) => {
const newContextId = guid();

await wrapApiPromiseByToaster(
ytApiV4Id.alterQuery(YTApiId.alterQuery, {
parameters: {
query_id: queryId,
annotations: {
contextId: newContextId,
},
},
}),
{
toasterName: `context_id`,
skipSuccessToast: true,
errorTitle: `Failed to set query context id`,
},
);
dispatch(setContextId(newContextId));
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import {PayloadAction, createSlice} from '@reduxjs/toolkit';

export type PrevAction = 'accepted' | 'ignored' | 'discarded' | 'empty' | 'received';

type QuerySuggestionsState = {
suggestions: string[];
prevAction: PrevAction;
requestId: string;
contextId: string;
};

const initialState: QuerySuggestionsState = {
suggestions: [],
prevAction: 'empty',
requestId: '',
contextId: '',
};

const querySuggestionsSlice = createSlice({
initialState,
name: 'querySuggestions',
reducers: {
setSuggestions: (state, {payload}: PayloadAction<string[]>) => {
state.suggestions = payload;
},
setRequestId: (state, {payload}: PayloadAction<string>) => {
state.requestId = payload;
},
setContextId: (state, {payload}: PayloadAction<string>) => {
state.contextId = payload;
},
setPrevAction: (state, {payload}: PayloadAction<PrevAction>) => {
state.prevAction = payload;
},
},
});

export const {setSuggestions, setRequestId, setContextId, setPrevAction} =
querySuggestionsSlice.actions;

export const querySuggestionsReducer = querySuggestionsSlice.reducer;
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {RootState} from '../../../../store/reducers';

export const selectQuerySuggestionsContextId = (state: RootState) =>
state.queryTracker.querySuggestions.contextId;

export const selectQuerySuggestionsRequestId = (state: RootState) =>
state.queryTracker.querySuggestions.requestId;

export const selectQuerySuggestions = (state: RootState) =>
state.queryTracker.querySuggestions.suggestions;

export const selectPrevAction = (state: RootState) =>
state.queryTracker.querySuggestions.prevAction;

0 comments on commit 066de49

Please sign in to comment.