refactor: convert DatasetList schema filter to use new distinct api (#10746)

This commit is contained in:
ʈᵃᵢ 2020-09-02 11:07:37 -07:00 committed by GitHub
parent e0deaad5e3
commit 5a4370012b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 52 deletions

View File

@ -35,6 +35,7 @@ const store = mockStore({});
const datasetsInfoEndpoint = 'glob:*/api/v1/dataset/_info*';
const datasetsOwnersEndpoint = 'glob:*/api/v1/dataset/related/owners*';
const datasetsSchemaEndpoint = 'glob:*/api/v1/dataset/distinct/schema*';
const databaseEndpoint = 'glob:*/api/v1/dataset/related/database*';
const datasetsEndpoint = 'glob:*/api/v1/dataset/?*';
@ -57,6 +58,9 @@ fetchMock.get(datasetsInfoEndpoint, {
fetchMock.get(datasetsOwnersEndpoint, {
result: [],
});
fetchMock.get(datasetsSchemaEndpoint, {
result: [],
});
fetchMock.get(datasetsEndpoint, {
result: mockdatasets,
dataset_count: 3,
@ -97,12 +101,20 @@ describe('DatasetList', () => {
it('fetches data', () => {
const callsD = fetchMock.calls(/dataset\/\?q/);
expect(callsD).toHaveLength(2);
expect(callsD[1][0]).toMatchInlineSnapshot(
expect(callsD).toHaveLength(1);
expect(callsD[0][0]).toMatchInlineSnapshot(
`"http://localhost/api/v1/dataset/?q=(order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)"`,
);
});
it('fetches owner filter values', () => {
expect(fetchMock.calls(/dataset\/related\/owners/)).toHaveLength(1);
});
it('fetches schema filter values', () => {
expect(fetchMock.calls(/dataset\/distinct\/schema/)).toHaveLength(1);
});
it('shows/hides bulk actions when bulk actions is clicked', async () => {
await waitForComponentToPaint(wrapper);
const button = wrapper.find(Button).at(0);

View File

@ -20,7 +20,11 @@ import { SupersetClient } from '@superset-ui/connection';
import { t } from '@superset-ui/translation';
import React, { FunctionComponent, useState, useMemo } from 'react';
import rison from 'rison';
import { createFetchRelated, createErrorHandler } from 'src/views/CRUD/utils';
import {
createFetchRelated,
createFetchDistinct,
createErrorHandler,
} from 'src/views/CRUD/utils';
import { useListViewResource } from 'src/views/CRUD/hooks';
import ConfirmStatusChange from 'src/components/ConfirmStatusChange';
import DatasourceModal from 'src/datasource/DatasourceModal';
@ -59,40 +63,6 @@ interface DatasetListProps {
addSuccessToast: (msg: string) => void;
}
export const createFetchSchemas = (
handleError: (error: Response) => void,
) => async (filterValue = '', pageIndex?: number, pageSize?: number) => {
// add filters if filterValue
const filters = filterValue
? { filters: [{ col: 'schema', opr: 'sw', value: filterValue }] }
: {};
try {
const queryParams = rison.encode({
columns: ['schema'],
keys: ['none'],
order_by: 'schema',
...(pageIndex ? { page: pageIndex } : {}),
...(pageSize ? { page_size: pageSize } : {}),
...filters,
});
const { json = {} } = await SupersetClient.get({
endpoint: `/api/v1/dataset/?q=${queryParams}`,
});
const schemas: string[] = json?.result?.map(
({ schema }: { schema: string }) => schema,
);
// uniqueify schema values and create options
return [...new Set(schemas)]
.filter(schema => Boolean(schema))
.map(schema => ({ label: schema, value: schema }));
} catch (e) {
handleError(e);
}
return [];
};
const DatasetList: FunctionComponent<DatasetListProps> = ({
addDangerToast,
addSuccessToast,
@ -393,8 +363,12 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
input: 'select',
operator: 'eq',
unfilteredLabel: 'All',
fetchSelects: createFetchSchemas(errMsg =>
t('An error occurred while fetching schema values: %s', errMsg),
fetchSelects: createFetchDistinct(
'dataset',
'schema',
createErrorHandler(errMsg =>
t('An error occurred while fetching schema values: %s', errMsg),
),
),
paginate: true,
},

View File

@ -24,12 +24,12 @@ import rison from 'rison';
import getClientErrorObject from 'src/utils/getClientErrorObject';
import { logging } from '@superset-ui/core';
export const createFetchRelated = (
const createFetchResourceMethod = (method: string) => (
resource: string,
relation: string,
handleError: (error: Response) => void,
) => async (filterValue = '', pageIndex?: number, pageSize?: number) => {
const resourceEndpoint = `/api/v1/${resource}/related/${relation}`;
const resourceEndpoint = `/api/v1/${resource}/${method}/${relation}`;
try {
const queryParams = rison.encode({
@ -53,6 +53,9 @@ export const createFetchRelated = (
return [];
};
export const createFetchRelated = createFetchResourceMethod('related');
export const createFetchDistinct = createFetchResourceMethod('distinct');
export function createErrorHandler(handleErrorFunc: (errMsg?: string) => void) {
return async (e: SupersetClientResponse | string) => {
const parsedError = await getClientErrorObject(e);

View File

@ -415,5 +415,9 @@ class BaseSupersetModelRestApi(ModelRestApi):
# Apply pagination
result = self.datamodel.apply_pagination(query, page, page_size).all()
# produce response
result = [{"text": item[0]} for item in result if item[0] is not None]
result = [
{"text": item[0], "value": item[0]}
for item in result
if item[0] is not None
]
return self.response(200, count=count, result=result)

View File

@ -192,15 +192,16 @@ class TestDatasetApi(SupersetTestCase):
"columns", "information_schema", [], get_main_database()
)
)
schema_values = [
"",
"admin_database",
"information_schema",
"public",
"superset",
]
expected_response = {
"count": 5,
"result": [
{"text": ""},
{"text": "admin_database"},
{"text": "information_schema"},
{"text": "public"},
{"text": "superset"},
],
"result": [{"text": val, "value": val} for val in schema_values],
}
self.login(username="admin")
uri = "api/v1/dataset/distinct/schema"
@ -213,17 +214,26 @@ class TestDatasetApi(SupersetTestCase):
query_parameter = {"filter": "inf"}
pg_test_query_parameter(
query_parameter,
{"count": 1, "result": [{"text": "information_schema"}]},
{
"count": 1,
"result": [
{"text": "information_schema", "value": "information_schema"}
],
},
)
query_parameter = {"page": 0, "page_size": 1}
pg_test_query_parameter(
query_parameter, {"count": 5, "result": [{"text": ""}]},
query_parameter, {"count": 5, "result": [{"text": "", "value": ""}]},
)
query_parameter = {"page": 1, "page_size": 1}
pg_test_query_parameter(
query_parameter, {"count": 5, "result": [{"text": "admin_database"}]}
query_parameter,
{
"count": 5,
"result": [{"text": "admin_database", "value": "admin_database"}],
},
)
for dataset in datasets: