diff --git a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts index 330f60a136e..7cdf9720840 100644 --- a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts +++ b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts @@ -216,3 +216,12 @@ export const getAdvancedFieldOptions = ( return APIClient.get(`/search/suggest`, { params }); }; + +export const getEntityCount = ( + path: string, + database?: string +): Promise => { + const params = { database, limit: 0 }; + + return APIClient.get(`/${path}`, { params }); +}; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx index 5711c4c5b11..9a09b28483e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx @@ -88,6 +88,8 @@ import { getServiceCategoryFromType, servicePageTabs, serviceTypeLogo, + setServiceSchemaCount, + setServiceTableCount, } from '../../utils/ServiceUtils'; import { getEntityLink, getUsagePercentile } from '../../utils/TableUtils'; import { showErrorToast } from '../../utils/ToastUtils'; @@ -125,6 +127,9 @@ const ServicePage: FunctionComponent = () => { const [isAirflowRunning, setIsAirflowRunning] = useState(false); const [connectionDetails, setConnectionDetails] = useState(); + const [schemaCount, setSchemaCount] = useState(0); + const [tableCount, setTableCount] = useState(0); + const getCountLabel = () => { switch (serviceName) { case ServiceCategory.DASHBOARD_SERVICES: @@ -370,6 +375,8 @@ const ServicePage: FunctionComponent = () => { .then((res: AxiosResponse) => { if (res.data.data) { setData(res.data.data); + setServiceSchemaCount(res.data.data, setSchemaCount); + setServiceTableCount(res.data.data, setTableCount); setPaging(res.data.paging); setInstanceCount(res.data.paging.total); setIsloading(false); @@ -686,7 +693,10 @@ const ServicePage: FunctionComponent = () => { case ServiceCategory.DATABASE_SERVICES: return getEntityDeleteMessage( service || 'Service', - pluralize(instanceCount, 'Database') + `${pluralize(instanceCount, 'Database')}, ${pluralize( + schemaCount, + 'Schema' + )} and ${pluralize(tableCount, 'Table')}` ); case ServiceCategory.MESSAGING_SERVICES: diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtils.tsx index 2cfda1ac503..eadaf940f88 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtils.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/utils/ServiceUtils.tsx @@ -11,7 +11,7 @@ * limitations under the License. */ -import { AxiosResponse } from 'axios'; +import { AxiosError, AxiosResponse } from 'axios'; import cryptoRandomString from 'crypto-random-string-with-promisify-polyfill'; import { Bucket, @@ -23,6 +23,7 @@ import { ServiceTypes, } from 'Models'; import React from 'react'; +import { getEntityCount } from '../axiosAPIs/miscAPI'; import { getServiceDetails, getServices } from '../axiosAPIs/serviceAPI'; import { addMetadataIngestionGuide, @@ -77,6 +78,7 @@ import { } from '../constants/services.const'; import { ServiceCategory } from '../enums/service.enum'; import { ConnectionType } from '../generated/api/services/ingestionPipelines/testServiceConnection'; +import { Database } from '../generated/entity/data/database'; import { MlModelServiceType } from '../generated/entity/data/mlmodel'; import { DashboardServiceType } from '../generated/entity/services/dashboardService'; import { DatabaseServiceType } from '../generated/entity/services/databaseService'; @@ -84,6 +86,7 @@ import { PipelineType as IngestionPipelineType } from '../generated/entity/servi import { MessagingServiceType } from '../generated/entity/services/messagingService'; import { PipelineServiceType } from '../generated/entity/services/pipelineService'; import { ServiceResponse } from '../interface/service.interface'; +import { showErrorToast } from './ToastUtils'; export const serviceTypeLogo = (type: string) => { switch (type) { @@ -592,3 +595,45 @@ export const getServiceCreatedLabel = (serviceCategory: ServiceCategory) => { return [serviceCat, 'service'].join(' '); }; + +export const setServiceSchemaCount = ( + data: Database[], + callback: (value: React.SetStateAction) => void +) => { + const promises = data.map((database) => + getEntityCount('databaseSchemas', database.fullyQualifiedName) + ); + + Promise.allSettled(promises) + .then((results) => { + let count = 0; + results.forEach((result) => { + if (result.status === 'fulfilled') { + count += result.value.data?.paging?.total || 0; + } + }); + callback(count); + }) + .catch((err: AxiosError) => showErrorToast(err)); +}; + +export const setServiceTableCount = ( + data: Database[], + callback: (value: React.SetStateAction) => void +) => { + const promises = data.map((database) => + getEntityCount('tables', database.fullyQualifiedName) + ); + + Promise.allSettled(promises) + .then((results) => { + let count = 0; + results.forEach((result) => { + if (result.status === 'fulfilled') { + count += result.value.data?.paging?.total || 0; + } + }); + callback(count); + }) + .catch((err: AxiosError) => showErrorToast(err)); +};