提示

高阶转换是一些场景的集合,设计到的内容较为广泛。相当于综合运用 DataQL 各方面的能力。

生成 Tree 结构

DataQL 查询语句

  1. // 层次化:把带有 parent 属性的数据转换成 tree 结构
  2. // - 需要用到集合包的 filter 函数
  3. // - 实现思路是:递归
  4. import 'net.hasor.dataql.sdk.CollectionUdfSource' as collect;
  5.  
  6. var dataSet = [
  7. {'id': 1, 'parent_id':null, 'label' : 't1'},
  8. {'id': 2, 'parent_id':1 , 'label' : 't2'},
  9. {'id': 3, 'parent_id':1 , 'label' : 't3'},
  10. {'id': 4, 'parent_id':2 , 'label' : 't4'},
  11. {'id': 5, 'parent_id':null, 'label' : 't5'}
  12. ]
  13. var nodeFmt = (dat) -> {
  14. return dat => {
  15. "id",
  16. "label",
  17. "children" : collect.filter(dataSet, (test)-> { return (test.parent_id == dat.id); }) => [ nodeFmt(#) ]
  18. }
  19. }
  20. return collect.filter(dataSet, (test)-> { return (test.parent_id == null); }) => [ nodeFmt(#) ]

查询结果:

  1. [
  2. {
  3. "id":1,
  4. "label":"t1",
  5. "children":[
  6. {
  7. "id":2,
  8. "label":"t2",
  9. "children":[
  10. {
  11. "id":4,
  12. "label":"t4",
  13. "children":[]
  14. }
  15. ]
  16. },
  17. {
  18. "id":3,
  19. "label":"t3",
  20. "children":[]
  21. }
  22. ]
  23. },
  24. {
  25. "id":5,
  26. "label":"t5",
  27. "children":[]
  28. }
  29. ]

Tree 到 Tree 的变换

样本数据 ,对样本数据进行结构变化,变化后依然保留 Tree 结构。

DataQL 查询

  1. var fmt = (dat)-> {
  2. return {
  3. 'id' : dat.value,
  4. 'text' : dat.text,
  5. 'child' : dat.ChildNodes => [ fmt(#) ] }
  6. }
  7. return ${result} => [ fmt(#) ]

提示

${result} 是访问执行 DataQL 时程序传入的参数。

高维数组转为一维

  1. // 递归:利用有状态集合,把一个多维数组打平成为一维数组
  2. import 'net.hasor.dataql.sdk.CollectionUdfSource' as collect;
  3. var data = [
  4. [1,2,3,[4,5]],
  5. [6,7,8,9,0]
  6. ]
  7. var foo = (dat, arrayObj) -> {
  8. var tmpArray = dat => [ # ]; // 符号 '#' 相当于在循环 dat 数组期间的,当前元素。
  9. if (tmpArray[0] == dat) {
  10. run arrayObj.addLast(dat);// 末级元素直接加到最终的集合中,否则就继续遍历集合
  11. } else {
  12. run tmpArray => [ foo(#,arrayObj) ];
  13. }
  14. return arrayObj;
  15. }
  16. return foo(data,collect.new()).data();

查询结果

  1. [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ]

模拟 SQL 的 left join

有两个数据集 year2019year2018 通过 mapjoin 的方式将两个数据联合在一起,并计算同比

  1. hint MAX_DECIMAL_DIGITS = 4
  2. import "net.hasor.dataql.sdk.CollectionUdfSource" as collect
  3.  
  4. var year2019 = [
  5. { "pt":2019, "item_code":"code_1", "sum_price":2234 },
  6. { "pt":2019, "item_code":"code_2", "sum_price":234 },
  7. { "pt":2019, "item_code":"code_3", "sum_price":12340 },
  8. { "pt":2019, "item_code":"code_4", "sum_price":2344 }
  9. ];
  10.  
  11. var year2018 = [
  12. { "pt":2018, "item_code":"code_1", "sum_price":1234.0 },
  13. { "pt":2018, "item_code":"code_2", "sum_price":1234.0 },
  14. { "pt":2018, "item_code":"code_3", "sum_price":1234.0 },
  15. { "pt":2018, "item_code":"code_4", "sum_price":1234.0 }
  16. ];
  17.  
  18. // 求同比
  19. return collect.mapjoin(year2019,year2018, { "item_code":"item_code" }) => [
  20. {
  21. "商品Code": data1.item_code,
  22. "去年同期": data2.sum_price,
  23. "今年总额": data1.sum_price,
  24. "环比去年增长": ((data1.sum_price - data2.sum_price) / data2.sum_price * 100) + "%"
  25. }
  26. ]

查询执行结果

  1. [
  2. {
  3. "商品Code":"code_1",
  4. "去年同期":1234.0,
  5. "今年总额":2234,
  6. "环比去年增长":"81.04%"
  7. },
  8. {
  9. "商品Code":"code_2",
  10. "去年同期":1234.0,
  11. "今年总额":234,
  12. "环比去年增长":"-81.04%"
  13. },
  14. {
  15. "商品Code":"code_3",
  16. "去年同期":1234.0,
  17. "今年总额":12340,
  18. "环比去年增长":"900.0%"
  19. },
  20. {
  21. "商品Code":"code_4",
  22. "去年同期":1234.0,
  23. "今年总额":2344,
  24. "环比去年增长":"89.95%"
  25. }
  26. ]