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`)
},
}
})
说明
以上是对于新版本的一些说明,其他变动最好参数官方文档