Skip to content

Commit

Permalink
[Discover] complete fetching part
Browse files Browse the repository at this point in the history
  • Loading branch information
dimaanj committed May 26, 2021
1 parent b81a4e2 commit 7f69c92
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 131 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,18 @@ import {
} from '../../../../../../data/public';
import { EsHitRecord } from './context';

export type FetchAnchorCallback = (
indexPatternId: string,
anchorId: string,
sort: EsQuerySortValue[]
) => Promise<EsHitRecord>;

export function fetchAnchorProvider(
indexPatterns: IndexPatternsContract,
searchSource: ISearchSource,
useNewFieldsApi: boolean = false
) {
return async function fetchAnchor(
indexPatternId: string,
anchorId: string,
sort: EsQuerySortValue[]
): Promise<EsHitRecord> {
): FetchAnchorCallback {
return async function fetchAnchor(indexPatternId, anchorId, sort) {
const indexPattern = await indexPatterns.get(indexPatternId);
searchSource
.setParent(undefined)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ export interface ContextQueryState {
loadingStatus: LoadingStatusState;
queryParameters: QueryParameters;
rows: ContextRows;
hits: EsHitRecordList;
predecessors: EsHitRecordList;
successors: EsHitRecordList;
anchor: EsHitRecord;
anchorStatus: LoadingState;
predecessorsStatus: LoadingState;
successorsStatus: LoadingState;
predecessorCount: number;
successorCount: number;
useNewFieldsApi: boolean;
}

Expand All @@ -42,6 +51,8 @@ export interface LoadingStatusState {
successors: LoadingStatusEntry | LoadingStatus;
}

export type LoadingState = LoadingStatusEntry | LoadingStatus;

export interface QueryParameters {
anchorId: string;
columns: string[];
Expand All @@ -54,11 +65,11 @@ export interface QueryParameters {
tieBreakerField: string;
}

interface ContextRows {
export interface ContextRows {
all: EsHitRecordList;
anchor: EsHitRecord;
// predecessors: EsHitRecordList;
// successors: EsHitRecordList;
predecessors: EsHitRecordList;
successors: EsHitRecordList;
}

export function getContextQueryDefaults(
Expand All @@ -75,17 +86,30 @@ export function getContextQueryDefaults(
defaultStepSize,
tieBreakerField
),
hits: [],
predecessors: [],
successors: [],
anchor: {
fields: [],
sort: [],
_id: '',
},
rows: {
all: [],
anchor: {
fields: [],
sort: [],
_id: '',
},
// predecessors: [],
// successors: [],
predecessors: [],
successors: [],
},
loadingStatus: createInitialLoadingStatusState(),
anchorStatus: LoadingStatus.UNINITIALIZED,
predecessorsStatus: LoadingStatus.UNINITIALIZED,
successorsStatus: LoadingStatus.UNINITIALIZED,
predecessorCount: 5,
successorCount: 5,
useNewFieldsApi,
};
}
16 changes: 8 additions & 8 deletions src/plugins/discover/public/application/angular/context_state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,18 @@ export interface AppState extends ContextQueryState {
* Array of filters
*/
filters?: Filter[];
/**
* Number of records to be fetched before anchor records (newer records)
*/
predecessorCount?: number;
// /**
// * Number of records to be fetched before anchor records (newer records)
// */
// predecessorCount?: number;
/**
* Sorting of the records to be fetched, assumed to be a legacy parameter
*/
sort: [[string, SortDirection]];
/**
* Number of records to be fetched after the anchor records (older records)
*/
successorCount: number;
// /**
// * Number of records to be fetched after the anchor records (older records)
// */
// successorCount: number;
query?: Query;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,22 @@
* Side Public License, v 1.
*/

import React, { useState, Fragment, useEffect, useRef } from 'react';
import React, { useState, Fragment, useEffect, useRef, useCallback } from 'react';
import classNames from 'classnames';
import { FormattedMessage, I18nProvider } from '@kbn/i18n/react';
import './context_app_legacy.scss';
import { EuiHorizontalRule, EuiText, EuiPageContent, EuiPage, EuiSpacer } from '@elastic/eui';
import { cloneDeep, isEqual } from 'lodash';
import { FilterManager } from 'src/plugins/data/public';
import { map } from 'rxjs/operators';
import { DOC_HIDE_TIME_COLUMN_SETTING, DOC_TABLE_LEGACY } from '../../../../common';
import { ContextErrorMessage } from '../context_error_message';
import {
DocTableLegacy,
DocTableLegacyProps,
} from '../../angular/doc_table/create_doc_table_react';
import { IndexPattern } from '../../../../../data/common/index_patterns';
import { LoadingStatus } from '../../angular/context_query_state';
import { LoadingState, LoadingStatus } from '../../angular/context_query_state';
import { ActionBar, ActionBarProps } from '../../angular/context/components/action_bar/action_bar';
import { TopNavMenuProps } from '../../../../../navigation/public';
import { DiscoverGrid, DiscoverGridProps } from '../discover_grid/discover_grid';
Expand All @@ -31,6 +33,7 @@ import { EsHitRecord, EsHitRecordList } from '../../angular/context/api/context'
import { useContextAppState } from './use_context_app_state';
import { useContextAppQuery } from './use_context_app_query';
import { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE } from '../../angular/context/query_parameters';
// import { fetchAnchorRow } from './context_app_actions';

export interface ContextAppProps {
topNavMenu: React.ComponentType<TopNavMenuProps>;
Expand Down Expand Up @@ -62,7 +65,7 @@ const DataGridMemoized = React.memo(DiscoverGrid);
const PREDECESSOR_TYPE = 'predecessors';
const SUCCESSOR_TYPE = 'successors';

function isLoading(status: string) {
function isLoading(status: LoadingState) {
return status !== LoadingStatus.LOADED && status !== LoadingStatus.FAILED;
}

Expand All @@ -76,9 +79,9 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
const {
indexPattern,
indexPatternId,
anchorStatus,
predecessorStatus,
successorStatus,
// anchorStatus,
// predecessorStatus,
// successorStatus,
// hits: rows,
sorting,
anchorId,
Expand All @@ -87,64 +90,84 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
useNewFieldsApi,
} = renderProps;
const [expandedDoc, setExpandedDoc] = useState<EsHitRecord | undefined>(undefined);
const isAnchorLoaded = anchorStatus === LoadingStatus.LOADED;
const isFailed = anchorStatus === LoadingStatus.FAILED;
const allRowsLoaded =
anchorStatus === LoadingStatus.LOADED &&
predecessorStatus === LoadingStatus.LOADED &&
successorStatus === LoadingStatus.LOADED;
// const isAnchorLoaded = anchor === LoadingStatus.LOADED;
// const isFailed = anchorStatus === LoadingStatus.FAILED;
// const allRowsLoaded =
// anchorStatus === LoadingStatus.LOADED &&
// predecessorStatus === LoadingStatus.LOADED &&
// successorStatus === LoadingStatus.LOADED;
const isLegacy = config.get(DOC_TABLE_LEGACY);
// const anchorId = rows?.find(({ isAnchor }) => isAnchor)?._id;

const { state, stateContainer, setAppState } = useContextAppState({
const { state, setAppState } = useContextAppState({
indexPattern,
indexPatternId,
anchorId,
services,
});
const prevState = useRef<AppState>();

useEffect(() => {
stateContainer.startSync();
const isAnchorLoaded = state.anchorStatus === LoadingStatus.LOADED;
const isFailed = state.anchorStatus === LoadingStatus.FAILED;
const allRowsLoaded =
state.anchorStatus === LoadingStatus.LOADED &&
state.predecessorsStatus === LoadingStatus.LOADED &&
state.successorsStatus === LoadingStatus.LOADED;

return () => stateContainer.stopSync();
}, [stateContainer]);
// useEffect(() => {
// stateContainer.startSync();

const { context$, fetchAnchorRow, fetchAllRows } = useContextAppQuery({
// return () => stateContainer.stopSync();
// }, [stateContainer]);

const { context$, fetchContextRows, fetchAllRows } = useContextAppQuery({
services,
useNewFieldsApi: !!useNewFieldsApi,
state,
});

/**
* Fetch docs
*/
useEffect(() => {
if (!prevState.current) {
fetchAllRows();
fetchAllRows(state.predecessorCount, state.successorCount, {
indexPatternId,
anchorId,
tieBreakerField: state.queryParameters.tieBreakerField,
sort: state.sort,
});
} else if (
prevState.current.predecessorCount !== state.predecessorCount ||
prevState.current.successorCount !== state.successorCount ||
!isEqual(prevState.current.filters, state.filters)
) {
fetchAllRows();
fetchContextRows(state.predecessorCount, state.successorCount, {
indexPatternId,
anchor: state.anchor,
tieBreakerField: state.queryParameters.tieBreakerField,
sort: state.sort,
});
}

prevState.current = cloneDeep(state);
}, [state, fetchAllRows, fetchAnchorRow, indexPatternId]);
}, [state, indexPatternId, anchorId, fetchContextRows, fetchAllRows]);

/**
* Sync app state with context$
*/
useEffect(() => {
context$.subscribe((next) => {
setAppState(next);
context$.subscribe((value) => {
setAppState(value);
});

return () => context$.unsubscribe();
}, [context$, setAppState]);

const rows = state.rows;
const rows = [
...(state.predecessors || []),
...(state.anchor ? [state.anchor] : []),
...(state.successors || []),
];
const { columns, onAddColumn, onRemoveColumn, onSetColumns } = useDataGridColumns({
capabilities,
config,
Expand All @@ -171,7 +194,9 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
docCount: isPredecessorType ? predecessorCount : successorCount,
docCountAvailable: isPredecessorType ? predecessorAvailable : successorAvailable,
onChangeCount: isPredecessorType ? onChangePredecessorCount : onChangeSuccessorCount,
isLoading: isPredecessorType ? isLoading(predecessorStatus) : isLoading(successorStatus),
isLoading: isPredecessorType
? isLoading(state.predecessorsStatus)
: isLoading(state.successorsStatus),
type,
isDisabled: !isAnchorLoaded,
} as ActionBarProps;
Expand All @@ -181,7 +206,7 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
return {
ariaLabelledBy: 'surDocumentsAriaLabel',
columns,
rows: rows.all.length !== 0 && rows.all,
rows: rows.length !== 0 && rows,
indexPattern,
expandedDoc,
isLoading: !allRowsLoaded,
Expand Down Expand Up @@ -230,7 +255,10 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
};

const loadingFeedback = () => {
if (anchorStatus === LoadingStatus.UNINITIALIZED || anchorStatus === LoadingStatus.LOADING) {
if (
state.anchorStatus === LoadingStatus.UNINITIALIZED ||
state.anchorStatus === LoadingStatus.LOADING
) {
return (
<EuiText textAlign="center" data-test-subj="contextApp_loadingIndicator">
<FormattedMessage id="discover.context.loadingDescription" defaultMessage="Loading..." />
Expand All @@ -243,7 +271,10 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
return (
<I18nProvider>
{isFailed ? (
<ContextErrorMessage status={anchorStatus} reason={renderProps.anchorReason} />
<ContextErrorMessage
status={state.anchorStatus as string}
reason={renderProps.anchorReason}
/>
) : (
<Fragment>
<TopNavMenu {...getNavBarProps()} />
Expand Down
Loading

0 comments on commit 7f69c92

Please sign in to comment.