cube.js schema 学习二

Posted rongfengliang-荣锋亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cube.js schema 学习二相关的知识,希望对你有一定的参考价值。

cube.js 从那发布,到现在也已经有了很大的变动了,比如多租户,多数据源的支持,同时schema 也有了好多新的
类型支持,以下是基于新版本的一个学习

通用格式参考

 
cube(`Users`, {
  sql: `select * from users`,
?
  joins: {
    Organizations: {
      relationship: `belongsTo`,
      sql: `${Users}.organization_id = ${Organizations}.id`
    }
  },
?
  measures: {
    count: {
      type: `count`,
      sql: `id`
    }
  },
?
  dimensions: {
    createdAt: {
      type: `time`,
      sql: `created_at`
    },
?
    country: {
      type: `string`,
      sql: `country`
    }
  }
});
 
 

命名

cube.js 包含了一些规则,你只能使用数字0-9,_ 以及字母,当命名的时候必须一字母开头
作为一个约定cube 命名的开头是大写字母,同时元素的命名以小写字母,与js 一样,驼峰
命名法用与多词cube 以及成员命名

参数

  • sql
    sql 主要用来生成cube 查询的表,它可以是任何正确的sql 查询,但是通常是select * from my_table
    必须注意in不需要定义group by 在cube 的sql 查询上,此查询应能改是一个普通的表,不包含聚合操作
    参考
 
cube(`Orders`, {
  sql: `SELECT * FROM orders`
});
 
 

同时你也可以引用其他cube 的sql 查询,方便代码的复用

cube(`Companies`, {
  sql: `SELECT users.company_name, users.company_id FROM ${Users.sql()} AS users`
});
  • title
    主要是为了方便cube 的显示,默认cube.js 或做一些处理,方便人员查看,但是如果无法自动处理的
    时候,可以通过title 定义
 
cube(`Orders`, {
  sql: `SELECT * FROM orders`,
?
  title: `Product Orders`,
});
 
 
  • description
    主要是为了团队可以更好的理解cube 的意思
 
cube(`Orders`, {
  sql: `SELECT * FROM orders`,
?
  title: `Product Orders`,
  description: `All orders related information`,
});
 
  • extends
    类似代码的几类,实现整个cube 的复用
 
cube(`OrderFacts`, {
  sql: `SELECT * FROM orders`
?
  measures: {
    count: {
      type: `count`,
      sql: `id`
    }
  }
});
?
cube(`ExtendedOrderFacts`, {
  extends: OrderFacts,
?
  measures: {
    doubleCount: {
      type: `number`,
      sql: `${count} * 2`
    }
  }
});
  • refreshKey
    主要用来处理cube 的cache 策略
    默认包含一些规则
    如果未使用任何预聚合,请检查使用的预聚合以进行查询并使用预聚合refreshKey。
    如果名称不存在,请检查max时间维度的updated…
    检查max任何现有时间维度的,如果不存在…
    检查此多维数据集的行数。
    默认数据对于rdbms 为10s,大数据为2分钟
    同时我们可以自定自己的策略,比如使用表中的时间戳,但是请确保使用最大的
    同时我们也可以使用基于间隔的比如人 second,minute,hourr,day,week,实际上refreshKey
    只是sql 的语法糖,我们可以自定义自己的函数
  • dataSource
    dataSource 是cube 对于多数据源支持的一个最好说明,我们可以自定义自己的数据源,同时此参数
    会被传递给``dbtype以及driveFacotory 函数,作为上下文参数,默认为default
  • sqlAlias
    使用sqlAlias 可以避免过长的名称
 
cube(`OrderFacts`, {
  sql: `SELECT * FROM orders`,
?
  sqlAlias: `ofacts`,
?
  // ...
});

上下文参数

  • Filter Params
    FILTER_PARAMS 允许你在生成sql 的时候使用filter 的值
    结构
 
FILTER_PARAMS.<CUBE_NAME>.<FILTER_NAME>.filter(expression)
 

filter 函数可以接受的表达式为字符串,或者函数,参考

cube(`OrderFacts`, {
  sql: `SELECT * FROM orders WHERE ${FILTER_PARAMS.OrderFacts.date.filter(‘date‘)}`,
?
  measures: {
    count: {
      type: `count`
    }
  },
?
  dimensions: {
    date: {
      sql: `date`,
      type: `time`
    }
  }
});
 
 

对于以下的参数,会生成如下的sql


{
  measures: [‘OrderFacts.count‘],
  timeDimensions: [{
    dimension: ‘OrderFacts.date‘,
    granularity: ‘day‘,
    dateRange: [‘2018-01-01‘, ‘2018-12-31‘]
  }]
}
 
 

sql

SELECT * FROM orders WHERE date >= ‘2018-01-01 00:00:00‘ and date <= ‘2018-12-31 23:59:59‘

User Context

用户上下文,主要是cube.js 的安全模型,方便传递用户信息到cube.js 中
参考

 
cube(`Orders`, {
  sql: `SELECT * FROM orders WHERE ${USER_CONTEXT.email.filter(‘email‘)}`,
?
  dimensions: {
    date: {
      sql: `date`,
      type: `time`
    }
  }
});
 

过滤order表中email 为用户上下文的

非安全值

使用此方法,可能会有sql 注入的问题,必须慎重
参考

 
cube(`Orders`, {
  sql: `SELECT * FROM ${USER_CONTEXT.type.unsafeValue() === ‘employee‘ ? ‘employee‘ : ‘public‘}.orders`,
?
  dimensions: {
    date: {
      sql: `date`,
      type: `time`
    }
  }
});

sql 工具类

  • convertTz
    主要是方便时区的转换,将时间转换为用户请求的时区格式
    参考
 
cube(`visitors`, {
  // ...
?
  dimensions: {
    createdAtConverted: {
      type: ‘time‘,
      sql: SQL_UTILS.convertTz(`created_at`)
    },
  }
})

说明

以上是对于新版本的一些说明,其他变动最好参数官方文档

参考资料

https://cube.dev/docs/cube#parameters-description

以上是关于cube.js schema 学习二的主要内容,如果未能解决你的问题,请参考以下文章

cube.js 学习简单项目创建

cube.js 学习cube.js joins 说明

cube.js 最近版本的一般更新

cube.js 学习cube.js segments 说明

cube.js 学习cube.js type 以及format 说明

cube.js 学习cube 的pre-aggregation