This is an automated email from the ASF dual-hosted git repository. xxyu pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit e104fa10519c44d9c93b3765882df6385d60b859 Author: Qian Xia <lauraxiaq...@gmail.com> AuthorDate: Thu Feb 2 17:59:23 2023 +0800 KYLIN-5407 CH query total_scan_count issue --- .../src/components/query/query_history_table.vue | 23 +++++++++++--- kystudio/src/components/query/query_result.vue | 36 +++++++++++++++++++--- kystudio/src/store/model.js | 3 ++ kystudio/src/store/system.js | 3 ++ kystudio/src/store/types.js | 1 + 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/kystudio/src/components/query/query_history_table.vue b/kystudio/src/components/query/query_history_table.vue index 270a9686c3..a39154844d 100644 --- a/kystudio/src/components/query/query_history_table.vue +++ b/kystudio/src/components/query/query_history_table.vue @@ -136,11 +136,11 @@ <span class="label">{{$t('kylinLang.query.snapshot')}}:</span> <span class="text">{{getSnapshots(props.row.realizations)}}</span> </p> - <p class="list"> + <p class="list" v-if="!isHaveStorageQuery(props.row.realizations) || (isHaveStorageQuery(props.row.realizations) && storageQueryMetricCollect)"> <span class="label">{{$t('kylinLang.query.total_scan_count')}}:</span> <span class="text">{{props.row.total_scan_count | filterNumbers}}</span> </p> - <p class="list"> + <p class="list" v-if="!isHaveStorageQuery(props.row.realizations) || (isHaveStorageQuery(props.row.realizations) && storageQueryMetricCollect)"> <span class="label">{{$t('kylinLang.query.total_scan_bytes')}}:</span> <span class="text">{{props.row.total_scan_bytes | filterNumbers}}</span> </p> @@ -326,7 +326,8 @@ import Diagnostic from 'components/admin/Diagnostic/index' 'currentSelectedProject', 'briefMenuGet', 'queryHistoryFilter', - 'isNonAdminGenQueryDiagPackage' + 'isNonAdminGenQueryDiagPackage', + 'storageQueryMetricCollect' // 系统逃生通道:是否可以获取统计分层存储扫描行数、扫描字节数 ]) }, components: { @@ -376,7 +377,8 @@ import Diagnostic from 'components/admin/Diagnostic/index' downloadQueryDiagnosticPackage: 'Download Query Diagnostic Package', queryError: 'Query error.', viewDetails: 'View Details', - errorTitle: 'Error Details' + errorTitle: 'Error Details', + fetchError: 'Can\'t get the result as the record is missing' } }, filters: { @@ -460,6 +462,19 @@ export default class QueryHistoryTable extends Vue { return [{text: this.$t('allModels'), value: 'modelName', icon: 'el-icon-ksd-cube'}] } + isHaveStorageQuery (realizations) { + let isStorageQuery = false + if (realizations && realizations.length) { + for (let r of realizations) { + if (r.secondStorage) { + isStorageQuery = true + break + } + } + } + return isStorageQuery + } + // 排除击中 snapshot 的查询对象 getRealizations (row) { return row.filter(item => item.indexType !== 'Table Snapshot' && item.layoutId !== 0 && item.layoutId !== -1) diff --git a/kystudio/src/components/query/query_result.vue b/kystudio/src/components/query/query_result.vue index d22f5103b9..45a1aa539b 100644 --- a/kystudio/src/components/query/query_result.vue +++ b/kystudio/src/components/query/query_result.vue @@ -83,9 +83,15 @@ </span> <span class="text" v-else>{{Math.round(extraoption.duration / 1000 * 100) / 100 || 0.00}}s</span> </p> - <p class="resultText" v-if="!extraoption.pushDown"> + <p class="resultText" v-if="!extraoption.pushDown&&(isHaveStorageQuery&&storageQueryMetricCollect || !isHaveStorageQuery)"> <span class="label">{{$t('kylinLang.query.total_scan_count')}}: </span> - <span class="text">{{extraoption.totalScanRows | filterNumbers}}</span> + <span class="text" v-if="!isHaveStorageQuery">{{extraoption.totalScanRows | filterNumbers}}</span> + <span class="text" v-else> + <span v-if="isLoadingScanRows"><i class="el-ksd-icon-refresh_16"></i><span class="refresh-loading">{{$t('loading')}}</span></span> + <span v-else-if="extraoption.totalScanRows === 0" @click="fetchTotalScanRows"><i class="el-ksd-icon-refresh_16"></i><span class="refresh-label">{{$t('refreshManual')}}</span></span> + <span v-else-if="extraoption.totalScanRows === -1"><span class="refresh-error">{{$t('fetchError')}}</span></span> + <span v-else>{{extraoption.totalScanRows | filterNumbers}}</span> + </span> </p> <p class="resultText" v-if="!extraoption.pushDown"> <span class="label">{{$t('kylinLang.query.result_row_count')}}: </span> @@ -209,7 +215,8 @@ import echarts from 'echarts' ...mapActions({ query: 'QUERY_BUILD_TABLES', postToExportCSV: 'EXPORT_CSV', - loadAllIndex: 'LOAD_ALL_INDEX' + loadAllIndex: 'LOAD_ALL_INDEX', + loadSecondStorageScanRows: 'LOAD_SECOND_STORAGE_SCAN_ROWS' }), ...mapActions('DetailDialogModal', { callGlobalDetailDialog: 'CALL_MODAL' @@ -219,7 +226,8 @@ import echarts from 'echarts' ...mapGetters([ 'currentSelectedProject', 'insightActions', - 'datasourceActions' + 'datasourceActions', + 'storageQueryMetricCollect' // 系统逃生通道:是否可以获取统计分层存储扫描行数 ]) }, components: { @@ -327,6 +335,8 @@ export default class queryResult extends Vue { model = { uuid: '' } + isHaveStorageQuery = false + isLoadingScanRows = false // 增加可视化按钮 get insightBtnGroups () { return [ @@ -493,11 +503,15 @@ export default class queryResult extends Vue { } } get realizations () { + this.isHaveStorageQuery = false if (this.extraoption.realizations && this.extraoption.realizations.length) { let realizations = [] for (let i of this.extraoption.realizations) { if (i.layoutId !== -1 && i.layoutId !== null && i.layoutId !== 0) { realizations.push(i) + if (i.secondStorage) { + this.isHaveStorageQuery = true + } } } return realizations @@ -535,6 +549,20 @@ export default class queryResult extends Vue { return this.$store.state.project.multi_partition_enabled ? this.$t('noModelRangeTips2') : this.$t('noModelRangeTips') } + async fetchTotalScanRows () { + try { + this.isLoadingScanRows = true + const { queryId } = this.extraoption + const res = await this.loadSecondStorageScanRows({ project: this.currentSelectedProject, query_id: queryId }) + const data = await handleSuccessAsync(res) + this.extraoption.totalScanRows = data.total_scan_count + this.isLoadingScanRows = false + } catch (e) { + this.isLoadingScanRows = false + handleError(e) + } + } + // 展示 layout 详情 async openLayoutDetails (item) { const {modelId, layoutId} = item diff --git a/kystudio/src/store/model.js b/kystudio/src/store/model.js index cbcf4e1615..b2df301cd0 100644 --- a/kystudio/src/store/model.js +++ b/kystudio/src/store/model.js @@ -407,6 +407,9 @@ export default { }, [types.CHECK_INTERNAL_MEASURE] (_, params) { return api.model.checkInternalMeasure(params) + }, + [types.LOAD_SECOND_STORAGE_SCAN_ROWS] (_, params) { + return api.model.loadSecondStorageScanRows(params) } }, getters: { diff --git a/kystudio/src/store/system.js b/kystudio/src/store/system.js index b662f17c36..1d80cd71c7 100644 --- a/kystudio/src/store/system.js +++ b/kystudio/src/store/system.js @@ -239,6 +239,9 @@ export default { }, isStreamingEnabled: (state) => { return state.streamingEnabled === 'true' + }, + storageQueryMetricCollect: (state) => { + return state.storageQuery === 'true' } } } diff --git a/kystudio/src/store/types.js b/kystudio/src/store/types.js index b403930e33..d02a703296 100644 --- a/kystudio/src/store/types.js +++ b/kystudio/src/store/types.js @@ -286,6 +286,7 @@ export const GET_JOB_SIMPLE_LOG = 'GET_JOB_SIMPLE_LOG' export const VALIDATE_DATE_FORMAT = 'VALIDATE_DATE_FORMAT' export const CHECK_INTERNAL_MEASURE = 'CHECK_INTERNAL_MEASURE' export const UPDATE_FILTER_MODEL_NAME_CLOUD = 'UPDATE_FILTER_MODEL_NAME_CLOUD' +export const LOAD_SECOND_STORAGE_SCAN_ROWS = 'LOAD_SECOND_STORAGE_SCAN_ROWS' // table index export const GET_TABLE_INDEX = 'GET_TABLE_INDEX' export const EDIT_TABLE_INDEX = 'EDIT_TABLE_INDEX'