diff --git a/service-hudi-query/src/main/java/com/lanyuanxiaoyao/service/hudi/service/TimelineService.java b/service-hudi-query/src/main/java/com/lanyuanxiaoyao/service/hudi/service/TimelineService.java index 1325cda..ad31a30 100644 --- a/service-hudi-query/src/main/java/com/lanyuanxiaoyao/service/hudi/service/TimelineService.java +++ b/service-hudi-query/src/main/java/com/lanyuanxiaoyao/service/hudi/service/TimelineService.java @@ -91,6 +91,9 @@ public class TimelineService { ) throws IOException { Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get(configuration); + if (!fileSystem.exists(new Path(hdfs))) { + throw new IOException(StrUtil.format("Path {} is not exists", hdfs)); + } HoodieTableMetaClient client = HoodieTableMetaClient.builder() .setConf(configuration) .setBasePath(hdfs) diff --git a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/HudiController.java b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/HudiController.java index a0d8a6b..42abf18 100644 --- a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/HudiController.java +++ b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/HudiController.java @@ -1,6 +1,7 @@ package com.lanyuanxiaoyao.service.web.controller; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.lanyuanxiaoyao.service.configuration.entity.AmisResponse; import com.lanyuanxiaoyao.service.configuration.entity.PageResponse; import com.lanyuanxiaoyao.service.configuration.entity.hudi.HudiInstant; @@ -67,4 +68,38 @@ public class HudiController extends BaseController { PageResponse response = hudiService.timelineList(queryMap); return responseCrudData(response.getData(), response.getTotal()); } + + @GetMapping("/timeline/list_hdfs") + public AmisResponse timelineHdfs( + @RequestParam(value = "page", defaultValue = "1") Integer page, + @RequestParam(value = "count", defaultValue = "10") Integer count, + @RequestParam(value = "order", defaultValue = "timestamp") String order, + @RequestParam(value = "direction", defaultValue = "desc") String direction, + @RequestParam("hdfs") String hdfs, + @RequestParam(value = "filter_type", required = false) List filterType, + @RequestParam(value = "filter_action", required = false) List filterAction, + @RequestParam(value = "filter_state", required = false) List filterState + ) { + MutableMap queryMap = Maps.mutable.empty(); + queryMap.put("page", page); + queryMap.put("count", count); + if (StrUtil.isNotBlank(order) && StrUtil.isNotBlank(direction)) { + queryMap.put("order", order); + queryMap.put("direction", direction); + } + if (ObjectUtil.isNotEmpty(hdfs)) { + queryMap.put("hdfs", hdfs); + } + if (ObjectUtil.isNotEmpty(filterType)) { + queryMap.put("filter_type", filterType); + } + if (ObjectUtil.isNotEmpty(filterAction)) { + queryMap.put("filter_action", filterAction); + } + if (ObjectUtil.isNotEmpty(filterState)) { + queryMap.put("filter_state", filterState); + } + PageResponse response = hudiService.timelineHdfsList(queryMap); + return responseCrudData(response.getData(), response.getTotal()); + } } diff --git a/web/components/common.js b/web/components/common.js index f2aab4d..03554ec 100644 --- a/web/components/common.js +++ b/web/components/common.js @@ -8,13 +8,13 @@ function crudCommonOptions() { } } -function paginationCommonOptions(perPage = true) { +function paginationCommonOptions(perPage = true, maxButtons = 5) { let option = { type: 'pagination', layout: [ 'pager' ], - maxButtons: 5, + maxButtons: maxButtons, showPageInput: false, perPageAvailable: [10, 15, 20, 50, 100, 200], } @@ -740,6 +740,52 @@ function flinkJobDialog() { } } +function timelineColumns() { + return [ + { + name: 'timestamp', + label: '时间点', + width: 150, + sortable: true, + }, + { + name: 'action', + label: '类型', + width: 100, + ...mappingField('action', hudiTimelineActionMapping), + filterable: filterableField(hudiTimelineActionMapping, false), + }, + { + name: 'state', + label: ' 状态', + width: 80, + align: 'center', + ...mappingField('state', hudiTimelineStateMapping), + filterable: filterableField(hudiTimelineStateMapping, true), + }, + { + name: 'fileTime', + label: ' 文件时间', + width: 150, + align: 'center', + type: 'tpl', + tpl: "${DATETOSTR(DATE(fileTime), 'YYYY-MM-DD HH:mm:ss')}", + }, + { + name: 'fileName', + label: '文件名', + }, + { + name: 'type', + label: '来源', + width: 60, + align: 'center', + ...mappingField('type', hudiTimelineTypeMapping), + filterable: filterableField(hudiTimelineTypeMapping, true), + }, + ] +} + function tableMetaDialog() { return { title: 'Table 详情', @@ -920,49 +966,7 @@ function tableMetaDialog() { footerToolbar: [ paginationCommonOptions(), ], - columns: [ - { - name: 'timestamp', - label: '时间点', - width: 150, - sortable: true, - }, - { - name: 'action', - label: '类型', - width: 100, - ...mappingField('action', hudiTimelineActionMapping), - filterable: filterableField(hudiTimelineActionMapping, false), - }, - { - name: 'state', - label: ' 状态', - width: 80, - align: 'center', - ...mappingField('state', hudiTimelineStateMapping), - filterable: filterableField(hudiTimelineStateMapping, true), - }, - { - name: 'fileTime', - label: ' 文件时间', - width: 150, - align: 'center', - type: 'tpl', - tpl: "${DATETOSTR(DATE(fileTime), 'YYYY-MM-DD HH:mm:ss')}", - }, - { - name: 'fileName', - label: '文件名', - }, - { - name: 'type', - label: '来源', - width: 60, - align: 'center', - ...mappingField('type', hudiTimelineTypeMapping), - filterable: filterableField(hudiTimelineTypeMapping, true), - }, - ], + columns: timelineColumns(), } } }, diff --git a/web/components/tool-tab.js b/web/components/tool-tab.js new file mode 100644 index 0000000..8a535e0 --- /dev/null +++ b/web/components/tool-tab.js @@ -0,0 +1,63 @@ +function toolTab() { + return { + title: `小工具`, + tab: [ + { + type: 'form', + title: '查询时间线', + mode: 'horizontal', + horizontal: { + leftFixed: 'md', + }, + actions: [ + { + type: 'submit', + label: '查询', + actionType: 'dialog', + dialog: { + title: 'Hudi 表时间线', + actions: [], + size: 'lg', + body: { + type: 'crud', + api: { + method: 'get', + url: '${base}/hudi/timeline/list_hdfs', + data: { + page: '${page|default:undefined}', + count: '${perPage|default:undefined}', + order: '${orderBy|default:undefined}', + direction: '${orderDir|default:undefined}', + hdfs: '${hdfs|default:undefined}', + filter_type: "${type|default:active}", + filter_action: '${action|default:undefined}', + filter_state: '${state|default:undefined}', + }, + }, + ...crudCommonOptions(), + perPage: 50, + headerToolbar: [ + "reload", + paginationCommonOptions(undefined, 10), + ], + footerToolbar: [ + paginationCommonOptions(undefined, 10), + ], + columns: timelineColumns(), + } + } + } + ], + body: [ + { + type: 'input-text', + name: 'hdfs', + label: '表HDFS路经', + required: true, + } + ] + }, + {type: 'divider'}, + ] + } +} \ No newline at end of file diff --git a/web/index.html b/web/index.html index e132296..d133f9a 100644 --- a/web/index.html +++ b/web/index.html @@ -44,6 +44,7 @@ +