Skip to content

Commit

Permalink
[Discover] update EsHitRecord type, use it for context app. add no pa…
Browse files Browse the repository at this point in the history
…gination support
  • Loading branch information
dimaanj committed May 21, 2021
1 parent 3a70b98 commit 6388555
Show file tree
Hide file tree
Showing 12 changed files with 55 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { EsQuerySortValue, SortDirection } from '../../../../../../data/public';
import { createIndexPatternsStub, createSearchSourceStub } from './_stubs';
import { fetchAnchorProvider } from './anchor';
import { EsHitRecord } from './context';
import { EsHitRecord, EsHitRecordList } from './context';

describe('context app', function () {
let fetchAnchor: (
Expand All @@ -22,9 +22,7 @@ describe('context app', function () {

describe('function fetchAnchor', function () {
beforeEach(() => {
searchSourceStub = createSearchSourceStub([
{ _id: 'hit1', fields: [], sort: [], _source: {} },
]);
searchSourceStub = createSearchSourceStub(([{ _id: 'hit1' }] as unknown) as EsHitRecordList);
fetchAnchor = fetchAnchorProvider(createIndexPatternsStub(), searchSourceStub);
});

Expand Down Expand Up @@ -147,9 +145,7 @@ describe('context app', function () {

describe('useNewFields API', () => {
beforeEach(() => {
searchSourceStub = createSearchSourceStub([
{ _id: 'hit1', fields: [], sort: [], _source: {} },
]);
searchSourceStub = createSearchSourceStub(([{ _id: 'hit1' }] as unknown) as EsHitRecordList);
fetchAnchor = fetchAnchorProvider(createIndexPatternsStub(), searchSourceStub, true);
});

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

import type { estypes } from '@elastic/elasticsearch';
import { Filter, IndexPatternsContract, IndexPattern } from 'src/plugins/data/public';
import { reverseSortDir, SortDirection } from './utils/sorting';
import { extractNanos, convertIsoToMillis } from './utils/date_conversion';
Expand All @@ -16,15 +17,11 @@ import { getEsQuerySort } from './utils/get_es_query_sort';
import { getServices } from '../../../../kibana_services';

export type SurrDocType = 'successors' | 'predecessors';
export interface EsHitRecord {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
fields: Record<string, any>;
sort: number[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
_source: Record<string, any>;
_id: string;
export type EsHitRecord = Required<estypes.SearchResponse['hits']['hits'][number]> & {
sort: Array<number | string>;
_source: Record<string, string | number>;
isAnchor?: boolean;
}
};
export type EsHitRecordList = EsHitRecord[];

const DAY_MILLIS = 24 * 60 * 60 * 1000;
Expand Down Expand Up @@ -71,7 +68,7 @@ function fetchContextProvider(indexPatterns: IndexPatternsContract, useNewFields
const timeValueMillis =
nanos !== '' ? convertIsoToMillis(anchor.fields[timeField][0]) : anchor.sort[0];

const intervals = generateIntervals(LOOKUP_OFFSETS, timeValueMillis, type, sortDir);
const intervals = generateIntervals(LOOKUP_OFFSETS, timeValueMillis as number, type, sortDir);
let documents: EsHitRecordList = [];

for (const interval of intervals) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ export function getEsQuerySearchAfter(
// already surrounding docs -> first or last record is used
const afterTimeRecIdx = type === 'successors' && documents.length ? documents.length - 1 : 0;
const afterTimeDoc = documents[afterTimeRecIdx];
let afterTimeValue: string | number = afterTimeDoc.sort[0];
let afterTimeValue = afterTimeDoc.sort[0];
if (nanoSeconds) {
afterTimeValue = useNewFieldsApi
? (afterTimeDoc.fields[timeFieldName] as Array<string | number>)[0]
: (afterTimeDoc._source[timeFieldName] as string | number);
? afterTimeDoc.fields[timeFieldName][0]
: afterTimeDoc._source[timeFieldName];
}
return [afterTimeValue, afterTimeDoc.sort[1]];
}
Expand All @@ -42,8 +42,8 @@ export function getEsQuerySearchAfter(
searchAfter[0] = anchor.sort[0];
if (nanoSeconds) {
searchAfter[0] = useNewFieldsApi
? (anchor.fields[timeFieldName] as Array<string | number>)[0]
: (anchor._source[timeFieldName] as string | number);
? anchor.fields[timeFieldName][0]
: anchor._source[timeFieldName];
}
searchAfter[1] = anchor.sort[1];
return searchAfter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import { ActionBar } from '../../angular/context/components/action_bar/action_ba
import { ContextErrorMessage } from '../context_error_message';
import { TopNavMenuMock } from './__mocks__/top_nav_menu';
import { AppState, GetStateReturn } from '../../angular/context_state';
import { ElasticSearchHit } from '../../doc_views/doc_views_types';
import { SortDirection } from 'src/plugins/data/common';
import { EsHitRecordList } from '../../angular/context/api/context';

jest.mock('../../../kibana_services', () => {
return {
Expand Down Expand Up @@ -59,7 +59,7 @@ describe('ContextAppLegacy test', () => {
const defaultProps = {
columns: ['_source'],
filter: () => {},
hits: ([hit] as unknown) as ElasticSearchHit[],
hits: ([hit] as unknown) as EsHitRecordList,
sorting: [['order_date', 'desc']] as Array<[string, SortDirection]>,
minimumVisibleRows: 5,
indexPattern,
Expand All @@ -78,6 +78,7 @@ describe('ContextAppLegacy test', () => {
successorStatus: 'loaded',
topNavMenu: TopNavMenuMock,
useNewFieldsApi: false,
isPaginationEnabled: false,
};
const topNavProps = {
appName: 'context',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ 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 { DOC_TABLE_LEGACY } from '../../../../common';
import { DOC_HIDE_TIME_COLUMN_SETTING, DOC_TABLE_LEGACY } from '../../../../common';
import { ContextErrorMessage } from '../context_error_message';
import {
DocTableLegacy,
Expand All @@ -22,15 +22,16 @@ import { LoadingStatus } from '../../angular/context_app_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';
import { DocViewFilterFn, ElasticSearchHit } from '../../doc_views/doc_views_types';
import { DocViewFilterFn } from '../../doc_views/doc_views_types';
import { getServices, SortDirection } from '../../../kibana_services';
import { GetStateReturn, AppState } from '../../angular/context_state';
import { useDataGridColumns } from '../../helpers/use_data_grid_columns';
import { EsHitRecord, EsHitRecordList } from '../../angular/context/api/context';

export interface ContextAppProps {
topNavMenu: React.ComponentType<TopNavMenuProps>;
columns: string[];
hits: ElasticSearchHit[];
hits: EsHitRecordList;
indexPattern: IndexPattern;
appState: AppState;
stateContainer: GetStateReturn;
Expand Down Expand Up @@ -75,7 +76,7 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
minimumVisibleRows,
useNewFieldsApi,
} = renderProps;
const [expandedDoc, setExpandedDoc] = useState<ElasticSearchHit | undefined>(undefined);
const [expandedDoc, setExpandedDoc] = useState<EsHitRecord | undefined>(undefined);
const isAnchorLoaded = anchorStatus === LoadingStatus.LOADED;
const isFailed = anchorStatus === LoadingStatus.FAILED;
const allRowsLoaded =
Expand Down Expand Up @@ -128,9 +129,10 @@ export function ContextAppLegacy(renderProps: ContextAppProps) {
sampleSize: 0,
sort: sorting,
isSortEnabled: false,
showTimeCol: !config.get('doc_table:hideTimeColumn', false) && !!indexPattern.timeFieldName,
showTimeCol: !config.get(DOC_HIDE_TIME_COLUMN_SETTING, false) && !!indexPattern.timeFieldName,
services,
useNewFieldsApi,
isPaginationEnabled: false,
setExpandedDoc,
onFilter: filter,
onAddColumn,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ import { esFilters, IndexPatternField, search } from '../../../../data/public';
import { DiscoverSidebarResponsive } from './sidebar';
import { DiscoverProps } from './types';
import { SortPairArr } from '../angular/doc_table/lib/get_sort';
import { DOC_TABLE_LEGACY, SEARCH_FIELDS_FROM_SOURCE } from '../../../common';
import {
DOC_HIDE_TIME_COLUMN_SETTING,
DOC_TABLE_LEGACY,
SEARCH_FIELDS_FROM_SOURCE,
} from '../../../common';
import { popularizeField } from '../helpers/popularize_field';
import { DocViewFilterFn } from '../doc_views/doc_views_types';
import { DiscoverGrid } from './discover_grid/discover_grid';
Expand Down Expand Up @@ -429,7 +433,7 @@ export function Discover({
searchTitle={opts.savedSearch.lastSavedTitle}
setExpandedDoc={setExpandedDoc}
showTimeCol={
!config.get('doc_table:hideTimeColumn', false) &&
!config.get(DOC_HIDE_TIME_COLUMN_SETTING, false) &&
!!indexPattern.timeFieldName
}
services={services}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ export interface DiscoverGridProps {
* How the data is fetched
*/
useNewFieldsApi: boolean;
/**
* Manage pagination control
*/
isPaginationEnabled?: boolean;
}

export const EuiDataGridMemoized = React.memo((props: EuiDataGridProps) => {
Expand Down Expand Up @@ -162,8 +166,9 @@ export const DiscoverGrid = ({
settings,
showTimeCol,
sort,
isSortEnabled = true,
useNewFieldsApi,
isSortEnabled = true,
isPaginationEnabled = true,
}: DiscoverGridProps) => {
const [selectedDocs, setSelectedDocs] = useState<string[]>([]);
const [isFilterActive, setIsFilterActive] = useState(false);
Expand Down Expand Up @@ -215,14 +220,16 @@ export const DiscoverGrid = ({
const onChangePage = (pageIndex: number) =>
setPagination((paginationData) => ({ ...paginationData, pageIndex }));

return {
onChangeItemsPerPage,
onChangePage,
pageIndex: pagination.pageIndex > pageCount - 1 ? 0 : pagination.pageIndex,
pageSize: pagination.pageSize,
pageSizeOptions: pageSizeArr,
};
}, [pagination, pageCount]);
return isPaginationEnabled
? {
onChangeItemsPerPage,
onChangePage,
pageIndex: pagination.pageIndex > pageCount - 1 ? 0 : pagination.pageIndex,
pageSize: pagination.pageSize,
pageSizeOptions: pageSizeArr,
}
: undefined;
}, [pagination, pageCount, isPaginationEnabled]);

/**
* Sorting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import themeDark from '@elastic/eui/dist/eui_theme_dark.json';
import themeLight from '@elastic/eui/dist/eui_theme_light.json';
import { ElasticSearchHit } from '../../doc_views/doc_views_types';
import { DiscoverGridContext } from './discover_grid_context';
import { EsHitRecord } from '../../angular/context/api/context';

/**
* Returning a generated id of a given ES document, since `_id` can be the same
Expand All @@ -39,7 +40,7 @@ export const SelectButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueEle
const checked = useMemo(() => selectedDocs.includes(id), [selectedDocs, id]);

useEffect(() => {
if (doc.isAnchor) {
if ((doc as EsHitRecord).isAnchor) {
setCellProps({
className: 'dscDiscoverGrid__cell--highlight',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ import themeDark from '@elastic/eui/dist/eui_theme_dark.json';
import themeLight from '@elastic/eui/dist/eui_theme_light.json';
import { i18n } from '@kbn/i18n';
import { DiscoverGridContext } from './discover_grid_context';
import { EsHitRecord } from '../../angular/context/api/context';
/**
* Button to expand a given row
*/
export const ExpandButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueElementProps) => {
const { expanded, setExpanded, rows, isDarkMode } = useContext(DiscoverGridContext);
const current = rows[rowIndex];
useEffect(() => {
if (current.isAnchor) {
if ((current as EsHitRecord).isAnchor) {
setCellProps({
className: 'dscDiscoverGrid__cell--highlight',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { ElasticSearchHit } from '../../doc_views/doc_views_types';
import { DiscoverGridContext } from './discover_grid_context';
import { JsonCodeEditor } from '../json_code_editor/json_code_editor';
import { defaultMonacoEditorWidth } from './constants';
import { EsHitRecord } from '../../angular/context/api/context';

export const getRenderCellValueFn = (
indexPattern: IndexPattern,
Expand All @@ -38,7 +39,7 @@ export const getRenderCellValueFn = (
const ctx = useContext(DiscoverGridContext);

useEffect(() => {
if (row?.isAnchor) {
if ((row as EsHitRecord).isAnchor) {
setCellProps({
className: 'dscDiscoverGrid__cell--highlight',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ export interface AngularDirective {

export type AngularScope = IScope;

export type ElasticSearchHit<T = unknown> = estypes.SearchResponse<T>['hits']['hits'][number] & {
isAnchor?: boolean;
};
export type ElasticSearchHit<T = unknown> = estypes.SearchResponse<T>['hits']['hits'][number];

export interface FieldMapping {
filterable?: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import { getServices, IndexPattern, ISearchSource } from '../../kibana_services'
import { SEARCH_EMBEDDABLE_TYPE } from './constants';
import { SavedSearch } from '../..';
import {
DOC_HIDE_TIME_COLUMN_SETTING,
SAMPLE_SIZE_SETTING,
SEARCH_FIELDS_FROM_SOURCE,
SORT_DEFAULT_ORDER_SETTING,
Expand Down Expand Up @@ -256,7 +257,7 @@ export class SearchEmbeddable
if (this.savedSearch.grid) {
searchScope.settings = this.savedSearch.grid;
}
searchScope.showTimeCol = !this.services.uiSettings.get('doc_table:hideTimeColumn', false);
searchScope.showTimeCol = !this.services.uiSettings.get(DOC_HIDE_TIME_COLUMN_SETTING, false);

searchScope.filter = async (field, value, operator) => {
let filters = esFilters.generateFilters(
Expand Down

0 comments on commit 6388555

Please sign in to comment.