Metabase-BI系列09:透视表PR功能实现解析

2020-02-27  本文已影响0人  diss带码

​ 上一篇文章介绍了Metabase透视表的开源PR,时间较早,基于Metabase V0.30版本的实现,而Metabase V0.33版本之后变化较大,所以如果在新版上实现PR中Metabase 复杂表头表格功能需要做改造。当然如果实力允许,你也可以按照自己的思路去实现。

效果呈现

talbedt 001

002

实现原理

数据结构

Metabase返回的数据结构,通过前端进行封装,版本之间会存在差别

frontend\src\metabase\meta\types\Dataset.js
export type DatasetData = {
  cols: Column[],//列信息
  columns: ColumnName[],//备注:新版本没有columns字段
  rows: Row[],//行信息
  rows_truncated?: number,
  requested_timezone?: string,
  results_timezone?: string,
};
summary01

新增的图表类型

由于Metabase组件化的代码,所以作者新增图表类型,不影响原来的功能和代码

frontend\src\metabase\visualizations\index.js
import SummaryTable from "./visualizations/SummaryTable";

registerVisualization(SummaryTable);
summary03

复杂表头图表设置项

const emptyStateSerialized: SummaryTableSettings = {
  groupsSources: [],
  columnsSource: [],
  valuesSources: [],
  unusedColumns: [],
  columnNameToMetadata: {},
};

行和列字段支持功能:

summary02

核心处理

在原有的table基础上进行的修改,主要添加了这个js实现计算汇总及后续处理

frontend\src\metabase\visualizations\lib\summary_table_datasetdata_builder.js
export const buildDatasetData = (//格式化数据集
  settings: SummaryTableSettings,
  mainResults: DatasetData,
  resultsProvider: ResultProvider,
): SummaryTableDatasetData => {
  const { columnsHeaders, cols, dimensions } = buildColumnHeaders(//生成列标题
    settings,
    mainResults,
  );
  const compressedColumnsHeaders = tryCompressColumnsHeaders(//压缩列标题处理
    settings,
    columnsHeaders,
  );
  const rowAssembler = getRowAssembler(columnsHeaders);//行数据装配

  const queryPlan = getQueryPlan(//生成合计
    settings,
    canTotalizeBuilder(mainResults.cols),
  );
  const rows = combineData(rowAssembler, queryPlan, settings, resultsProvider);//合并数据
  //生成列索引
  const columnIndexToFirstInGroupIndexes = buildColumnIndexToFirstInGroupIndexes(
    rows,
    settings,
  );
  //生成行索引
  const rowIndexesToColSpans = buildRowIndexesToColSpans(settings, rows, cols);

  return {
    columnsHeaders: compressedColumnsHeaders,
    cols,
    columns: cols.map(p => p.name),
    rows,
    columnIndexToFirstInGroupIndexes,
    isGrouped: columnIndex => columnIndex in columnIndexToFirstInGroupIndexes,
    rowIndexesToColSpans,
    dimensions,
  };
};

js组件(lodash)数据处理

Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖,像Jquery的一样,十分简洁,正是利用lodash实现数据的js处理。

    "lodash.flatmap": "^4.5.0",
    "lodash.get": "^4.1.2",
    "lodash.invert": "^4.3.0",
    "lodash.isequal": "^4.5.0",
    "lodash.mapkeys": "^4.6.0",
    "lodash.mapvalues": "^4.6.0",
    "lodash.orderby": "^4.6.0",
    "lodash.partition": "^4.6.0",
    "lodash.range": "^3.2.0",
    "lodash.set": "^4.1.2",
    "lodash.sortby": "^4.6.0",
    "lodash.unset": "^4.1.2",
    "lodash.values": "^4.3.0",
    "lodash.zip": "^4.2.0"

blog地址:https://dumplingbao.github.io/2020/02/27/metabase-bi-tabjx/

上一篇下一篇

猜你喜欢

热点阅读