• 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

  • 相关阅读:
    BlangenOA项目总结
    ==和Equals与值类型和引用类型
    SQL Server索引
    Html5 之拖动
    Html5 之过渡
    Html 之登录界面
    Html 之进度条
    GUI 之密码框
    GUI 之文本框
    GUI 之列表框
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/12328984.html
Copyright © 2020-2023  润新知