cube.js 动态编译问题

一般官方解决的动态编译使用asyncModule 但是asyncModule 有一些问题(对于join 处理有问题,这个是一个bug)

解决方法

  • 使用repositoryFactory
    不是很难,自己实现一个基于文件或者数据api的schemaFactory
  • 使用sqlAlias
    好处是cube 的名称就可以不用使用cube 动态编译的name了,join 的时候直接使用就可以了,是一个比较简单的方法
 
const { transformDimensions, transformJoins, transformMeasures, convertStringPropToFunction } = require("./utils")
asyncModule(async () => {
  const dynamicCubes = [
    {
    "name": "payments",
    "sqlAlias": `payments`,
     "sql": "SELECT * FROM public."payments"",
     "dataSource": "default",
     "joins": {
       "demoapp": {
         "relationship": `belongsTo`,
         "sql": "payments.__id = demoapp.__id"
       }
     },
     "measures": {
       "count": {
         "sql": "COUNT(DISTINCT "payments".__id)",
         "type": "number"
       },
       "total": {
         "sql": ""payments"."total"",
         "type": "sum"
       }
     },
     "dimensions": {
       "__id": {
         "sql": "__id",
         "type": "string",
         "primaryKey": true
       },
       "name": {
         "sql": ""payments"."name"",
         "type": "string"
       }
     }
   }, 
   {
      "name": "demoapp",
      "sqlAlias": `demoapp`,
      "sql": "SELECT * FROM public."demoapp"",
     "dataSource": "default",
     "joins": {
       "demoapp": {
         "relationship": `belongsTo`,
         "sql": "payments.__id = demoapp.__id"
       }
     },
     "measures": {
       "count": {
         "sql": "COUNT(DISTINCT "payments".__id)",
         "type": "number"
       }
     },
     "dimensions": {
       "__id": {
         "sql": "__id",
         "type": "string",
         "primaryKey": true
       },
       "name": {
         "sql": ""payments"."name"",
         "type": "string"
       }
     }
 }
 ]
  dynamicCubes.forEach((dynamicCube) => {
    const dimensions = transformDimensions(dynamicCube.dimensions);
    const measures = transformMeasures(dynamicCube.measures);
    const joins = transformJoins(dynamicCube.joins);
    cube(dynamicCube.name, {
      sql: dynamicCube.sql,
      dimensions,
      measures,
      joins
    });
  });
}
)
  • 使用require 引用schema js 文件模式
    可以导出cube.js的schema 为一个cmd 的模块就可以了
 
module.exports = {
  sql: ()=> `SELECT * FROM sf100000.call_center`,
  joins: {
 
  },
  measures: {
    count2: {
      type: `count`
    }
  },
 
  dimensions: {
    ccCallCenterId: {
      sql: ()=>`cc_call_center_id`,
      type: `string`
    },
 
    ccName: {
      sql: ()=>`cc_name`,
      type: `string`
    }
  },
 
  dataSource: `default`
};

参考资料

https://cube.dev/docs/cube#parameters-sql-alias
https://cube.dev/docs/schema/dynamic-schema-creation
https://github.com/cube-js/cube.js/issues/1880

原文地址:https://www.cnblogs.com/rongfengliang/p/14664568.html