@quillsql/react 2.13.35 → 2.13.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/cjs/Chart.d.ts +0 -1
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +17 -14
  4. package/dist/cjs/ChartBuilder.d.ts +1 -0
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +178 -96
  7. package/dist/cjs/Context.d.ts.map +1 -1
  8. package/dist/cjs/Context.js +6 -8
  9. package/dist/cjs/Dashboard.d.ts +2 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +18 -8
  12. package/dist/cjs/ReportBuilder.d.ts +2 -0
  13. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  14. package/dist/cjs/ReportBuilder.js +398 -271
  15. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  16. package/dist/cjs/SQLEditor.js +33 -11
  17. package/dist/cjs/Table.d.ts.map +1 -1
  18. package/dist/cjs/Table.js +17 -1
  19. package/dist/cjs/components/Chart/InternalChart.d.ts +0 -1
  20. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  21. package/dist/cjs/components/Chart/InternalChart.js +6 -7
  22. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  23. package/dist/cjs/components/Dashboard/DataLoader.js +75 -30
  24. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +1 -1
  25. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  26. package/dist/cjs/components/Dashboard/MetricComponent.js +98 -106
  27. package/dist/cjs/components/QuillMultiSelectSectionList.d.ts.map +1 -1
  28. package/dist/cjs/components/QuillMultiSelectSectionList.js +21 -16
  29. package/dist/cjs/components/QuillMultiSelectWithCombo.js +18 -8
  30. package/dist/cjs/components/QuillSelectWithCombo.js +17 -7
  31. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +1 -1
  32. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  33. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +2 -2
  34. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +16 -4
  35. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  36. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +9 -18
  37. package/dist/cjs/components/UiComponents.d.ts +2 -1
  38. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  39. package/dist/cjs/components/UiComponents.js +44 -28
  40. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  41. package/dist/cjs/hooks/useAskQuill.js +28 -4
  42. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  43. package/dist/cjs/hooks/useQuill.js +9 -1
  44. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  45. package/dist/cjs/hooks/useVirtualTables.js +11 -35
  46. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  47. package/dist/cjs/internals/ReportBuilder/PivotForm.js +14 -2
  48. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +12 -11
  49. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  50. package/dist/cjs/internals/ReportBuilder/PivotModal.js +63 -18
  51. package/dist/cjs/models/Client.d.ts +4 -5
  52. package/dist/cjs/models/Client.d.ts.map +1 -1
  53. package/dist/cjs/models/Pivot.d.ts +10 -0
  54. package/dist/cjs/models/Pivot.d.ts.map +1 -1
  55. package/dist/cjs/models/Report.d.ts +13 -1
  56. package/dist/cjs/models/Report.d.ts.map +1 -1
  57. package/dist/cjs/utils/astFilterProcessing.d.ts +1 -1
  58. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  59. package/dist/cjs/utils/astFilterProcessing.js +799 -64
  60. package/dist/cjs/utils/astProcessing.d.ts +4 -1
  61. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  62. package/dist/cjs/utils/astProcessing.js +2 -2
  63. package/dist/cjs/utils/client.d.ts.map +1 -1
  64. package/dist/cjs/utils/client.js +6 -3
  65. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  66. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  67. package/dist/cjs/utils/columnProcessing.js +1 -0
  68. package/dist/cjs/utils/dashboard.d.ts +2 -1
  69. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  70. package/dist/cjs/utils/dashboard.js +38 -10
  71. package/dist/cjs/utils/filterProcessing.d.ts +1 -1
  72. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  73. package/dist/cjs/utils/merge.d.ts +16 -0
  74. package/dist/cjs/utils/merge.d.ts.map +1 -1
  75. package/dist/cjs/utils/merge.js +210 -0
  76. package/dist/cjs/utils/paginationProcessing.d.ts +1 -1
  77. package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -1
  78. package/dist/cjs/utils/paginationProcessing.js +3 -2
  79. package/dist/cjs/utils/pivotConstructor.d.ts +19 -9
  80. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  81. package/dist/cjs/utils/pivotConstructor.js +90 -34
  82. package/dist/cjs/utils/queryConstructor.d.ts +8 -1
  83. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  84. package/dist/cjs/utils/queryConstructor.js +276 -310
  85. package/dist/cjs/utils/report.d.ts +25 -12
  86. package/dist/cjs/utils/report.d.ts.map +1 -1
  87. package/dist/cjs/utils/report.js +13 -7
  88. package/dist/cjs/utils/schema.d.ts +1 -1
  89. package/dist/cjs/utils/schema.d.ts.map +1 -1
  90. package/dist/cjs/utils/schema.js +3 -32
  91. package/dist/cjs/utils/tableProcessing.d.ts +43 -13
  92. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  93. package/dist/cjs/utils/tableProcessing.js +140 -75
  94. package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
  95. package/dist/cjs/utils/textProcessing.js +10 -1
  96. package/dist/cjs/utils/valueFormatter.d.ts +2 -1
  97. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  98. package/dist/cjs/utils/valueFormatter.js +18 -14
  99. package/dist/esm/Chart.d.ts +0 -1
  100. package/dist/esm/Chart.d.ts.map +1 -1
  101. package/dist/esm/Chart.js +0 -6
  102. package/dist/esm/ChartBuilder.d.ts +1 -0
  103. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  104. package/dist/esm/ChartBuilder.js +179 -97
  105. package/dist/esm/Context.d.ts.map +1 -1
  106. package/dist/esm/Context.js +7 -9
  107. package/dist/esm/Dashboard.d.ts +2 -1
  108. package/dist/esm/Dashboard.d.ts.map +1 -1
  109. package/dist/esm/Dashboard.js +1 -1
  110. package/dist/esm/ReportBuilder.d.ts +2 -0
  111. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  112. package/dist/esm/ReportBuilder.js +399 -272
  113. package/dist/esm/SQLEditor.d.ts.map +1 -1
  114. package/dist/esm/SQLEditor.js +33 -11
  115. package/dist/esm/Table.d.ts.map +1 -1
  116. package/dist/esm/Table.js +17 -1
  117. package/dist/esm/components/Chart/InternalChart.d.ts +0 -1
  118. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  119. package/dist/esm/components/Chart/InternalChart.js +6 -6
  120. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  121. package/dist/esm/components/Dashboard/DataLoader.js +75 -30
  122. package/dist/esm/components/Dashboard/MetricComponent.d.ts +1 -1
  123. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  124. package/dist/esm/components/Dashboard/MetricComponent.js +98 -106
  125. package/dist/esm/components/QuillMultiSelectSectionList.d.ts.map +1 -1
  126. package/dist/esm/components/QuillMultiSelectSectionList.js +5 -12
  127. package/dist/esm/components/QuillMultiSelectWithCombo.js +1 -1
  128. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +1 -1
  129. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  130. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -2
  131. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +16 -4
  132. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  133. package/dist/esm/components/ReportBuilder/AddSortPopover.js +9 -18
  134. package/dist/esm/components/UiComponents.d.ts +2 -1
  135. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  136. package/dist/esm/components/UiComponents.js +27 -21
  137. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  138. package/dist/esm/hooks/useAskQuill.js +28 -4
  139. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  140. package/dist/esm/hooks/useQuill.js +10 -2
  141. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  142. package/dist/esm/hooks/useVirtualTables.js +12 -36
  143. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  144. package/dist/esm/internals/ReportBuilder/PivotForm.js +14 -2
  145. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +12 -11
  146. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  147. package/dist/esm/internals/ReportBuilder/PivotModal.js +63 -18
  148. package/dist/esm/models/Client.d.ts +4 -5
  149. package/dist/esm/models/Client.d.ts.map +1 -1
  150. package/dist/esm/models/Pivot.d.ts +10 -0
  151. package/dist/esm/models/Pivot.d.ts.map +1 -1
  152. package/dist/esm/models/Report.d.ts +13 -1
  153. package/dist/esm/models/Report.d.ts.map +1 -1
  154. package/dist/esm/utils/astFilterProcessing.d.ts +1 -1
  155. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  156. package/dist/esm/utils/astFilterProcessing.js +799 -64
  157. package/dist/esm/utils/astProcessing.d.ts +4 -1
  158. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  159. package/dist/esm/utils/astProcessing.js +2 -2
  160. package/dist/esm/utils/client.d.ts.map +1 -1
  161. package/dist/esm/utils/client.js +6 -3
  162. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  163. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  164. package/dist/esm/utils/columnProcessing.js +1 -1
  165. package/dist/esm/utils/dashboard.d.ts +2 -1
  166. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  167. package/dist/esm/utils/dashboard.js +39 -11
  168. package/dist/esm/utils/filterProcessing.d.ts +1 -1
  169. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  170. package/dist/esm/utils/merge.d.ts +16 -0
  171. package/dist/esm/utils/merge.d.ts.map +1 -1
  172. package/dist/esm/utils/merge.js +207 -0
  173. package/dist/esm/utils/paginationProcessing.d.ts +1 -1
  174. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -1
  175. package/dist/esm/utils/paginationProcessing.js +3 -2
  176. package/dist/esm/utils/pivotConstructor.d.ts +19 -9
  177. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  178. package/dist/esm/utils/pivotConstructor.js +91 -35
  179. package/dist/esm/utils/queryConstructor.d.ts +8 -1
  180. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  181. package/dist/esm/utils/queryConstructor.js +274 -314
  182. package/dist/esm/utils/report.d.ts +25 -12
  183. package/dist/esm/utils/report.d.ts.map +1 -1
  184. package/dist/esm/utils/report.js +13 -7
  185. package/dist/esm/utils/schema.d.ts +1 -1
  186. package/dist/esm/utils/schema.d.ts.map +1 -1
  187. package/dist/esm/utils/schema.js +1 -30
  188. package/dist/esm/utils/tableProcessing.d.ts +43 -13
  189. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  190. package/dist/esm/utils/tableProcessing.js +140 -75
  191. package/dist/esm/utils/textProcessing.d.ts.map +1 -1
  192. package/dist/esm/utils/textProcessing.js +10 -1
  193. package/dist/esm/utils/valueFormatter.d.ts +2 -1
  194. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  195. package/dist/esm/utils/valueFormatter.js +18 -14
  196. package/package.json +1 -1
@@ -608,7 +608,8 @@ const queryPatterns = [
608
608
  },
609
609
  unit: function (astWhere) {
610
610
  return (astWhere.right?.args?.value[0]?.column?.expr?.value?.toLowerCase() ??
611
- astWhere.right?.args?.value[0]?.column.toLowerCase() ??
611
+ astWhere.right?.args?.value[0]?.column?.toLowerCase() ??
612
+ astWhere.right?.args?.value[0]?.value?.toLowerCase() ??
612
613
  null);
613
614
  },
614
615
  ast: {
@@ -720,7 +721,7 @@ const queryPatterns = [
720
721
  if (unit === '') {
721
722
  return stripTimeS(astWhere.left?.right?.right?.expr?.value
722
723
  ?.split(' ')[1]
723
- .toLowerCase());
724
+ ?.toLowerCase());
724
725
  }
725
726
  else {
726
727
  return unit;
@@ -3028,6 +3029,114 @@ const queryPatterns = [
3028
3029
  },
3029
3030
  },
3030
3031
  ],
3032
+ mssql: [
3033
+ {
3034
+ query: `
3035
+ SELECT * FROM transactions
3036
+ WHERE transaction_date >= DATEADD(DAY, -90, GETDATE())
3037
+ `,
3038
+ value: function (astWhere) {
3039
+ return astWhere.right?.args?.value[1]?.value
3040
+ ? -astWhere.right?.args?.value[1]?.value
3041
+ : null;
3042
+ },
3043
+ unit: function (astWhere) {
3044
+ return (astWhere.right?.args?.value[0]?.column?.toLowerCase() ?? null);
3045
+ },
3046
+ ast: {
3047
+ with: null,
3048
+ type: 'select',
3049
+ options: null,
3050
+ distinct: null,
3051
+ columns: [
3052
+ {
3053
+ expr: {
3054
+ type: 'column_ref',
3055
+ table: null,
3056
+ column: '*',
3057
+ },
3058
+ as: null,
3059
+ },
3060
+ ],
3061
+ into: {
3062
+ position: null,
3063
+ },
3064
+ from: [
3065
+ {
3066
+ db: null,
3067
+ table: 'transactions',
3068
+ as: null,
3069
+ table_hint: null,
3070
+ temporal_table: null,
3071
+ operator: null,
3072
+ },
3073
+ ],
3074
+ for: null,
3075
+ where: {
3076
+ type: 'binary_expr',
3077
+ operator: '>=',
3078
+ left: {
3079
+ type: 'column_ref',
3080
+ table: null,
3081
+ db: null,
3082
+ schema: null,
3083
+ column: 'transaction_date',
3084
+ collate: null,
3085
+ },
3086
+ right: {
3087
+ type: 'function',
3088
+ name: {
3089
+ name: [
3090
+ {
3091
+ type: 'default',
3092
+ value: 'DATEADD',
3093
+ },
3094
+ ],
3095
+ },
3096
+ args: {
3097
+ type: 'expr_list',
3098
+ value: [
3099
+ {
3100
+ type: 'column_ref',
3101
+ table: null,
3102
+ db: null,
3103
+ schema: null,
3104
+ column: 'DAY',
3105
+ collate: null,
3106
+ },
3107
+ {
3108
+ type: 'number',
3109
+ value: -90,
3110
+ },
3111
+ {
3112
+ type: 'function',
3113
+ name: {
3114
+ name: [
3115
+ {
3116
+ type: 'default',
3117
+ value: 'GETDATE',
3118
+ },
3119
+ ],
3120
+ },
3121
+ args: {
3122
+ type: 'expr_list',
3123
+ value: [],
3124
+ },
3125
+ over: null,
3126
+ },
3127
+ ],
3128
+ },
3129
+ over: null,
3130
+ },
3131
+ },
3132
+ groupby: null,
3133
+ having: null,
3134
+ top: null,
3135
+ orderby: null,
3136
+ limit: null,
3137
+ },
3138
+ },
3139
+ ],
3031
3140
  },
3032
3141
  },
3033
3142
  {
@@ -5954,6 +6063,133 @@ const queryPatterns = [
5954
6063
  },
5955
6064
  },
5956
6065
  ],
6066
+ mssql: [
6067
+ {
6068
+ query: `
6069
+ SELECT * FROM transactions
6070
+ WHERE DATETRUNC(MONTH, transaction_date) = DATETRUNC(MONTH, GETDATE());
6071
+ `,
6072
+ value: function () {
6073
+ return 0;
6074
+ },
6075
+ unit: function (astWhere) {
6076
+ return astWhere.left?.args?.value[0]?.column ?? null;
6077
+ },
6078
+ ast: {
6079
+ with: null,
6080
+ type: 'select',
6081
+ options: null,
6082
+ distinct: null,
6083
+ columns: [
6084
+ {
6085
+ expr: {
6086
+ type: 'column_ref',
6087
+ table: null,
6088
+ column: '*',
6089
+ },
6090
+ as: null,
6091
+ },
6092
+ ],
6093
+ into: {
6094
+ position: null,
6095
+ },
6096
+ from: [
6097
+ {
6098
+ db: null,
6099
+ table: 'transactions',
6100
+ as: null,
6101
+ table_hint: null,
6102
+ temporal_table: null,
6103
+ operator: null,
6104
+ },
6105
+ ],
6106
+ for: null,
6107
+ where: {
6108
+ type: 'binary_expr',
6109
+ operator: '=',
6110
+ left: {
6111
+ type: 'function',
6112
+ name: {
6113
+ name: [
6114
+ {
6115
+ type: 'default',
6116
+ value: 'DATETRUNC',
6117
+ },
6118
+ ],
6119
+ },
6120
+ args: {
6121
+ type: 'expr_list',
6122
+ value: [
6123
+ {
6124
+ type: 'column_ref',
6125
+ table: null,
6126
+ db: null,
6127
+ schema: null,
6128
+ column: 'MONTH',
6129
+ collate: null,
6130
+ },
6131
+ {
6132
+ type: 'column_ref',
6133
+ table: null,
6134
+ db: null,
6135
+ schema: null,
6136
+ column: 'transaction_date',
6137
+ collate: null,
6138
+ },
6139
+ ],
6140
+ },
6141
+ over: null,
6142
+ },
6143
+ right: {
6144
+ type: 'function',
6145
+ name: {
6146
+ name: [
6147
+ {
6148
+ type: 'default',
6149
+ value: 'DATETRUNC',
6150
+ },
6151
+ ],
6152
+ },
6153
+ args: {
6154
+ type: 'expr_list',
6155
+ value: [
6156
+ {
6157
+ type: 'column_ref',
6158
+ table: null,
6159
+ db: null,
6160
+ schema: null,
6161
+ column: 'MONTH',
6162
+ collate: null,
6163
+ },
6164
+ {
6165
+ type: 'function',
6166
+ name: {
6167
+ name: [
6168
+ {
6169
+ type: 'default',
6170
+ value: 'GETDATE',
6171
+ },
6172
+ ],
6173
+ },
6174
+ args: {
6175
+ type: 'expr_list',
6176
+ value: [],
6177
+ },
6178
+ over: null,
6179
+ },
6180
+ ],
6181
+ },
6182
+ over: null,
6183
+ },
6184
+ },
6185
+ groupby: null,
6186
+ having: null,
6187
+ top: null,
6188
+ orderby: null,
6189
+ limit: null,
6190
+ },
6191
+ },
6192
+ ],
5957
6193
  },
5958
6194
  },
5959
6195
  {
@@ -7618,57 +7854,263 @@ const queryPatterns = [
7618
7854
  },
7619
7855
  },
7620
7856
  ],
7621
- },
7622
- },
7623
- ];
7624
- /**
7625
- * A function generator for functions that checks whether an ast pattern (testWhere) is
7626
- * equivalent to a predetermined ast pattern (where)
7627
- */
7628
- function generateWhereChecker(astWhere) {
7629
- function generateCheckFunction(where) {
7630
- let resultString = `testWhere.type === '${where.type}'`;
7631
- function recurseNode(node, testWhereNode) {
7632
- switch (node.type) {
7633
- case 'binary_expr':
7634
- resultString = resultString.concat(` && (!${testWhereNode}.operator || ${testWhereNode}.operator === '${node.operator}' || (['<=', '<'].includes(${testWhereNode}.operator) && ['<=', '<'].includes('${node.operator}')) || (['>=', '>'].includes(${testWhereNode}.operator) && ['>=', '>'].includes('${node.operator}')))`);
7635
- resultString = resultString.concat(` && (!${testWhereNode}?.left?.type || ${testWhereNode}?.left?.type === '${node.left.type}' || (['column_ref', 'double_quote_string', 'single_quote_string'].includes(${testWhereNode}?.left?.type) && ['column_ref', 'double_quote_string', 'single_quote_string'].includes('${node.left.type}')))`);
7636
- resultString = resultString.concat(` && (!${testWhereNode}?.right?.type || ${testWhereNode}?.right?.type === '${node.right.type}' || (['column_ref', 'double_quote_string', 'single_quote_string'].includes(${testWhereNode}?.right?.type) && ['column_ref', 'double_quote_string', 'single_quote_string'].includes('${node.right.type}')))`);
7637
- if (node.operator === 'AND' &&
7638
- node.left?.left?.type !== 'extract' &&
7639
- !(node.left?.left?.type === 'function' &&
7640
- ['hour', 'day', 'week', 'month', 'year'].includes(node.left?.left?.name?.name?.[0]?.value?.toLowerCase()))) {
7641
- recurseNode(node.left, testWhereNode.concat(`?.left`));
7642
- }
7643
- recurseNode(node.right, testWhereNode.concat(`?.right`));
7644
- break;
7645
- case 'function':
7646
- if (node?.name && typeof node.name === 'string') {
7647
- resultString = resultString.concat(` && (${testWhereNode}?.name?.toLowerCase() === '${node.name.toLowerCase()} ` +
7648
- `|| (['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes(${testWhereNode}?.name)) ` +
7649
- `&& ['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes('${node.name}')) ` +
7650
- `|| (['year', 'month', 'quarter', 'day', 'week', 'hour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
7651
- `&& ['year', 'month', 'quarter', 'day', 'week', 'hour'].includes('${node.name.toLowerCase()}')) ` +
7652
- `|| (['toyear', 'tomonth', 'toquarter', 'tohour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
7653
- `&& ['toyear', 'tomonth', 'toquarter', 'tohour'].includes('${node.name.toLowerCase()}')) ` +
7654
- `|| (['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
7655
- `&& ['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes('${node.name.toLowerCase()}'))` +
7656
- `|| (['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
7657
- `&& ['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes('${node.name.toLowerCase()}')) ` +
7658
- `|| (['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
7659
- `&& ['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes('${node.name.toLowerCase()}')))`);
7660
- }
7661
- else if (node?.name?.name?.length > 0) {
7662
- resultString = resultString.concat(` && (${testWhereNode}?.name?.name[0]?.value === '${node.name.name[0].value}' ` +
7663
- `|| (['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes(${testWhereNode}?.name?.name[0]?.value) ` +
7664
- `&& ['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes('${node.name.name[0].value}')) ` +
7665
- `|| (['year', 'month', 'quarter', 'day', 'week', 'hour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7666
- `&& ['year', 'month', 'quarter', 'day', 'week', 'hour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
7667
- `|| (['toyear', 'tomonth', 'toquarter', 'tohour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7668
- `&& ['toyear', 'tomonth', 'toquarter', 'tohour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
7669
- `|| (['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7670
- `&& ['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
7671
- `|| (['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7857
+ mssql: [
7858
+ {
7859
+ query: `
7860
+ SELECT * FROM transactions
7861
+ WHERE transaction_date >= DATEADD(YEAR, -2, GETDATE())
7862
+ AND transaction_date < DATEADD(YEAR, -1, GETDATE());
7863
+ `,
7864
+ value: function (astWhere) {
7865
+ if (astWhere.right.operator === 'AND') {
7866
+ // Avoid AND chains
7867
+ return -1;
7868
+ }
7869
+ const operatorLeft = astWhere.left.operator;
7870
+ const operatorRight = astWhere.right.operator;
7871
+ const valueLeft = astWhere.left.right?.args?.value[1]?.value
7872
+ ? -astWhere.left.right?.args?.value[1]?.value
7873
+ : null;
7874
+ const valueRight = astWhere.right.right?.args?.value[1]?.value
7875
+ ? -astWhere.right.right?.args?.value[1]?.value
7876
+ : null;
7877
+ if (!valueLeft || !valueRight) {
7878
+ return null;
7879
+ }
7880
+ if (operatorLeft === '>=' &&
7881
+ operatorRight === '<' &&
7882
+ valueLeft == valueRight * 2) {
7883
+ return valueRight;
7884
+ }
7885
+ else if (operatorLeft === '<' &&
7886
+ operatorRight === '>=' &&
7887
+ valueLeft * 2 == valueRight) {
7888
+ return valueLeft;
7889
+ }
7890
+ else {
7891
+ const unitLeft = astWhere.left?.right?.args?.value[0]?.column?.toLowerCase() ??
7892
+ null;
7893
+ const unitRight = astWhere.right?.right?.args?.value[0]?.column?.toLowerCase() ??
7894
+ null;
7895
+ return parseStartEndDate(operatorLeft, operatorRight, valueLeft, valueRight, stripTimeS(unitLeft.toLowerCase()), stripTimeS(unitRight.toLowerCase()));
7896
+ }
7897
+ },
7898
+ unit: function (astWhere) {
7899
+ const unitLeft = astWhere.left?.right?.args?.value[0]?.column?.toLowerCase() ??
7900
+ null;
7901
+ const unitRight = astWhere.right?.right?.args?.value[0]?.column?.toLowerCase() ??
7902
+ null;
7903
+ return stripTimeS(unitLeft.toLowerCase()) ===
7904
+ stripTimeS(unitRight.toLowerCase())
7905
+ ? stripTimeS(unitLeft.toLowerCase())
7906
+ : null;
7907
+ },
7908
+ ast: {
7909
+ with: null,
7910
+ type: 'select',
7911
+ options: null,
7912
+ distinct: null,
7913
+ columns: [
7914
+ {
7915
+ expr: {
7916
+ type: 'column_ref',
7917
+ table: null,
7918
+ column: '*',
7919
+ },
7920
+ as: null,
7921
+ },
7922
+ ],
7923
+ into: {
7924
+ position: null,
7925
+ },
7926
+ from: [
7927
+ {
7928
+ db: null,
7929
+ table: 'transactions',
7930
+ as: null,
7931
+ table_hint: null,
7932
+ temporal_table: null,
7933
+ operator: null,
7934
+ },
7935
+ ],
7936
+ for: null,
7937
+ where: {
7938
+ type: 'binary_expr',
7939
+ operator: 'AND',
7940
+ left: {
7941
+ type: 'binary_expr',
7942
+ operator: '>=',
7943
+ left: {
7944
+ type: 'column_ref',
7945
+ table: null,
7946
+ db: null,
7947
+ schema: null,
7948
+ column: 'transaction_date',
7949
+ collate: null,
7950
+ },
7951
+ right: {
7952
+ type: 'function',
7953
+ name: {
7954
+ name: [
7955
+ {
7956
+ type: 'default',
7957
+ value: 'DATEADD',
7958
+ },
7959
+ ],
7960
+ },
7961
+ args: {
7962
+ type: 'expr_list',
7963
+ value: [
7964
+ {
7965
+ type: 'column_ref',
7966
+ table: null,
7967
+ db: null,
7968
+ schema: null,
7969
+ column: 'YEAR',
7970
+ collate: null,
7971
+ },
7972
+ {
7973
+ type: 'number',
7974
+ value: -2,
7975
+ },
7976
+ {
7977
+ type: 'function',
7978
+ name: {
7979
+ name: [
7980
+ {
7981
+ type: 'default',
7982
+ value: 'GETDATE',
7983
+ },
7984
+ ],
7985
+ },
7986
+ args: {
7987
+ type: 'expr_list',
7988
+ value: [],
7989
+ },
7990
+ over: null,
7991
+ },
7992
+ ],
7993
+ },
7994
+ over: null,
7995
+ },
7996
+ },
7997
+ right: {
7998
+ type: 'binary_expr',
7999
+ operator: '<',
8000
+ left: {
8001
+ type: 'column_ref',
8002
+ table: null,
8003
+ db: null,
8004
+ schema: null,
8005
+ column: 'transaction_date',
8006
+ collate: null,
8007
+ },
8008
+ right: {
8009
+ type: 'function',
8010
+ name: {
8011
+ name: [
8012
+ {
8013
+ type: 'default',
8014
+ value: 'DATEADD',
8015
+ },
8016
+ ],
8017
+ },
8018
+ args: {
8019
+ type: 'expr_list',
8020
+ value: [
8021
+ {
8022
+ type: 'column_ref',
8023
+ table: null,
8024
+ db: null,
8025
+ schema: null,
8026
+ column: 'YEAR',
8027
+ collate: null,
8028
+ },
8029
+ {
8030
+ type: 'number',
8031
+ value: -1,
8032
+ },
8033
+ {
8034
+ type: 'function',
8035
+ name: {
8036
+ name: [
8037
+ {
8038
+ type: 'default',
8039
+ value: 'GETDATE',
8040
+ },
8041
+ ],
8042
+ },
8043
+ args: {
8044
+ type: 'expr_list',
8045
+ value: [],
8046
+ },
8047
+ over: null,
8048
+ },
8049
+ ],
8050
+ },
8051
+ over: null,
8052
+ },
8053
+ },
8054
+ },
8055
+ groupby: null,
8056
+ having: null,
8057
+ top: null,
8058
+ orderby: null,
8059
+ limit: null,
8060
+ },
8061
+ },
8062
+ ],
8063
+ },
8064
+ },
8065
+ ];
8066
+ /**
8067
+ * A function generator for functions that checks whether an ast pattern (testWhere) is
8068
+ * equivalent to a predetermined ast pattern (where)
8069
+ */
8070
+ function generateWhereChecker(astWhere) {
8071
+ function generateCheckFunction(where) {
8072
+ let resultString = `testWhere.type === '${where.type}'`;
8073
+ function recurseNode(node, testWhereNode) {
8074
+ switch (node.type) {
8075
+ case 'binary_expr':
8076
+ resultString = resultString.concat(` && (!${testWhereNode}.operator || ${testWhereNode}.operator === '${node.operator}' || (['<=', '<'].includes(${testWhereNode}.operator) && ['<=', '<'].includes('${node.operator}')) || (['>=', '>'].includes(${testWhereNode}.operator) && ['>=', '>'].includes('${node.operator}')))`);
8077
+ resultString = resultString.concat(` && (!${testWhereNode}?.left?.type || ${testWhereNode}?.left?.type === '${node.left.type}' || (['column_ref', 'double_quote_string', 'single_quote_string'].includes(${testWhereNode}?.left?.type) && ['column_ref', 'double_quote_string', 'single_quote_string'].includes('${node.left.type}')))`);
8078
+ resultString = resultString.concat(` && (!${testWhereNode}?.right?.type || ${testWhereNode}?.right?.type === '${node.right.type}' || (['column_ref', 'double_quote_string', 'single_quote_string'].includes(${testWhereNode}?.right?.type) && ['column_ref', 'double_quote_string', 'single_quote_string'].includes('${node.right.type}')))`);
8079
+ if (node.operator === 'AND' &&
8080
+ node.left?.left?.type !== 'extract' &&
8081
+ !(node.left?.left?.type === 'function' &&
8082
+ ['hour', 'day', 'week', 'month', 'year'].includes(node.left?.left?.name?.name?.[0]?.value?.toLowerCase()))) {
8083
+ recurseNode(node.left, testWhereNode.concat(`?.left`));
8084
+ }
8085
+ recurseNode(node.right, testWhereNode.concat(`?.right`));
8086
+ break;
8087
+ case 'function':
8088
+ if (node?.name && typeof node.name === 'string') {
8089
+ resultString = resultString.concat(` && (${testWhereNode}?.name?.toLowerCase() === '${node.name.toLowerCase()} ` +
8090
+ `|| (['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes(${testWhereNode}?.name)) ` +
8091
+ `&& ['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes('${node.name}')) ` +
8092
+ `|| (['year', 'month', 'quarter', 'day', 'week', 'hour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
8093
+ `&& ['year', 'month', 'quarter', 'day', 'week', 'hour'].includes('${node.name.toLowerCase()}')) ` +
8094
+ `|| (['toyear', 'tomonth', 'toquarter', 'tohour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
8095
+ `&& ['toyear', 'tomonth', 'toquarter', 'tohour'].includes('${node.name.toLowerCase()}')) ` +
8096
+ `|| (['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
8097
+ `&& ['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes('${node.name.toLowerCase()}'))` +
8098
+ `|| (['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
8099
+ `&& ['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes('${node.name.toLowerCase()}')) ` +
8100
+ `|| (['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes(${testWhereNode}?.name?.toLowerCase()) ` +
8101
+ `&& ['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes('${node.name.toLowerCase()}')))`);
8102
+ }
8103
+ else if (node?.name?.name?.length > 0) {
8104
+ resultString = resultString.concat(` && (${testWhereNode}?.name?.name[0]?.value === '${node.name.name[0].value}' ` +
8105
+ `|| (['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes(${testWhereNode}?.name?.name[0]?.value) ` +
8106
+ `&& ['CURRENT_DATE', 'CURRENT_TIMESTAMP', 'now', 'today'].includes('${node.name.name[0].value}')) ` +
8107
+ `|| (['year', 'month', 'quarter', 'day', 'week', 'hour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
8108
+ `&& ['year', 'month', 'quarter', 'day', 'week', 'hour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
8109
+ `|| (['toyear', 'tomonth', 'toquarter', 'tohour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
8110
+ `&& ['toyear', 'tomonth', 'toquarter', 'tohour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
8111
+ `|| (['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
8112
+ `&& ['tostartofyear', 'tostartofmonth', 'tostartofquarter', 'tostartofday', 'tostartofweek', 'tostartofhour'].includes('${node.name.name[0].value.toLowerCase()}'))` +
8113
+ `|| (['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7672
8114
  `&& ['truncyear', 'truncquarter', 'truncmonth', 'truncweek', 'truncday', 'trunchour'].includes('${node.name.name[0].value.toLowerCase()}')) ` +
7673
8115
  `|| (['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes(${testWhereNode}?.name?.name[0]?.value?.toLowerCase()) ` +
7674
8116
  `&& ['tointervalyear', 'tointervalmonth', 'tointervalday', 'tointervalquarter', 'tointervalweek', 'tointervalhour'].includes('${node.name.name[0].value.toLowerCase()}')))`);
@@ -7821,6 +8263,37 @@ function fieldColumnToLowerCaseAst(field, db, isColumnRef) {
7821
8263
  },
7822
8264
  over: null,
7823
8265
  };
8266
+ case 'mssql':
8267
+ return {
8268
+ type: 'function',
8269
+ name: {
8270
+ name: [
8271
+ {
8272
+ type: 'default',
8273
+ value: 'LOWER',
8274
+ },
8275
+ ],
8276
+ },
8277
+ args: {
8278
+ type: 'expr_list',
8279
+ value: [
8280
+ isColumnRef
8281
+ ? {
8282
+ type: 'column_ref',
8283
+ table: null,
8284
+ db: null,
8285
+ schema: null,
8286
+ column: field,
8287
+ collate: null,
8288
+ }
8289
+ : {
8290
+ type: 'single_quote_string',
8291
+ value: field,
8292
+ },
8293
+ ],
8294
+ },
8295
+ over: null,
8296
+ };
7824
8297
  case 'postgresql':
7825
8298
  case 'clickhouse':
7826
8299
  default:
@@ -7872,7 +8345,7 @@ function lowerFunctionToField(lower, db) {
7872
8345
  lower.name.toLowerCase() === 'lower') ||
7873
8346
  lower.name?.name[0]?.value?.toLowerCase() === 'lower' ||
7874
8347
  lower.name?.schema?.value?.toLowerCase() === 'lower'))) {
7875
- return '';
8348
+ return null;
7876
8349
  }
7877
8350
  switch (db) {
7878
8351
  case 'redshift':
@@ -7881,18 +8354,22 @@ function lowerFunctionToField(lower, db) {
7881
8354
  case 'mysql':
7882
8355
  case 'postgresql':
7883
8356
  case 'clickhouse':
7884
- return getFieldFromExpression(lower) ?? '';
8357
+ case 'mssql':
8358
+ return getFieldFromExpression(lower, db) ?? '';
7885
8359
  default:
7886
- return '';
8360
+ return null;
7887
8361
  }
7888
8362
  }
7889
8363
  /**
7890
8364
  * Function that extracts a field value
7891
8365
  */
7892
- export function getFieldFromExpression(expr) {
8366
+ export function getFieldFromExpression(expr, databaseType) {
7893
8367
  return (expr.column?.expr?.value ||
7894
8368
  expr.column ||
7895
8369
  expr.args?.value?.[1]?.expr?.column ||
8370
+ (databaseType === 'mssql'
8371
+ ? (expr.args?.value?.[1]?.column ?? expr.args.value?.[0]?.column)
8372
+ : null) ||
7896
8373
  expr.args?.value?.[1]?.args?.value?.[0]?.column?.expr?.value ||
7897
8374
  expr.args?.value?.[0]?.value?.expr?.value ||
7898
8375
  expr.args?.value?.[1]?.column?.expr?.value ||
@@ -8029,6 +8506,7 @@ export const astToFilter = (ast, db, columns) => {
8029
8506
  case 'redshift':
8030
8507
  case 'postgresql':
8031
8508
  case 'clickhouse':
8509
+ case 'mssql':
8032
8510
  leftExpr = left;
8033
8511
  while (leftExpr.type === 'binary_expr') {
8034
8512
  leftExpr = leftExpr.left;
@@ -8039,10 +8517,10 @@ export const astToFilter = (ast, db, columns) => {
8039
8517
  leftExpr.args?.value[1]?.column?.expr?.value ??
8040
8518
  leftExpr.args?.value[0]?.column?.expr?.value ??
8041
8519
  lowerFunctionToField(leftExpr, db) ??
8042
- getFieldFromExpression(leftExpr);
8520
+ getFieldFromExpression(leftExpr, db);
8043
8521
  break;
8044
8522
  default:
8045
- field = getFieldFromExpression(leftExpr);
8523
+ field = getFieldFromExpression(leftExpr, db);
8046
8524
  if (!field) {
8047
8525
  console.error('Could not determine field: ', leftExpr);
8048
8526
  return null;
@@ -8056,7 +8534,7 @@ export const astToFilter = (ast, db, columns) => {
8056
8534
  while (leftExpr.type === 'binary_expr') {
8057
8535
  leftExpr = leftExpr.left;
8058
8536
  }
8059
- field = getFieldFromExpression(leftExpr);
8537
+ field = getFieldFromExpression(leftExpr, db);
8060
8538
  if (!field) {
8061
8539
  console.error('Could not determine field: ', leftExpr);
8062
8540
  return null;
@@ -8224,19 +8702,19 @@ export const astToFilter = (ast, db, columns) => {
8224
8702
  switch (filterName) {
8225
8703
  case FilterType.StringFilter:
8226
8704
  return {
8227
- field: lowerFunctionToField(field, db).replaceAll('%', ''),
8705
+ field: (lowerFunctionToField(field, db) ?? '').replaceAll('%', ''),
8228
8706
  filterType: filterName,
8229
8707
  fieldType: FieldType.String,
8230
8708
  operator: mappedOperator,
8231
- value: lowerFunctionToField(right, db).replaceAll('%', ''),
8709
+ value: (lowerFunctionToField(right, db) ?? '').replaceAll('%', ''),
8232
8710
  };
8233
8711
  case FilterType.StringInFilter:
8234
8712
  return {
8235
- field: lowerFunctionToField(field, db).replaceAll('%', ''),
8713
+ field: (lowerFunctionToField(field, db) ?? '').replaceAll('%', ''),
8236
8714
  filterType: filterName,
8237
8715
  fieldType: FieldType.String,
8238
8716
  operator: mappedOperator,
8239
- value: right.value.map((v) => lowerFunctionToField(v, db).replaceAll('%', '')),
8717
+ value: right.value.map((v) => (lowerFunctionToField(v, db) ?? '').replaceAll('%', '')),
8240
8718
  };
8241
8719
  case FilterType.NumericFilter:
8242
8720
  return {
@@ -8757,6 +9235,64 @@ export const filterToAst = (filter, db) => {
8757
9235
  },
8758
9236
  },
8759
9237
  };
9238
+ case 'mssql':
9239
+ return {
9240
+ type: 'binary_expr',
9241
+ operator: '>=',
9242
+ left: {
9243
+ type: 'column_ref',
9244
+ table: null,
9245
+ db: null,
9246
+ schema: null,
9247
+ column: field,
9248
+ collate: null,
9249
+ },
9250
+ right: {
9251
+ type: 'function',
9252
+ name: {
9253
+ name: [
9254
+ {
9255
+ type: 'default',
9256
+ value: 'DATEADD',
9257
+ },
9258
+ ],
9259
+ },
9260
+ args: {
9261
+ type: 'expr_list',
9262
+ value: [
9263
+ {
9264
+ type: 'column_ref',
9265
+ table: null,
9266
+ db: null,
9267
+ schema: null,
9268
+ column: filter.value.unit,
9269
+ collate: null,
9270
+ },
9271
+ {
9272
+ type: 'number',
9273
+ value: -filter.value.value,
9274
+ },
9275
+ {
9276
+ type: 'function',
9277
+ name: {
9278
+ name: [
9279
+ {
9280
+ type: 'default',
9281
+ value: 'GETDATE',
9282
+ },
9283
+ ],
9284
+ },
9285
+ args: {
9286
+ type: 'expr_list',
9287
+ value: [],
9288
+ },
9289
+ over: null,
9290
+ },
9291
+ ],
9292
+ },
9293
+ over: null,
9294
+ },
9295
+ };
8760
9296
  default:
8761
9297
  console.error('Unknown database source: ', db);
8762
9298
  return null;
@@ -9444,6 +9980,85 @@ export const filterToAst = (filter, db) => {
9444
9980
  },
9445
9981
  },
9446
9982
  };
9983
+ case 'mssql':
9984
+ return {
9985
+ type: 'binary_expr',
9986
+ operator: '=',
9987
+ left: {
9988
+ type: 'function',
9989
+ name: {
9990
+ name: [
9991
+ {
9992
+ type: 'default',
9993
+ value: 'DATETRUNC',
9994
+ },
9995
+ ],
9996
+ },
9997
+ args: {
9998
+ type: 'expr_list',
9999
+ value: [
10000
+ {
10001
+ type: 'column_ref',
10002
+ table: null,
10003
+ db: null,
10004
+ schema: null,
10005
+ column: filter.value.unit,
10006
+ collate: null,
10007
+ },
10008
+ {
10009
+ type: 'column_ref',
10010
+ table: null,
10011
+ db: null,
10012
+ schema: null,
10013
+ column: field,
10014
+ collate: null,
10015
+ },
10016
+ ],
10017
+ },
10018
+ over: null,
10019
+ },
10020
+ right: {
10021
+ type: 'function',
10022
+ name: {
10023
+ name: [
10024
+ {
10025
+ type: 'default',
10026
+ value: 'DATETRUNC',
10027
+ },
10028
+ ],
10029
+ },
10030
+ args: {
10031
+ type: 'expr_list',
10032
+ value: [
10033
+ {
10034
+ type: 'column_ref',
10035
+ table: null,
10036
+ db: null,
10037
+ schema: null,
10038
+ column: filter.value.unit,
10039
+ collate: null,
10040
+ },
10041
+ {
10042
+ type: 'function',
10043
+ name: {
10044
+ name: [
10045
+ {
10046
+ type: 'default',
10047
+ value: 'GETDATE',
10048
+ },
10049
+ ],
10050
+ },
10051
+ args: {
10052
+ type: 'expr_list',
10053
+ value: [],
10054
+ },
10055
+ over: null,
10056
+ },
10057
+ ],
10058
+ },
10059
+ over: null,
10060
+ },
10061
+ };
9447
10062
  default:
9448
10063
  console.error('Unknown database source: ', db);
9449
10064
  return null;
@@ -10054,6 +10669,126 @@ export const filterToAst = (filter, db) => {
10054
10669
  },
10055
10670
  parentheses: true,
10056
10671
  };
10672
+ case 'mssql':
10673
+ return {
10674
+ type: 'binary_expr',
10675
+ operator: 'AND',
10676
+ left: {
10677
+ type: 'binary_expr',
10678
+ operator: '>=',
10679
+ left: {
10680
+ type: 'column_ref',
10681
+ table: null,
10682
+ db: null,
10683
+ schema: null,
10684
+ column: field,
10685
+ collate: null,
10686
+ },
10687
+ right: {
10688
+ type: 'function',
10689
+ name: {
10690
+ name: [
10691
+ {
10692
+ type: 'default',
10693
+ value: 'DATEADD',
10694
+ },
10695
+ ],
10696
+ },
10697
+ args: {
10698
+ type: 'expr_list',
10699
+ value: [
10700
+ {
10701
+ type: 'column_ref',
10702
+ table: null,
10703
+ db: null,
10704
+ schema: null,
10705
+ column: filter.value.unit,
10706
+ collate: null,
10707
+ },
10708
+ {
10709
+ type: 'number',
10710
+ value: -filter.value.value * 2,
10711
+ },
10712
+ {
10713
+ type: 'function',
10714
+ name: {
10715
+ name: [
10716
+ {
10717
+ type: 'default',
10718
+ value: 'GETDATE',
10719
+ },
10720
+ ],
10721
+ },
10722
+ args: {
10723
+ type: 'expr_list',
10724
+ value: [],
10725
+ },
10726
+ over: null,
10727
+ },
10728
+ ],
10729
+ },
10730
+ over: null,
10731
+ },
10732
+ },
10733
+ right: {
10734
+ type: 'binary_expr',
10735
+ operator: '<',
10736
+ left: {
10737
+ type: 'column_ref',
10738
+ table: null,
10739
+ db: null,
10740
+ schema: null,
10741
+ column: field,
10742
+ collate: null,
10743
+ },
10744
+ right: {
10745
+ type: 'function',
10746
+ name: {
10747
+ name: [
10748
+ {
10749
+ type: 'default',
10750
+ value: 'DATEADD',
10751
+ },
10752
+ ],
10753
+ },
10754
+ args: {
10755
+ type: 'expr_list',
10756
+ value: [
10757
+ {
10758
+ type: 'column_ref',
10759
+ table: null,
10760
+ db: null,
10761
+ schema: null,
10762
+ column: filter.value.unit,
10763
+ collate: null,
10764
+ },
10765
+ {
10766
+ type: 'number',
10767
+ value: -filter.value.value,
10768
+ },
10769
+ {
10770
+ type: 'function',
10771
+ name: {
10772
+ name: [
10773
+ {
10774
+ type: 'default',
10775
+ value: 'GETDATE',
10776
+ },
10777
+ ],
10778
+ },
10779
+ args: {
10780
+ type: 'expr_list',
10781
+ value: [],
10782
+ },
10783
+ over: null,
10784
+ },
10785
+ ],
10786
+ },
10787
+ over: null,
10788
+ },
10789
+ },
10790
+ parentheses: true,
10791
+ };
10057
10792
  default:
10058
10793
  console.error('Unknown database source: ', db);
10059
10794
  return null;