rollingWindowOperator.test.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. import { QueryObject, SqlaFormData, VizType } from '@superset-ui/core';
  20. import { rollingWindowOperator } from '@superset-ui/chart-controls';
  21. const formData: SqlaFormData = {
  22. metrics: [
  23. 'count(*)',
  24. { label: 'sum(val)', expressionType: 'SQL', sqlExpression: 'sum(val)' },
  25. ],
  26. time_range: '2015 : 2016',
  27. granularity: 'month',
  28. datasource: 'foo',
  29. viz_type: VizType.Table,
  30. };
  31. const queryObject: QueryObject = {
  32. metrics: [
  33. 'count(*)',
  34. { label: 'sum(val)', expressionType: 'SQL', sqlExpression: 'sum(val)' },
  35. ],
  36. time_range: '2015 : 2016',
  37. granularity: 'month',
  38. post_processing: [
  39. {
  40. operation: 'pivot',
  41. options: {
  42. index: ['__timestamp'],
  43. columns: ['nation'],
  44. aggregates: {
  45. 'count(*)': {
  46. operator: 'sum',
  47. },
  48. },
  49. },
  50. },
  51. ],
  52. };
  53. test('skip transformation', () => {
  54. expect(rollingWindowOperator(formData, queryObject)).toEqual(undefined);
  55. expect(
  56. rollingWindowOperator({ ...formData, rolling_type: 'None' }, queryObject),
  57. ).toEqual(undefined);
  58. expect(
  59. rollingWindowOperator({ ...formData, rolling_type: 'foobar' }, queryObject),
  60. ).toEqual(undefined);
  61. const formDataWithoutMetrics = { ...formData };
  62. delete formDataWithoutMetrics.metrics;
  63. expect(rollingWindowOperator(formDataWithoutMetrics, queryObject)).toEqual(
  64. undefined,
  65. );
  66. });
  67. test('rolling_type: cumsum', () => {
  68. expect(
  69. rollingWindowOperator({ ...formData, rolling_type: 'cumsum' }, queryObject),
  70. ).toEqual({
  71. operation: 'cum',
  72. options: {
  73. operator: 'sum',
  74. columns: {
  75. 'count(*)': 'count(*)',
  76. 'sum(val)': 'sum(val)',
  77. },
  78. },
  79. });
  80. });
  81. test('rolling_type: sum/mean/std', () => {
  82. const rollingTypes = ['sum', 'mean', 'std'];
  83. rollingTypes.forEach(rollingType => {
  84. expect(
  85. rollingWindowOperator(
  86. { ...formData, rolling_type: rollingType },
  87. queryObject,
  88. ),
  89. ).toEqual({
  90. operation: 'rolling',
  91. options: {
  92. rolling_type: rollingType,
  93. window: 1,
  94. min_periods: 0,
  95. columns: {
  96. 'count(*)': 'count(*)',
  97. 'sum(val)': 'sum(val)',
  98. },
  99. },
  100. });
  101. });
  102. });
  103. test('should append compared metrics when sets time compare type', () => {
  104. const comparisonTypes = ['values', 'difference', 'percentage', 'ratio'];
  105. comparisonTypes.forEach(cType => {
  106. expect(
  107. rollingWindowOperator(
  108. {
  109. ...formData,
  110. rolling_type: 'cumsum',
  111. comparison_type: cType,
  112. time_compare: ['1 year ago', '1 year later'],
  113. },
  114. queryObject,
  115. ),
  116. ).toEqual({
  117. operation: 'cum',
  118. options: {
  119. operator: 'sum',
  120. columns: {
  121. 'count(*)': 'count(*)',
  122. 'count(*)__1 year ago': 'count(*)__1 year ago',
  123. 'count(*)__1 year later': 'count(*)__1 year later',
  124. 'sum(val)': 'sum(val)',
  125. 'sum(val)__1 year ago': 'sum(val)__1 year ago',
  126. 'sum(val)__1 year later': 'sum(val)__1 year later',
  127. },
  128. },
  129. });
  130. });
  131. });