mirror of
https://github.com/datahub-project/datahub.git
synced 2025-11-08 15:30:55 +00:00
fix(ui/v2): Remove code around usage and storage features (#13049)
This commit is contained in:
parent
3fd0e37111
commit
c971cdaebc
@ -85,19 +85,6 @@ export const getChartPopularityTier = (viewCountPercentileLast30Days, uniqueUser
|
|||||||
return PopularityTier.TIER_4;
|
return PopularityTier.TIER_4;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getQueryPopularityTier = (runsPercentileLast30days: number) => {
|
|
||||||
if (runsPercentileLast30days > 80) {
|
|
||||||
return PopularityTier.TIER_1;
|
|
||||||
}
|
|
||||||
if (runsPercentileLast30days > 30) {
|
|
||||||
return PopularityTier.TIER_2;
|
|
||||||
}
|
|
||||||
if (runsPercentileLast30days > 0) {
|
|
||||||
return PopularityTier.TIER_3;
|
|
||||||
}
|
|
||||||
return PopularityTier.TIER_4;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the user "exists", e.g. there exists some information about
|
* Returns true if the user "exists", e.g. there exists some information about
|
||||||
* the user in DataHub already.
|
* the user in DataHub already.
|
||||||
|
|||||||
@ -141,9 +141,7 @@ export default function QueriesListSection({
|
|||||||
createdDateColumn,
|
createdDateColumn,
|
||||||
powersColumn,
|
powersColumn,
|
||||||
usedByColumn,
|
usedByColumn,
|
||||||
popularityColumn,
|
|
||||||
columnsColumn,
|
columnsColumn,
|
||||||
lastRunColumn,
|
|
||||||
editColumn,
|
editColumn,
|
||||||
} = useQueryTableColumns({
|
} = useQueryTableColumns({
|
||||||
queries,
|
queries,
|
||||||
@ -166,11 +164,11 @@ export default function QueriesListSection({
|
|||||||
editColumn,
|
editColumn,
|
||||||
];
|
];
|
||||||
|
|
||||||
const popularQueriesColumns = [queryTextColumn(), usedByColumn, lastRunColumn, columnsColumn, popularityColumn];
|
const popularQueriesColumns = [queryTextColumn(), usedByColumn, columnsColumn];
|
||||||
|
|
||||||
const downstreamQueriesColumns = [queryTextColumn(550), powersColumn, lastRunColumn];
|
const downstreamQueriesColumns = [queryTextColumn(550), powersColumn];
|
||||||
|
|
||||||
const recentQueriesColumns = [queryTextColumn(550), lastRunColumn];
|
const recentQueriesColumns = [queryTextColumn(550)];
|
||||||
|
|
||||||
const pagionationOptions: false | TablePaginationConfig = showPagination
|
const pagionationOptions: false | TablePaginationConfig = showPagination
|
||||||
? ({
|
? ({
|
||||||
|
|||||||
@ -54,17 +54,8 @@ export default function QueriesTab() {
|
|||||||
/**
|
/**
|
||||||
* Fetch the List of Popular Queries
|
* Fetch the List of Popular Queries
|
||||||
*/
|
*/
|
||||||
const {
|
const { selectedUsersFilter, setSelectedUsersFilter, selectedColumnsFilter, setSelectedColumnsFilter } =
|
||||||
popularQueries,
|
usePopularQueries({ entityUrn, siblingUrn, filterText });
|
||||||
loading: popularQueriesLoading,
|
|
||||||
pagination: popularQueriesPagination,
|
|
||||||
total,
|
|
||||||
sorting: popularSorting,
|
|
||||||
selectedUsersFilter,
|
|
||||||
setSelectedUsersFilter,
|
|
||||||
selectedColumnsFilter,
|
|
||||||
setSelectedColumnsFilter,
|
|
||||||
} = usePopularQueries({ entityUrn, siblingUrn, filterText });
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch the List of Downstream Queries
|
* Fetch the List of Downstream Queries
|
||||||
@ -90,18 +81,9 @@ export default function QueriesTab() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// can add something about initalLoading if there was never data, or have state that is like finishedInitialLoad = false, with useEffect
|
// can add something about initalLoading if there was never data, or have state that is like finishedInitialLoad = false, with useEffect
|
||||||
const isLoading =
|
const isLoading = !entityUrn || highlightedQueriesLoading || downstreamQueriesLoading || recentQueriesLoading;
|
||||||
!entityUrn ||
|
|
||||||
highlightedQueriesLoading ||
|
|
||||||
popularQueriesLoading ||
|
|
||||||
downstreamQueriesLoading ||
|
|
||||||
recentQueriesLoading;
|
|
||||||
const showEmptyView =
|
const showEmptyView =
|
||||||
!isLoading &&
|
!isLoading && !recentQueries.length && !highlightedQueries.length && !downstreamQueries.length;
|
||||||
!recentQueries.length &&
|
|
||||||
!highlightedQueries.length &&
|
|
||||||
!downstreamQueries.length &&
|
|
||||||
!popularQueries.length;
|
|
||||||
|
|
||||||
// shared props with all of the QueriesListSection components below
|
// shared props with all of the QueriesListSection components below
|
||||||
const props = {
|
const props = {
|
||||||
@ -159,19 +141,6 @@ export default function QueriesTab() {
|
|||||||
onButtonClick={() => setShowQueryBuilder(true)}
|
onButtonClick={() => setShowQueryBuilder(true)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{(popularQueries.length > 0 || popularQueriesLoading) && (
|
|
||||||
<QueriesListSection
|
|
||||||
title="Popular Queries"
|
|
||||||
section={QueriesTabSection.Popular}
|
|
||||||
tooltip="The most popular queries that were run against this dataset"
|
|
||||||
queries={popularQueries}
|
|
||||||
loading={popularQueriesLoading}
|
|
||||||
totalQueries={total}
|
|
||||||
pagination={popularQueriesPagination}
|
|
||||||
sorting={popularSorting}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{downstreamQueries.length > 0 && (
|
{downstreamQueries.length > 0 && (
|
||||||
<QueriesListSection
|
<QueriesListSection
|
||||||
title="Downstream Queries"
|
title="Downstream Queries"
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import SearchFilter from '../../../../../../searchV2/filters/SearchFilter';
|
|||||||
import SelectedSearchFilters from '../../../../../../searchV2/filters/SelectedSearchFilters';
|
import SelectedSearchFilters from '../../../../../../searchV2/filters/SelectedSearchFilters';
|
||||||
import { UnionType } from '../../../../../../searchV2/utils/constants';
|
import { UnionType } from '../../../../../../searchV2/utils/constants';
|
||||||
import { ANTD_GRAY_V2, REDESIGN_COLORS } from '../../../../constants';
|
import { ANTD_GRAY_V2, REDESIGN_COLORS } from '../../../../constants';
|
||||||
import useUsersFilter from './useUsersFilter';
|
|
||||||
import useColumnsFilter from './useColumnsFilter';
|
import useColumnsFilter from './useColumnsFilter';
|
||||||
|
|
||||||
const ColumnsFilterWrapper = styled.div`
|
const ColumnsFilterWrapper = styled.div`
|
||||||
@ -33,18 +32,11 @@ interface Props {
|
|||||||
export default function QueryFilters({
|
export default function QueryFilters({
|
||||||
selectedColumnsFilter,
|
selectedColumnsFilter,
|
||||||
setSelectedColumnsFilter,
|
setSelectedColumnsFilter,
|
||||||
setSelectedUsersFilter,
|
setSelectedUsersFilter, // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||||
selectedUsersFilter,
|
selectedUsersFilter,
|
||||||
setPage,
|
setPage,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const onChangeFilters = (newFilters: FacetFilterInput[]) => {
|
const onChangeFilters = (newFilters: FacetFilterInput[]) => {
|
||||||
const usedByFilter = newFilters.find((f) => f.field === 'topUsersLast30DaysFeature');
|
|
||||||
if (usedByFilter) {
|
|
||||||
setSelectedUsersFilter(usedByFilter);
|
|
||||||
} else {
|
|
||||||
setSelectedUsersFilter({ field: 'topUsersLast30DaysFeature', values: [] });
|
|
||||||
}
|
|
||||||
|
|
||||||
const columnsFilter = newFilters.find((f) => f.field === 'entities');
|
const columnsFilter = newFilters.find((f) => f.field === 'entities');
|
||||||
if (columnsFilter) {
|
if (columnsFilter) {
|
||||||
setSelectedColumnsFilter(columnsFilter);
|
setSelectedColumnsFilter(columnsFilter);
|
||||||
@ -55,15 +47,13 @@ export default function QueryFilters({
|
|||||||
setPage(1);
|
setPage(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
const usersFilter = useUsersFilter({ selectedColumnsFilter, selectedUsersFilter });
|
|
||||||
const columnsFilter = useColumnsFilter({ selectedColumnsFilter, selectedUsersFilter, setSelectedColumnsFilter });
|
const columnsFilter = useColumnsFilter({ selectedColumnsFilter, selectedUsersFilter, setSelectedColumnsFilter });
|
||||||
|
|
||||||
const filterPredicates: FilterPredicate[] = convertToAvailableFilterPredictes(
|
const filterPredicates: FilterPredicate[] = convertToAvailableFilterPredictes(
|
||||||
[selectedUsersFilter, selectedColumnsFilter],
|
[selectedUsersFilter, selectedColumnsFilter],
|
||||||
[usersFilter, columnsFilter],
|
[columnsFilter],
|
||||||
);
|
);
|
||||||
let selectedFilters: FacetFilterInput[] = selectedColumnsFilter.values?.length ? [selectedColumnsFilter] : [];
|
const selectedFilters: FacetFilterInput[] = selectedColumnsFilter.values?.length ? [selectedColumnsFilter] : [];
|
||||||
selectedFilters = selectedUsersFilter.values?.length ? [...selectedFilters, selectedUsersFilter] : selectedFilters;
|
|
||||||
|
|
||||||
const labelStyle = {
|
const labelStyle = {
|
||||||
backgroundColor: ANTD_GRAY_V2[15],
|
backgroundColor: ANTD_GRAY_V2[15],
|
||||||
@ -77,21 +67,13 @@ export default function QueryFilters({
|
|||||||
filter={columnsFilter}
|
filter={columnsFilter}
|
||||||
filterPredicates={filterPredicates}
|
filterPredicates={filterPredicates}
|
||||||
onChangeFilters={onChangeFilters}
|
onChangeFilters={onChangeFilters}
|
||||||
activeFilters={[selectedColumnsFilter, selectedUsersFilter]}
|
activeFilters={[selectedColumnsFilter]}
|
||||||
labelStyle={selectedColumnsFilter.values?.length ? undefined : labelStyle}
|
labelStyle={selectedColumnsFilter.values?.length ? undefined : labelStyle}
|
||||||
shouldUseAggregationsFromFilter
|
shouldUseAggregationsFromFilter
|
||||||
/>
|
/>
|
||||||
<SearchFilter
|
|
||||||
filter={usersFilter}
|
|
||||||
filterPredicates={filterPredicates}
|
|
||||||
onChangeFilters={onChangeFilters}
|
|
||||||
activeFilters={[selectedUsersFilter, selectedColumnsFilter]}
|
|
||||||
labelStyle={selectedUsersFilter.values?.length ? undefined : labelStyle}
|
|
||||||
shouldUseAggregationsFromFilter
|
|
||||||
/>
|
|
||||||
</FiltersWrapper>
|
</FiltersWrapper>
|
||||||
<SelectedSearchFilters
|
<SelectedSearchFilters
|
||||||
availableFilters={[columnsFilter, usersFilter]}
|
availableFilters={[columnsFilter]}
|
||||||
selectedFilters={selectedFilters}
|
selectedFilters={selectedFilters}
|
||||||
unionType={UnionType.AND}
|
unionType={UnionType.AND}
|
||||||
onChangeFilters={onChangeFilters}
|
onChangeFilters={onChangeFilters}
|
||||||
|
|||||||
@ -1,56 +0,0 @@
|
|||||||
import { useEntityRegistryV2 } from '../../../../../../useEntityRegistry';
|
|
||||||
import { useEntityData } from '../../../../../../entity/shared/EntityContext';
|
|
||||||
import { EntityType, FacetFilterInput, QuerySource } from '../../../../../../../types.generated';
|
|
||||||
import { useAggregateAcrossEntitiesQuery } from '../../../../../../../graphql/search.generated';
|
|
||||||
import { getAndFilters } from '../utils/filterQueries';
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
selectedColumnsFilter: FacetFilterInput;
|
|
||||||
selectedUsersFilter: FacetFilterInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function useUsersFilter({ selectedColumnsFilter, selectedUsersFilter }: Props) {
|
|
||||||
const entityRegistry = useEntityRegistryV2();
|
|
||||||
const { entityData } = useEntityData();
|
|
||||||
const entityUrn = entityData?.urn;
|
|
||||||
const siblingUrn = entityData?.siblingsSearch?.searchResults?.[0]?.entity?.urn;
|
|
||||||
|
|
||||||
const values = siblingUrn ? [entityUrn as string, siblingUrn] : [entityUrn as string];
|
|
||||||
const entityFilter = { field: 'entities', values };
|
|
||||||
const sourceFilter = { field: 'source', values: [QuerySource.System] };
|
|
||||||
const andFilters = getAndFilters(selectedColumnsFilter, { ...selectedUsersFilter, values: [] }, [
|
|
||||||
entityFilter,
|
|
||||||
sourceFilter,
|
|
||||||
]);
|
|
||||||
const { data } = useAggregateAcrossEntitiesQuery({
|
|
||||||
variables: {
|
|
||||||
input: {
|
|
||||||
facets: ['topUsersLast30DaysFeature'],
|
|
||||||
query: '*',
|
|
||||||
types: [EntityType.Query],
|
|
||||||
orFilters: [{ and: andFilters }],
|
|
||||||
searchFlags: {
|
|
||||||
maxAggValues: 100,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
skip: !entityUrn,
|
|
||||||
});
|
|
||||||
|
|
||||||
const aggregations = data?.aggregateAcrossEntities?.facets?.find(
|
|
||||||
(facet) => facet.field === 'topUsersLast30DaysFeature',
|
|
||||||
)?.aggregations;
|
|
||||||
|
|
||||||
const userAggregations =
|
|
||||||
aggregations
|
|
||||||
?.map((agg) => ({
|
|
||||||
value: agg.entity?.urn || agg.value,
|
|
||||||
displayName: agg.entity?.urn ? entityRegistry.getDisplayName(agg.entity.type, agg.entity) : agg.value,
|
|
||||||
count: agg.count,
|
|
||||||
}))
|
|
||||||
?.sort((aggA, aggB) => aggB.count - aggA.count) || [];
|
|
||||||
|
|
||||||
const usersFilter = { aggregations: userAggregations, displayName: 'Users', field: 'topUsersLast30DaysFeature' };
|
|
||||||
|
|
||||||
return usersFilter;
|
|
||||||
}
|
|
||||||
@ -1,7 +1,6 @@
|
|||||||
import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined';
|
import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined';
|
||||||
import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
|
import EditOutlinedIcon from '@mui/icons-material/EditOutlined';
|
||||||
import { Modal, Typography, message } from 'antd';
|
import { Modal, Typography, message } from 'antd';
|
||||||
import { Popover } from '@components';
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import MarkdownViewer from '@src/app/entity/shared/components/legacy/MarkdownViewer';
|
import MarkdownViewer from '@src/app/entity/shared/components/legacy/MarkdownViewer';
|
||||||
@ -10,11 +9,6 @@ import { CorpUser, EntityType } from '../../../../../../types.generated';
|
|||||||
import { useEntityRegistryV2 } from '../../../../../useEntityRegistry';
|
import { useEntityRegistryV2 } from '../../../../../useEntityRegistry';
|
||||||
import ActorAvatar from '../../../ActorAvatar';
|
import ActorAvatar from '../../../ActorAvatar';
|
||||||
import { ActionButton } from '../../../containers/profile/sidebar/SectionActionButton';
|
import { ActionButton } from '../../../containers/profile/sidebar/SectionActionButton';
|
||||||
import {
|
|
||||||
getBarsStatusFromPopularityTier,
|
|
||||||
getQueryPopularityTier,
|
|
||||||
} from '../../../containers/profile/sidebar/shared/utils';
|
|
||||||
import { PopularityBars } from '../Schema/components/SchemaFieldDrawer/PopularityBars';
|
|
||||||
import QueryBuilderModal from './QueryBuilderModal';
|
import QueryBuilderModal from './QueryBuilderModal';
|
||||||
import { Query } from './types';
|
import { Query } from './types';
|
||||||
|
|
||||||
@ -182,37 +176,10 @@ export const EditDeleteColumn = ({ query, hoveredQueryUrn, onEdited, onDeleted }
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
interface ColumnProps {
|
||||||
* Popularity Column
|
|
||||||
*/
|
|
||||||
|
|
||||||
const PopularityWrapper = styled.div`
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
`;
|
|
||||||
|
|
||||||
interface PopularityColumnProps {
|
|
||||||
query: Query;
|
query: Query;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PopularityColumn = ({ query }: PopularityColumnProps) => {
|
|
||||||
const { runsPercentileLast30days } = query;
|
|
||||||
if (!runsPercentileLast30days) return null;
|
|
||||||
const tier = getQueryPopularityTier(runsPercentileLast30days);
|
|
||||||
const status = getBarsStatusFromPopularityTier(tier);
|
|
||||||
return (
|
|
||||||
<Popover
|
|
||||||
content={
|
|
||||||
<>This query has been run more than {runsPercentileLast30days}% of other queries in the last 30 days.</>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<PopularityWrapper>
|
|
||||||
<PopularityBars status={status} />
|
|
||||||
</PopularityWrapper>
|
|
||||||
</Popover>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const ColumnsWrapper = styled.div`
|
const ColumnsWrapper = styled.div`
|
||||||
text-align: right;
|
text-align: right;
|
||||||
`;
|
`;
|
||||||
@ -220,6 +187,6 @@ const ColumnsWrapper = styled.div`
|
|||||||
/*
|
/*
|
||||||
* Columns Column
|
* Columns Column
|
||||||
*/
|
*/
|
||||||
export const ColumnsColumn = ({ query }: PopularityColumnProps) => {
|
export const ColumnsColumn = ({ query }: ColumnProps) => {
|
||||||
return <ColumnsWrapper>{query.columns?.length ?? 0}</ColumnsWrapper>;
|
return <ColumnsWrapper>{query.columns?.length ?? 0}</ColumnsWrapper>;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,7 +17,6 @@ export type Query = {
|
|||||||
createdBy?: CorpUser | null;
|
createdBy?: CorpUser | null;
|
||||||
poweredEntity?: Entity;
|
poweredEntity?: Entity;
|
||||||
usedBy?: CorpUser[];
|
usedBy?: CorpUser[];
|
||||||
runsPercentileLast30days?: number | null;
|
|
||||||
columns?: SchemaFieldEntity[];
|
columns?: SchemaFieldEntity[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useListQueriesQuery } from '../../../../../../graphql/query.generated';
|
import { useListQueriesQuery } from '../../../../../../graphql/query.generated';
|
||||||
import { FacetFilterInput, QueryEntity, QuerySource, SortOrder } from '../../../../../../types.generated';
|
import { FacetFilterInput, QueryEntity, QuerySource } from '../../../../../../types.generated';
|
||||||
import { filterQueries, getAndFilters, getQueryEntitiesFilter } from './utils/filterQueries';
|
import { filterQueries, getAndFilters, getQueryEntitiesFilter } from './utils/filterQueries';
|
||||||
import usePagination from '../../../../../sharedV2/pagination/usePagination';
|
import usePagination from '../../../../../sharedV2/pagination/usePagination';
|
||||||
import { DEFAULT_PAGE_SIZE } from './utils/constants';
|
import { DEFAULT_PAGE_SIZE } from './utils/constants';
|
||||||
@ -13,16 +13,9 @@ interface Props {
|
|||||||
siblingUrn?: string;
|
siblingUrn?: string;
|
||||||
filterText: string;
|
filterText: string;
|
||||||
defaultSelectedColumns?: string[];
|
defaultSelectedColumns?: string[];
|
||||||
defaultSelectedUsers?: string[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const usePopularQueries = ({
|
export const usePopularQueries = ({ entityUrn, siblingUrn, filterText, defaultSelectedColumns }: Props) => {
|
||||||
entityUrn,
|
|
||||||
siblingUrn,
|
|
||||||
filterText,
|
|
||||||
defaultSelectedColumns,
|
|
||||||
defaultSelectedUsers,
|
|
||||||
}: Props) => {
|
|
||||||
const columnFromQueryParam = useQueryParamValue('column') as string | null;
|
const columnFromQueryParam = useQueryParamValue('column') as string | null;
|
||||||
const siblingColumnFromQueryParam = useQueryParamValue('siblingColumn') as string | null;
|
const siblingColumnFromQueryParam = useQueryParamValue('siblingColumn') as string | null;
|
||||||
let columnsFromQueryParams = columnFromQueryParam ? [decodeURI(columnFromQueryParam)] : [];
|
let columnsFromQueryParams = columnFromQueryParam ? [decodeURI(columnFromQueryParam)] : [];
|
||||||
@ -34,7 +27,7 @@ export const usePopularQueries = ({
|
|||||||
values: [...(columnsFromQueryParams.length ? columnsFromQueryParams : defaultSelectedColumns || [])],
|
values: [...(columnsFromQueryParams.length ? columnsFromQueryParams : defaultSelectedColumns || [])],
|
||||||
};
|
};
|
||||||
const [selectedColumnsFilter, setSelectedColumnsFilter] = useState<FacetFilterInput>(defaultColumnsFilter);
|
const [selectedColumnsFilter, setSelectedColumnsFilter] = useState<FacetFilterInput>(defaultColumnsFilter);
|
||||||
const defaultUsersFilter = { field: 'topUsersLast30DaysFeature', values: [...(defaultSelectedUsers || [])] };
|
const defaultUsersFilter = { field: '', values: [] }; // Not supported
|
||||||
const [selectedUsersFilter, setSelectedUsersFilter] = useState<FacetFilterInput>(defaultUsersFilter);
|
const [selectedUsersFilter, setSelectedUsersFilter] = useState<FacetFilterInput>(defaultUsersFilter);
|
||||||
|
|
||||||
const pagination = usePagination(DEFAULT_PAGE_SIZE);
|
const pagination = usePagination(DEFAULT_PAGE_SIZE);
|
||||||
@ -50,11 +43,7 @@ export const usePopularQueries = ({
|
|||||||
start,
|
start,
|
||||||
count,
|
count,
|
||||||
source: QuerySource.System,
|
source: QuerySource.System,
|
||||||
sortInput:
|
sortInput: sortField && sortOrder ? { sortCriterion: { field: sortField, sortOrder } } : null,
|
||||||
sortField && sortOrder
|
|
||||||
? { sortCriterion: { field: sortField, sortOrder } }
|
|
||||||
: { sortCriterion: { field: 'runsPercentileLast30days', sortOrder: SortOrder.Descending } },
|
|
||||||
|
|
||||||
orFilters: [{ and: andFilters }],
|
orFilters: [{ and: andFilters }],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,16 +1,14 @@
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { Tooltip } from '@components';
|
|
||||||
import { Query } from './types';
|
import { Query } from './types';
|
||||||
import QueryComponent from './Query';
|
import QueryComponent from './Query';
|
||||||
import { EditDeleteColumn, QueryCreatedBy, QueryDescription, PopularityColumn, ColumnsColumn } from './queryColumns';
|
import { EditDeleteColumn, QueryCreatedBy, QueryDescription, ColumnsColumn } from './queryColumns';
|
||||||
import { CorpUser, Entity } from '../../../../../../types.generated';
|
import { CorpUser, Entity } from '../../../../../../types.generated';
|
||||||
import { EntityLink } from '../../../../../homeV2/reference/sections/EntityLink';
|
import { EntityLink } from '../../../../../homeV2/reference/sections/EntityLink';
|
||||||
import { useEntityRegistryV2 } from '../../../../../useEntityRegistry';
|
import { useEntityRegistryV2 } from '../../../../../useEntityRegistry';
|
||||||
import { Sorting } from '../../../../../sharedV2/sorting/useSorting';
|
import { Sorting } from '../../../../../sharedV2/sorting/useSorting';
|
||||||
import TopUsersFacepile from '../../../containers/profile/sidebar/shared/TopUsersFacepile';
|
import TopUsersFacepile from '../../../containers/profile/sidebar/shared/TopUsersFacepile';
|
||||||
import { toRelativeTimeString } from '../../../../../shared/time/timeUtils';
|
|
||||||
|
|
||||||
const UsersWrapper = styled.div`
|
const UsersWrapper = styled.div`
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -145,7 +143,7 @@ export default function useQueryTableColumns({
|
|||||||
key: 'usedBy',
|
key: 'usedBy',
|
||||||
className: 'usedBy',
|
className: 'usedBy',
|
||||||
sorter: shouldRelyOnBackendSorting
|
sorter: shouldRelyOnBackendSorting
|
||||||
? false // we don't support sorting by topUsersLast30DaysFeature on backend since it is a text field
|
? false
|
||||||
: (queryA, queryB) => {
|
: (queryA, queryB) => {
|
||||||
if (!queryA.usedBy || !queryA.usedBy[0] || !queryB.usedBy || !queryB.usedBy[0]) return 0;
|
if (!queryA.usedBy || !queryA.usedBy[0] || !queryB.usedBy || !queryB.usedBy[0]) return 0;
|
||||||
const usedByA = entityRegistry.getDisplayName(queryA.usedBy[0].type, queryA.usedBy[0]);
|
const usedByA = entityRegistry.getDisplayName(queryA.usedBy[0].type, queryA.usedBy[0]);
|
||||||
@ -161,17 +159,6 @@ export default function useQueryTableColumns({
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const popularityColumn = {
|
|
||||||
title: 'Popularity',
|
|
||||||
key: 'popularity',
|
|
||||||
field: 'runsPercentileLast30days',
|
|
||||||
width: 110,
|
|
||||||
sorter: shouldRelyOnBackendSorting
|
|
||||||
? true
|
|
||||||
: (queryA, queryB) => queryA.runsPercentileLast30days - queryB.runsPercentileLast30days,
|
|
||||||
render: (query: Query) => <PopularityColumn query={query} />,
|
|
||||||
};
|
|
||||||
|
|
||||||
const columnsColumn = {
|
const columnsColumn = {
|
||||||
title: 'Columns',
|
title: 'Columns',
|
||||||
key: 'columns',
|
key: 'columns',
|
||||||
@ -179,25 +166,6 @@ export default function useQueryTableColumns({
|
|||||||
render: (query: Query) => <ColumnsColumn query={query} />,
|
render: (query: Query) => <ColumnsColumn query={query} />,
|
||||||
};
|
};
|
||||||
|
|
||||||
const lastRunColumn = {
|
|
||||||
title: 'Last Run',
|
|
||||||
dataIndex: 'lastRun',
|
|
||||||
key: 'lastRun',
|
|
||||||
field: 'lastExecutedAtFeature',
|
|
||||||
className: 'lastRun',
|
|
||||||
sorter: shouldRelyOnBackendSorting ? true : (queryA, queryB) => queryA.lastRun - queryB.lastRun,
|
|
||||||
render: (lastRun: string) => {
|
|
||||||
if (!lastRun) return null;
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Tooltip title={moment(lastRun).format('MM/DD/YYYY')}>
|
|
||||||
{toRelativeTimeString(new Date(lastRun).getTime())}
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const editColumn = {
|
const editColumn = {
|
||||||
title: '',
|
title: '',
|
||||||
key: 'edit',
|
key: 'edit',
|
||||||
@ -220,9 +188,7 @@ export default function useQueryTableColumns({
|
|||||||
createdDateColumn,
|
createdDateColumn,
|
||||||
powersColumn,
|
powersColumn,
|
||||||
usedByColumn,
|
usedByColumn,
|
||||||
popularityColumn,
|
|
||||||
columnsColumn,
|
columnsColumn,
|
||||||
lastRunColumn,
|
|
||||||
editColumn,
|
editColumn,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import NoStatsAvailble from '../../../../../../../../images/no-stats-available.s
|
|||||||
import { useBaseEntity, useRouteToTab } from '../../../../../../../entity/shared/EntityContext';
|
import { useBaseEntity, useRouteToTab } from '../../../../../../../entity/shared/EntityContext';
|
||||||
import { ANTD_GRAY } from '../../../../../constants';
|
import { ANTD_GRAY } from '../../../../../constants';
|
||||||
import Query from '../../../Queries/Query';
|
import Query from '../../../Queries/Query';
|
||||||
import { PopularityColumn, QueryCreatedBy } from '../../../Queries/queryColumns';
|
import { QueryCreatedBy } from '../../../Queries/queryColumns';
|
||||||
import { usePopularQueries } from '../../../Queries/usePopularQueries';
|
import { usePopularQueries } from '../../../Queries/usePopularQueries';
|
||||||
import { GetDatasetQuery } from '../../../../../../../../graphql/dataset.generated';
|
import { GetDatasetQuery } from '../../../../../../../../graphql/dataset.generated';
|
||||||
import Loading from '../../../../../../../shared/Loading';
|
import Loading from '../../../../../../../shared/Loading';
|
||||||
@ -57,15 +57,6 @@ const SubtitleSection = styled.div`
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const PopularityLabel = styled.span`
|
|
||||||
line-height: 26px;
|
|
||||||
margin-right: 8px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const PopularityColumnContainer = styled.div`
|
|
||||||
margin-bottom: 5px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const QUERIES_TO_SHOW = 6;
|
const QUERIES_TO_SHOW = 6;
|
||||||
|
|
||||||
const SeeAllButton = styled(Button)`
|
const SeeAllButton = styled(Button)`
|
||||||
@ -173,12 +164,6 @@ export default function SchemaFieldQueriesSidebarTab({ properties: { fieldPath }
|
|||||||
)}
|
)}
|
||||||
on {moment(query.lastRun).format('MM/DD/YYYY')}
|
on {moment(query.lastRun).format('MM/DD/YYYY')}
|
||||||
</SubtitleSection>
|
</SubtitleSection>
|
||||||
<SubtitleSection>
|
|
||||||
<PopularityLabel>Popularity</PopularityLabel>
|
|
||||||
<PopularityColumnContainer>
|
|
||||||
<PopularityColumn query={query} />
|
|
||||||
</PopularityColumnContainer>
|
|
||||||
</SubtitleSection>
|
|
||||||
</QuerySubtitleContainer>
|
</QuerySubtitleContainer>
|
||||||
</StyledQueryCard>
|
</StyledQueryCard>
|
||||||
</StyledQueryContainer>
|
</StyledQueryContainer>
|
||||||
|
|||||||
@ -11,11 +11,7 @@ import { HorizontalListSkeletons } from '../../../../HorizontalListSkeletons';
|
|||||||
import { Section } from '../Section';
|
import { Section } from '../Section';
|
||||||
import { INSIGHT_CARD_MIN_WIDTH } from './cards/SearchListInsightCard';
|
import { INSIGHT_CARD_MIN_WIDTH } from './cards/SearchListInsightCard';
|
||||||
import { InsightStatusProvider } from './InsightStatusProvider';
|
import { InsightStatusProvider } from './InsightStatusProvider';
|
||||||
import { MOST_FREQUENTLY_UPDATED_ID, MostFrequentlyUpdated } from './cards/MostFrequentlyUpdated';
|
|
||||||
import { MOST_QUERIED_ID, MostQueriedCard } from './cards/MostQueriedCard';
|
|
||||||
import { MOST_ROWS_ID, MostRowsCard } from './cards/MostRowsCard';
|
import { MOST_ROWS_ID, MostRowsCard } from './cards/MostRowsCard';
|
||||||
import { MOST_USERS_ID, MostUsersCard } from './cards/MostUsersCard';
|
|
||||||
import { MOST_VIEWED_DASHBOARDS_ID, MostViewedDashboardsCard } from './cards/MostViewedDashboards';
|
|
||||||
import { POPULAR_GLOSSARY_TERMS_ID, PopularGlossaryTerms } from './cards/PopularGlossaryTerms';
|
import { POPULAR_GLOSSARY_TERMS_ID, PopularGlossaryTerms } from './cards/PopularGlossaryTerms';
|
||||||
import { RECENTLY_CREATED_DATASETS_ID, RecentlyCreatedDatasetsCard } from './cards/RecentlyCreatedDatasetsCard';
|
import { RECENTLY_CREATED_DATASETS_ID, RecentlyCreatedDatasetsCard } from './cards/RecentlyCreatedDatasetsCard';
|
||||||
import { RECENTLY_UPDATED_ID, RecentlyUpdatedDatasetsCard } from './cards/RecentlyUpdatedDatasetsCard';
|
import { RECENTLY_UPDATED_ID, RecentlyUpdatedDatasetsCard } from './cards/RecentlyUpdatedDatasetsCard';
|
||||||
@ -30,27 +26,6 @@ type InsightSection = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const ALL_INSIGHTS: InsightSection[] = [
|
const ALL_INSIGHTS: InsightSection[] = [
|
||||||
{
|
|
||||||
id: MOST_USERS_ID,
|
|
||||||
component: MostUsersCard,
|
|
||||||
personas: [
|
|
||||||
PersonaType.TECHNICAL_USER,
|
|
||||||
PersonaType.DATA_ENGINEER,
|
|
||||||
PersonaType.DATA_STEWARD,
|
|
||||||
PersonaType.DATA_LEADER,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: MOST_VIEWED_DASHBOARDS_ID,
|
|
||||||
component: MostViewedDashboardsCard,
|
|
||||||
personas: [
|
|
||||||
PersonaType.BUSINESS_USER,
|
|
||||||
PersonaType.DATA_STEWARD,
|
|
||||||
PersonaType.DATA_LEADER,
|
|
||||||
PersonaType.TECHNICAL_USER,
|
|
||||||
PersonaType.DATA_ENGINEER,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: POPULAR_GLOSSARY_TERMS_ID,
|
id: POPULAR_GLOSSARY_TERMS_ID,
|
||||||
component: PopularGlossaryTerms,
|
component: PopularGlossaryTerms,
|
||||||
@ -62,27 +37,6 @@ const ALL_INSIGHTS: InsightSection[] = [
|
|||||||
PersonaType.BUSINESS_USER,
|
PersonaType.BUSINESS_USER,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: MOST_QUERIED_ID,
|
|
||||||
component: MostQueriedCard,
|
|
||||||
personas: [
|
|
||||||
PersonaType.BUSINESS_USER,
|
|
||||||
PersonaType.TECHNICAL_USER,
|
|
||||||
PersonaType.DATA_ENGINEER,
|
|
||||||
PersonaType.DATA_STEWARD,
|
|
||||||
PersonaType.DATA_LEADER,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: MOST_FREQUENTLY_UPDATED_ID,
|
|
||||||
component: MostFrequentlyUpdated,
|
|
||||||
personas: [
|
|
||||||
PersonaType.TECHNICAL_USER,
|
|
||||||
PersonaType.DATA_ENGINEER,
|
|
||||||
PersonaType.DATA_STEWARD,
|
|
||||||
PersonaType.DATA_LEADER,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: RECENTLY_UPDATED_ID,
|
id: RECENTLY_UPDATED_ID,
|
||||||
component: RecentlyUpdatedDatasetsCard,
|
component: RecentlyUpdatedDatasetsCard,
|
||||||
|
|||||||
@ -1,19 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { buildMostUpdatedFilters, buildMostUpdatedSort } from './useGetMostUpdated';
|
|
||||||
import { SearchListInsightCard } from './SearchListInsightCard';
|
|
||||||
import { EntityType } from '../../../../../../../../types.generated';
|
|
||||||
|
|
||||||
export const MOST_FREQUENTLY_UPDATED_ID = 'MostFrequentlyUpdated';
|
|
||||||
|
|
||||||
export const MostFrequentlyUpdated = () => {
|
|
||||||
return (
|
|
||||||
<SearchListInsightCard
|
|
||||||
id={MOST_FREQUENTLY_UPDATED_ID}
|
|
||||||
tip="Tables with the most changes in the past month"
|
|
||||||
title="Most Updated"
|
|
||||||
types={[EntityType.Dataset]}
|
|
||||||
filters={buildMostUpdatedFilters()}
|
|
||||||
sort={buildMostUpdatedSort()}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { buildMostQueriedFilters, buildMostQueriedSort } from './useGetMostQueried';
|
|
||||||
import { SearchListInsightCard } from './SearchListInsightCard';
|
|
||||||
import { EntityType } from '../../../../../../../../types.generated';
|
|
||||||
|
|
||||||
export const MOST_QUERIED_ID = 'MostQueried';
|
|
||||||
|
|
||||||
export const MostQueriedCard = () => {
|
|
||||||
return (
|
|
||||||
<SearchListInsightCard
|
|
||||||
id={MOST_QUERIED_ID}
|
|
||||||
tip="Tables with the most queries in the past month"
|
|
||||||
title="Most Queried"
|
|
||||||
types={[EntityType.Dataset]}
|
|
||||||
filters={buildMostQueriedFilters()}
|
|
||||||
sort={buildMostQueriedSort()}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { EntityType } from '../../../../../../../../types.generated';
|
|
||||||
import { SearchListInsightCard } from './SearchListInsightCard';
|
|
||||||
import { buildMostUsersFilters, buildMostUsersSort } from './useGetMostUsers';
|
|
||||||
|
|
||||||
export const MOST_USERS_ID = 'MostUsers';
|
|
||||||
|
|
||||||
export const MostUsersCard = () => {
|
|
||||||
return (
|
|
||||||
<SearchListInsightCard
|
|
||||||
id={MOST_USERS_ID}
|
|
||||||
tip="Tables with the most unique users in the past month"
|
|
||||||
types={[EntityType.Dataset]}
|
|
||||||
title="Most Popular Tables"
|
|
||||||
filters={buildMostUsersFilters()}
|
|
||||||
sort={buildMostUsersSort()}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { EntityType } from '../../../../../../../../types.generated';
|
|
||||||
import { SearchListInsightCard } from './SearchListInsightCard';
|
|
||||||
import { buildMostViewedDashboardsFilter, buildMostViewedDashboardsSort } from './useGetMostViewedDashboards';
|
|
||||||
|
|
||||||
export const MOST_VIEWED_DASHBOARDS_ID = 'MostViewedDashboards';
|
|
||||||
|
|
||||||
export const MostViewedDashboardsCard = () => {
|
|
||||||
return (
|
|
||||||
<SearchListInsightCard
|
|
||||||
id={MOST_VIEWED_DASHBOARDS_ID}
|
|
||||||
tip="Dashboards with the most views in the past month"
|
|
||||||
types={[EntityType.Dashboard]}
|
|
||||||
title="Most Viewed Dashboards"
|
|
||||||
filters={buildMostViewedDashboardsFilter()}
|
|
||||||
sort={buildMostViewedDashboardsSort()}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
import { FilterOperator, SortCriterion, SortOrder } from '../../../../../../../../types.generated';
|
|
||||||
import { FilterSet } from '../../../../../../../entityV2/shared/components/styled/search/types';
|
|
||||||
import { UnionType } from '../../../../../../../searchV2/utils/constants';
|
|
||||||
|
|
||||||
const MIN_QUERIES = '10';
|
|
||||||
|
|
||||||
export const buildMostQueriedFilters = (): FilterSet => {
|
|
||||||
return {
|
|
||||||
unionType: UnionType.AND,
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
field: 'usageCountLast30DaysFeature',
|
|
||||||
values: [MIN_QUERIES],
|
|
||||||
condition: FilterOperator.GreaterThanOrEqualTo,
|
|
||||||
negated: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const buildMostQueriedSort = (): SortCriterion => {
|
|
||||||
return {
|
|
||||||
field: 'usageCountLast30DaysFeature',
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
import { FilterOperator, SortCriterion, SortOrder } from '../../../../../../../../types.generated';
|
|
||||||
import { FilterSet } from '../../../../../../../entityV2/shared/components/styled/search/types';
|
|
||||||
import { UnionType } from '../../../../../../../searchV2/utils/constants';
|
|
||||||
|
|
||||||
const MIN_UPDATES = '10';
|
|
||||||
|
|
||||||
export const buildMostUpdatedFilters = (): FilterSet => {
|
|
||||||
return {
|
|
||||||
unionType: UnionType.AND,
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
field: 'writeCountLast30DaysFeature',
|
|
||||||
values: [MIN_UPDATES],
|
|
||||||
condition: FilterOperator.GreaterThanOrEqualTo,
|
|
||||||
negated: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const buildMostUpdatedSort = (): SortCriterion => {
|
|
||||||
return {
|
|
||||||
field: 'writeCountLast30DaysFeature',
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
import { FilterOperator, SortCriterion, SortOrder } from '../../../../../../../../types.generated';
|
|
||||||
import { FilterSet } from '../../../../../../../entityV2/shared/components/styled/search/types';
|
|
||||||
import { UnionType } from '../../../../../../../searchV2/utils/constants';
|
|
||||||
|
|
||||||
const MIN_USERS = '2';
|
|
||||||
|
|
||||||
export const buildMostUsersFilters = (): FilterSet => {
|
|
||||||
return {
|
|
||||||
unionType: UnionType.AND,
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
field: 'uniqueUserCountLast30DaysFeature',
|
|
||||||
values: [MIN_USERS],
|
|
||||||
condition: FilterOperator.GreaterThanOrEqualTo,
|
|
||||||
negated: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const buildMostUsersSort = (): SortCriterion => {
|
|
||||||
return {
|
|
||||||
field: 'uniqueUserCountLast30DaysFeature',
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
import { FilterOperator, SortCriterion, SortOrder } from '../../../../../../../../types.generated';
|
|
||||||
import { FilterSet } from '../../../../../../../entityV2/shared/components/styled/search/types';
|
|
||||||
import { UnionType } from '../../../../../../../searchV2/utils/constants';
|
|
||||||
|
|
||||||
const MIN_QUERIES = '1';
|
|
||||||
|
|
||||||
export const buildMostViewedDashboardsFilter = (): FilterSet => {
|
|
||||||
return {
|
|
||||||
unionType: UnionType.AND,
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
field: 'viewCountLast30DaysFeature',
|
|
||||||
values: [MIN_QUERIES],
|
|
||||||
condition: FilterOperator.GreaterThanOrEqualTo,
|
|
||||||
negated: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const buildMostViewedDashboardsSort = (): SortCriterion => {
|
|
||||||
return {
|
|
||||||
field: 'viewCountLast30DaysFeature',
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -24,32 +24,3 @@ export const SORT_OPTIONS = {
|
|||||||
sortOrder: SortOrder.Descending,
|
sortOrder: SortOrder.Descending,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// Extensions
|
|
||||||
export const ROW_COUNT_FIELD = 'rowCountFeature';
|
|
||||||
export const SIZE_IN_BYTES_FIELD = 'sizeInBytesFeature';
|
|
||||||
export const QUERY_COUNT = 'queryCountLast30DaysFeature';
|
|
||||||
export const UPDATE_COUNT = 'writeCountLast30DaysFeature';
|
|
||||||
|
|
||||||
export const DATASET_FEATURES_SORT_OPTIONS = {
|
|
||||||
[`${ROW_COUNT_FIELD}_${SortOrder.Descending}`]: {
|
|
||||||
label: 'Table Row Count',
|
|
||||||
field: ROW_COUNT_FIELD,
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
},
|
|
||||||
[`${SIZE_IN_BYTES_FIELD}_${SortOrder.Descending}`]: {
|
|
||||||
label: 'Table Size (Bytes)',
|
|
||||||
field: SIZE_IN_BYTES_FIELD,
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
},
|
|
||||||
[`${QUERY_COUNT}_${SortOrder.Descending}`]: {
|
|
||||||
label: 'Table Query Count (Last 30 Days)',
|
|
||||||
field: QUERY_COUNT,
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
},
|
|
||||||
[`${UPDATE_COUNT}_${SortOrder.Descending}`]: {
|
|
||||||
label: 'Table Update Count (Last 30 Days)',
|
|
||||||
field: UPDATE_COUNT,
|
|
||||||
sortOrder: SortOrder.Descending,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user