diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts index 636c62130b4..a2f6c7a1ea1 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts @@ -505,78 +505,137 @@ test( await page.reload(); await page.waitForLoadState('networkidle'); - await page.click('[data-testid="profiler-setting-btn"]'); - await page.waitForSelector('.ant-modal-body'); - await page.locator('[data-testid="slider-input"]').clear(); - await page - .locator('[data-testid="slider-input"]') - .fill(profilerSetting.profileSample); + await test.step('Update profiler setting', async () => { + await page.click('[data-testid="profiler-setting-btn"]'); + await page.waitForSelector('.ant-modal-body'); - await page.locator('[data-testid="sample-data-count-input"]').clear(); - await page - .locator('[data-testid="sample-data-count-input"]') - .fill(profilerSetting.sampleDataCount); - await page.locator('[data-testid="exclude-column-select"]').click(); - await page.keyboard.type(`${profilerSetting.excludeColumns}`); - await page.keyboard.press('Enter'); - await page.locator('.CodeMirror-scroll').click(); - await page.keyboard.type(profilerSetting.profileQuery); + await page.locator('[data-testid="slider-input"]').clear(); + await page + .locator('[data-testid="slider-input"]') + .fill(profilerSetting.profileSample); - await page.locator('[data-testid="include-column-select"]').click(); - await page - .locator('.ant-select-dropdown') - .locator( - `[title="${profilerSetting.includeColumns}"]:not(.ant-select-dropdown-hidden)` - ) - .last() - .click(); - await page.locator('[data-testid="enable-partition-switch"]').click(); - await page.locator('[data-testid="interval-type"]').click(); - await page - .locator('.ant-select-dropdown') - .locator( - `[title="${profilerSetting.partitionIntervalType}"]:not(.ant-select-dropdown-hidden)` - ) - .click(); + await page.locator('[data-testid="sample-data-count-input"]').clear(); + await page + .locator('[data-testid="sample-data-count-input"]') + .fill(profilerSetting.sampleDataCount); + await page.locator('[data-testid="exclude-column-select"]').click(); + await page.keyboard.type(`${profilerSetting.excludeColumns}`); + await page.keyboard.press('Enter'); + await page.locator('.CodeMirror-scroll').click(); + await page.keyboard.type(profilerSetting.profileQuery); - await page.locator('#includeColumnsProfiler_partitionColumnName').click(); - await page - .locator('.ant-select-dropdown') - .locator( - `[title="${profilerSetting.partitionColumnName}"]:not(.ant-select-dropdown-hidden)` - ) - .last() - .click(); - await page - .locator('[data-testid="partition-value"]') - .fill(profilerSetting.partitionValues); + await page.locator('[data-testid="include-column-select"]').click(); + await page + .locator('.ant-select-dropdown') + .locator( + `[title="${profilerSetting.includeColumns}"]:not(.ant-select-dropdown-hidden)` + ) + .last() + .click(); + await page.locator('[data-testid="enable-partition-switch"]').click(); + await page.locator('[data-testid="interval-type"]').click(); + await page + .locator('.ant-select-dropdown') + .locator( + `[title="${profilerSetting.partitionIntervalType}"]:not(.ant-select-dropdown-hidden)` + ) + .click(); - const updateTableProfilerConfigResponse = page.waitForResponse( - (response) => - response.url().includes('/api/v1/tables/') && - response.url().includes('/tableProfilerConfig') && - response.request().method() === 'PUT' - ); - await page.getByRole('button', { name: 'Save' }).click(); - const updateResponse = await updateTableProfilerConfigResponse; - const requestBody = await updateResponse.request().postData(); + await page.locator('#includeColumnsProfiler_partitionColumnName').click(); + await page + .locator('.ant-select-dropdown') + .locator( + `[title="${profilerSetting.partitionColumnName}"]:not(.ant-select-dropdown-hidden)` + ) + .last() + .click(); + await page + .locator('[data-testid="partition-value"]') + .fill(profilerSetting.partitionValues); - expect(requestBody).toEqual( - JSON.stringify({ - excludeColumns: [table1.entity?.columns[0].name], - profileQuery: 'select * from table', - profileSample: 60, - profileSampleType: 'PERCENTAGE', - includeColumns: [{ columnName: table1.entity?.columns[1].name }], - partitioning: { - partitionColumnName: table1.entity?.columns[2].name, - partitionIntervalType: 'COLUMN-VALUE', - partitionValues: ['test'], - enablePartitioning: true, - }, - sampleDataCount: 100, - }) - ); + const updateTableProfilerConfigResponse = page.waitForResponse( + (response) => + response.url().includes('/api/v1/tables/') && + response.url().includes('/tableProfilerConfig') && + response.request().method() === 'PUT' + ); + await page.getByRole('button', { name: 'Save' }).click(); + const updateResponse = await updateTableProfilerConfigResponse; + const requestBody = await updateResponse.request().postData(); + + expect(requestBody).toEqual( + JSON.stringify({ + excludeColumns: [table1.entity?.columns[0].name], + profileQuery: 'select * from table', + profileSample: 60, + profileSampleType: 'PERCENTAGE', + includeColumns: [{ columnName: table1.entity?.columns[1].name }], + partitioning: { + partitionColumnName: table1.entity?.columns[2].name, + partitionIntervalType: 'COLUMN-VALUE', + partitionValues: ['test'], + enablePartitioning: true, + }, + sampleDataCount: 100, + }) + ); + }); + + await test.step('Reset profile sample type', async () => { + await page.click('[data-testid="profiler-setting-btn"]'); + await page.waitForSelector('.ant-modal-body'); + + await expect( + page.locator('[data-testid="profile-sample"]') + ).toBeVisible(); + + await page.getByTestId('clear-slider-input').click(); + + await expect(page.locator('[data-testid="slider-input"]')).toBeEmpty(); + + const updateTableProfilerConfigResponse = page.waitForResponse( + (response) => + response.url().includes('/api/v1/tables/') && + response.url().includes('/tableProfilerConfig') && + response.request().method() === 'PUT' + ); + await page.getByRole('button', { name: 'Save' }).click(); + const updateResponse = await updateTableProfilerConfigResponse; + const requestBody = await updateResponse.request().postData(); + + expect(requestBody).toEqual( + JSON.stringify({ + excludeColumns: [table1.entity?.columns[0].name], + profileQuery: 'select * from table', + profileSample: null, + profileSampleType: 'PERCENTAGE', + includeColumns: [{ columnName: table1.entity?.columns[1].name }], + partitioning: { + partitionColumnName: table1.entity?.columns[2].name, + partitionIntervalType: 'COLUMN-VALUE', + partitionValues: ['test'], + enablePartitioning: true, + }, + sampleDataCount: 100, + }) + ); + + await page.waitForSelector('.ant-modal-body', { + state: 'detached', + }); + + // Validate the profiler setting is updated + await page.click('[data-testid="profiler-setting-btn"]'); + await page.waitForSelector('.ant-modal-body'); + + await expect( + page.locator('[data-testid="profile-sample"]') + ).toBeVisible(); + await expect(page.locator('[data-testid="slider-input"]')).toBeEmpty(); + await expect( + page.getByTestId('profile-sample').locator('div') + ).toBeVisible(); + }); } ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/ProfilerSettingsModal/ProfilerSettingsModal.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/ProfilerSettingsModal/ProfilerSettingsModal.tsx index d0b0d2b3e33..617c15dbb94 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/ProfilerSettingsModal/ProfilerSettingsModal.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/ProfilerSettingsModal/ProfilerSettingsModal.tsx @@ -175,24 +175,23 @@ const ProfilerSettingsModal: React.FC = ({ sqlQuery: profileQuery ?? '', profileSample: profileSample, excludeCol: excludeColumns ?? [], - selectedProfileSampleType: - profileSampleType ?? ProfileSampleType.Percentage, + selectedProfileSampleType: profileSampleType, sampleDataCount, }); form.setFieldsValue({ sampleDataCount: sampleDataCount ?? initialState.sampleDataCount, }); - const profileSampleTypeCheck = - profileSampleType === ProfileSampleType.Percentage; form.setFieldsValue({ profileSampleType, - profileSamplePercentage: profileSampleTypeCheck - ? profileSample ?? 100 - : 100, - profileSampleRows: !profileSampleTypeCheck - ? profileSample ?? 100 - : undefined, + profileSamplePercentage: + profileSample && profileSampleType === ProfileSampleType.Percentage + ? profileSample + : undefined, + profileSampleRows: + profileSample && profileSampleType === ProfileSampleType.Rows + ? profileSample + : undefined, }); if (includeColumns && includeColumns?.length > 0) { @@ -287,11 +286,14 @@ const ProfilerSettingsModal: React.FC = ({ const profileConfig: TableProfilerConfig = { excludeColumns: excludeCol.length > 0 ? excludeCol : undefined, profileQuery: !isEmpty(sqlQuery) ? sqlQuery : undefined, - profileSample: - profileSampleType === ProfileSampleType.Percentage + profileSample: profileSampleType + ? profileSampleType === ProfileSampleType.Percentage ? profileSamplePercentage - : profileSampleRows, - profileSampleType: profileSampleType, + : profileSampleRows + : undefined, + profileSampleType: isUndefined(profileSampleType) + ? null + : profileSampleType, includeColumns: !isEqual(includeCol, DEFAULT_INCLUDE_PROFILE) ? getIncludesColumns() : undefined, @@ -461,31 +463,37 @@ const ProfilerSettingsModal: React.FC = ({ })} name="profileSampleType">