@quillsql/react 2.11.16 → 2.11.18

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 (229) hide show
  1. package/dist/cjs/Chart.d.ts +109 -42
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +44 -18
  4. package/dist/cjs/ChartBuilder.d.ts +204 -30
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +124 -63
  7. package/dist/cjs/ChartEditor.d.ts +123 -19
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +47 -15
  10. package/dist/cjs/Dashboard.d.ts +148 -91
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +51 -159
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +5 -2
  16. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
  17. package/dist/cjs/QuillProvider.d.ts +105 -2
  18. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  19. package/dist/cjs/QuillProvider.js +59 -0
  20. package/dist/cjs/ReportBuilder.d.ts +194 -42
  21. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  22. package/dist/cjs/ReportBuilder.js +563 -416
  23. package/dist/cjs/SQLEditor.d.ts +160 -23
  24. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  25. package/dist/cjs/SQLEditor.js +36 -30
  26. package/dist/cjs/Table.d.ts +119 -15
  27. package/dist/cjs/Table.d.ts.map +1 -1
  28. package/dist/cjs/Table.js +37 -6
  29. package/dist/cjs/TableChart.d.ts.map +1 -1
  30. package/dist/cjs/TableChart.js +0 -194
  31. package/dist/cjs/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
  32. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -0
  33. package/dist/cjs/{BarList.js → components/Chart/BarList.js} +1 -1
  34. package/dist/cjs/components/Chart/LineChart.d.ts +2 -3
  35. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  36. package/dist/cjs/components/Chart/LineChart.js +3 -3
  37. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -0
  38. package/dist/cjs/{PieChart.js → components/Chart/PieChart.js} +1 -1
  39. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +2 -1
  40. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/ChartComponent.js +6 -7
  42. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +22 -0
  43. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  44. package/dist/cjs/components/Dashboard/DashboardFilter.js +75 -0
  45. package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
  46. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  47. package/dist/cjs/components/Dashboard/DataLoader.js +1 -1
  48. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +2 -12
  49. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  50. package/dist/cjs/components/Dashboard/MetricComponent.js +39 -17
  51. package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
  52. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  53. package/dist/cjs/components/Dashboard/TableComponent.js +6 -9
  54. package/dist/cjs/components/QuillCard.d.ts +2 -7
  55. package/dist/cjs/components/QuillCard.d.ts.map +1 -1
  56. package/dist/cjs/components/QuillCard.js +15 -9
  57. package/dist/cjs/components/QuillSelect.d.ts +4 -1
  58. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  59. package/dist/cjs/components/QuillSelect.js +13 -8
  60. package/dist/cjs/components/QuillTable.d.ts +16 -2
  61. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  62. package/dist/cjs/components/QuillTable.js +4 -4
  63. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
  64. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +10 -6
  66. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
  67. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +5 -15
  69. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +21 -1
  70. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  71. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +15 -17
  72. package/dist/cjs/components/ReportBuilder/bigDateMap.js +1 -1
  73. package/dist/cjs/components/ReportBuilder/convert.d.ts +3 -1
  74. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  75. package/dist/cjs/components/ReportBuilder/convert.js +60 -21
  76. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -10
  77. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  78. package/dist/cjs/components/ReportBuilder/operators.js +23 -10
  79. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -1
  80. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  81. package/dist/cjs/components/ReportBuilder/ui.d.ts +82 -18
  82. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  83. package/dist/cjs/components/ReportBuilder/ui.js +55 -103
  84. package/dist/cjs/components/ReportBuilder/util.d.ts +10 -4
  85. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  86. package/dist/cjs/components/ReportBuilder/util.js +124 -71
  87. package/dist/cjs/components/UiComponents.d.ts +81 -87
  88. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  89. package/dist/cjs/components/UiComponents.js +76 -103
  90. package/dist/cjs/hooks/index.d.ts +1 -0
  91. package/dist/cjs/hooks/index.d.ts.map +1 -1
  92. package/dist/cjs/hooks/index.js +3 -1
  93. package/dist/cjs/hooks/useTheme.d.ts +7 -0
  94. package/dist/cjs/hooks/useTheme.d.ts.map +1 -0
  95. package/dist/cjs/hooks/useTheme.js +12 -0
  96. package/dist/cjs/index.d.ts +10 -2
  97. package/dist/cjs/index.d.ts.map +1 -1
  98. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +5 -2
  99. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  100. package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -21
  101. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +30 -14
  102. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  103. package/dist/cjs/internals/ReportBuilder/PivotModal.js +77 -52
  104. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  105. package/dist/cjs/utils/dataFetcher.js +2 -0
  106. package/dist/cjs/utils/parserBigQuery.d.ts +6 -0
  107. package/dist/cjs/utils/parserBigQuery.d.ts.map +1 -0
  108. package/dist/cjs/utils/parserBigQuery.js +60 -0
  109. package/dist/cjs/utils/parserPostgres.d.ts +3 -0
  110. package/dist/cjs/utils/parserPostgres.d.ts.map +1 -0
  111. package/dist/cjs/utils/parserPostgres.js +42 -0
  112. package/dist/esm/Chart.d.ts +109 -42
  113. package/dist/esm/Chart.d.ts.map +1 -1
  114. package/dist/esm/Chart.js +45 -19
  115. package/dist/esm/ChartBuilder.d.ts +204 -30
  116. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  117. package/dist/esm/ChartBuilder.js +124 -63
  118. package/dist/esm/ChartEditor.d.ts +123 -19
  119. package/dist/esm/ChartEditor.d.ts.map +1 -1
  120. package/dist/esm/ChartEditor.js +51 -19
  121. package/dist/esm/Dashboard.d.ts +148 -91
  122. package/dist/esm/Dashboard.d.ts.map +1 -1
  123. package/dist/esm/Dashboard.js +54 -160
  124. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
  125. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  126. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +6 -3
  127. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
  128. package/dist/esm/QuillProvider.d.ts +105 -2
  129. package/dist/esm/QuillProvider.d.ts.map +1 -1
  130. package/dist/esm/QuillProvider.js +59 -0
  131. package/dist/esm/ReportBuilder.d.ts +194 -42
  132. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  133. package/dist/esm/ReportBuilder.js +566 -419
  134. package/dist/esm/SQLEditor.d.ts +160 -23
  135. package/dist/esm/SQLEditor.d.ts.map +1 -1
  136. package/dist/esm/SQLEditor.js +36 -30
  137. package/dist/esm/Table.d.ts +119 -15
  138. package/dist/esm/Table.d.ts.map +1 -1
  139. package/dist/esm/Table.js +38 -7
  140. package/dist/esm/TableChart.d.ts.map +1 -1
  141. package/dist/esm/TableChart.js +0 -194
  142. package/dist/esm/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
  143. package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
  144. package/dist/esm/{BarList.js → components/Chart/BarList.js} +1 -1
  145. package/dist/esm/components/Chart/LineChart.d.ts +2 -3
  146. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  147. package/dist/esm/components/Chart/LineChart.js +3 -3
  148. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
  149. package/dist/esm/{PieChart.js → components/Chart/PieChart.js} +1 -1
  150. package/dist/esm/components/Dashboard/ChartComponent.d.ts +2 -1
  151. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  152. package/dist/esm/components/Dashboard/ChartComponent.js +5 -6
  153. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +22 -0
  154. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  155. package/dist/esm/components/Dashboard/DashboardFilter.js +71 -0
  156. package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
  157. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  158. package/dist/esm/components/Dashboard/DataLoader.js +1 -1
  159. package/dist/esm/components/Dashboard/MetricComponent.d.ts +2 -12
  160. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  161. package/dist/esm/components/Dashboard/MetricComponent.js +39 -17
  162. package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
  163. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  164. package/dist/esm/components/Dashboard/TableComponent.js +6 -9
  165. package/dist/esm/components/QuillCard.d.ts +2 -7
  166. package/dist/esm/components/QuillCard.d.ts.map +1 -1
  167. package/dist/esm/components/QuillCard.js +15 -9
  168. package/dist/esm/components/QuillSelect.d.ts +4 -1
  169. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  170. package/dist/esm/components/QuillSelect.js +14 -9
  171. package/dist/esm/components/QuillTable.d.ts +16 -2
  172. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  173. package/dist/esm/components/QuillTable.js +4 -4
  174. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
  175. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  176. package/dist/esm/components/ReportBuilder/AddColumnPopover.js +10 -6
  177. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
  178. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  179. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +5 -15
  180. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +21 -1
  181. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  182. package/dist/esm/components/ReportBuilder/AddSortPopover.js +17 -19
  183. package/dist/esm/components/ReportBuilder/bigDateMap.js +1 -1
  184. package/dist/esm/components/ReportBuilder/convert.d.ts +3 -1
  185. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  186. package/dist/esm/components/ReportBuilder/convert.js +51 -13
  187. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -10
  188. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  189. package/dist/esm/components/ReportBuilder/operators.js +23 -10
  190. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -1
  191. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  192. package/dist/esm/components/ReportBuilder/ui.d.ts +82 -18
  193. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  194. package/dist/esm/components/ReportBuilder/ui.js +53 -101
  195. package/dist/esm/components/ReportBuilder/util.d.ts +10 -4
  196. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  197. package/dist/esm/components/ReportBuilder/util.js +114 -67
  198. package/dist/esm/components/UiComponents.d.ts +81 -87
  199. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  200. package/dist/esm/components/UiComponents.js +71 -102
  201. package/dist/esm/hooks/index.d.ts +1 -0
  202. package/dist/esm/hooks/index.d.ts.map +1 -1
  203. package/dist/esm/hooks/index.js +1 -0
  204. package/dist/esm/hooks/useTheme.d.ts +7 -0
  205. package/dist/esm/hooks/useTheme.d.ts.map +1 -0
  206. package/dist/esm/hooks/useTheme.js +10 -0
  207. package/dist/esm/index.d.ts +10 -2
  208. package/dist/esm/index.d.ts.map +1 -1
  209. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +5 -2
  210. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  211. package/dist/esm/internals/ReportBuilder/PivotList.js +21 -21
  212. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +30 -14
  213. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  214. package/dist/esm/internals/ReportBuilder/PivotModal.js +77 -52
  215. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  216. package/dist/esm/utils/dataFetcher.js +2 -0
  217. package/dist/esm/utils/parserBigQuery.d.ts +6 -0
  218. package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
  219. package/dist/esm/utils/parserBigQuery.js +52 -0
  220. package/dist/esm/utils/parserPostgres.d.ts +3 -0
  221. package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
  222. package/dist/esm/utils/parserPostgres.js +37 -0
  223. package/package.json +1 -1
  224. package/dist/cjs/BarList.d.ts.map +0 -1
  225. package/dist/cjs/PieChart.d.ts.map +0 -1
  226. package/dist/esm/BarList.d.ts.map +0 -1
  227. package/dist/esm/PieChart.d.ts.map +0 -1
  228. /package/dist/cjs/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
  229. /package/dist/esm/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { forwardRef, useContext, useEffect, useRef, useState } from 'react';
3
- import { MemoizedSelect, MemoizedCheckbox, MemoizedHeader, MemoizedLabel, MemoizedTabs, LoadingSpinner, MemoizedSecondaryButton, } from '../UiComponents';
2
+ import { forwardRef, useContext, useEffect, useState } from 'react';
3
+ import { MemoizedCheckbox, MemoizedHeader, LoadingSpinner, MemoizedSecondaryButton, MemoizedPopover, } from '../UiComponents';
4
4
  import MemoizedQuillTable from '../QuillTable';
5
5
  import { ThemeContext } from '../../Context';
6
6
  import { isNodeEmptyCollection, allNumericNodesValidInTree } from './util';
@@ -52,6 +52,7 @@ export const QuillSecondaryButton = ({ children, ...props }) => {
52
52
  ...props.style,
53
53
  }, children: children }));
54
54
  };
55
+ // TODO: remove this, I think it is unused.
55
56
  export const QuillReportBuilderTable = ({ rows, columns, error, ...props }) => {
56
57
  const reformattedColumns = columns.map((c) => ({ label: c, field: c }));
57
58
  return (_jsx("div", { style: { height: '100%', overflow: 'auto' }, children: _jsx(MemoizedQuillTable, { rows: rows, columns: reformattedColumns, rowsPerPage: 10, showDownloadCSVButton: rows?.length > 0, downloadCSV: () => downloadCSV({ rows, fields: reformattedColumns, name: 'my_report' }), emptyStateLabel: error || 'No results', ...props }) }));
@@ -96,20 +97,18 @@ export const QuillTag = forwardRef(({ label, onClick, children, onClickDelete, h
96
97
  }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: theme?.secondaryButtonColor || 'currentColor', style: { width: 16, height: 16 }, children: _jsx("path", { d: "M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z" }) }) }) }))] }));
97
98
  });
98
99
  // A heading element in the sidebar (eg. "Filters")
99
- export const QuillSidebarHeading = ({ label }) => (_jsx(MemoizedHeader, { children: label }));
100
- // A sub-heading element in the sidebar (eg. "Filters")
101
- export const QuillSidebarSubHeading = ({ label }) => (_jsx(MemoizedLabel, { children: label }));
100
+ export const QuillSidebarHeading = ({ label, }) => _jsx(MemoizedHeader, { label: label });
102
101
  // The gray thing on the left.
103
- export const QuillSidebar = forwardRef(({ children, ...props }, forwardedRef) => (_jsx("div", { style: {
102
+ export const QuillSidebar = ({ children }) => (_jsx("div", { style: {
104
103
  overflowX: 'visible',
105
104
  padding: '12px',
106
105
  width: '25%',
107
106
  height: '100%',
108
107
  maxWidth: '300px',
109
108
  boxSizing: 'border-box',
110
- }, ref: forwardedRef, ...props, children: children })));
109
+ }, children: children }));
111
110
  // A big wrapper around the main content (ie. Input, Button, and Table)
112
- export const CustomContainer = forwardRef(({ children, ...props }, forwardedRef) => (_jsx("div", { style: {
111
+ export const CustomContainer = ({ children }) => (_jsx("div", { style: {
113
112
  position: 'sticky',
114
113
  top: 0,
115
114
  display: 'flex',
@@ -122,59 +121,7 @@ export const CustomContainer = forwardRef(({ children, ...props }, forwardedRef)
122
121
  width: '75%',
123
122
  height: '100%',
124
123
  boxSizing: 'border-box',
125
- }, ref: forwardedRef, ...props, children: children })));
126
- export const QuillSelect = ({ onChange, ...props }) => {
127
- const handleOnChange = (value) => {
128
- if (!onChange)
129
- return;
130
- const option = props.options.find((opt) => opt.value === value);
131
- if (option) {
132
- onChange(option.value);
133
- }
134
- };
135
- return _jsx(MemoizedSelect, { ...props, onChange: handleOnChange });
136
- };
137
- export function MemoizedPopover({ onClose, children, style = {}, trigger, isOpen, }) {
138
- const modalRef = useRef(null);
139
- const [theme] = useContext(ThemeContext);
140
- useEffect(() => {
141
- const listener = (event) => {
142
- if (modalRef?.current && !modalRef?.current?.contains(event.target)) {
143
- onClose(event);
144
- }
145
- };
146
- document.addEventListener('mousedown', listener);
147
- return () => {
148
- document.removeEventListener('mousedown', listener);
149
- };
150
- }, [modalRef, onClose]);
151
- return (_jsxs("div", { children: [trigger, isOpen && (_jsx("div", { id: "quill-popover-modal", ref: modalRef, style: { position: 'relative' }, children: _jsx("div", { style: {
152
- background: theme?.backgroundColor || 'white',
153
- position: 'absolute',
154
- boxShadow: '0px 1px 12px 0px rgba(56, 65, 81, 0.1)',
155
- border: theme
156
- ? `${theme.borderWidth || 1}px solid ${theme.borderColor || '#e7e7e7'}`
157
- : '1px solid #e7e7e7',
158
- boxSizing: 'content-box',
159
- zIndex: 999,
160
- top: 12,
161
- borderRadius: 6,
162
- padding: 20,
163
- ...style,
164
- }, children: children }) }))] }));
165
- }
166
- export const QuillPopover = forwardRef(({ children, trigger, isOpen, onClose = () => { }, title = undefined }, ref) => {
167
- const [theme] = useContext(ThemeContext);
168
- return (_jsxs(MemoizedPopover, { isOpen: isOpen, onClose: onClose, trigger: trigger, parentRef: ref, ref: ref, children: [title && (_jsx("h1", { style: {
169
- fontWeight: '600',
170
- fontSize: 18,
171
- margin: 0,
172
- textAlign: 'left',
173
- marginBottom: 5,
174
- color: theme?.primaryTextColor,
175
- fontFamily: theme?.fontFamily,
176
- }, children: title })), children] }));
177
- });
124
+ }, children: children }));
178
125
  // The six-dot grab-handle icon.
179
126
  export const QuillHandleButton = () => {
180
127
  const [theme] = useContext(ThemeContext);
@@ -219,7 +166,7 @@ export const QuillHandleButton = () => {
219
166
  background: '#9CA0A7',
220
167
  } })] })] }));
221
168
  };
222
- export const QuillSelectColumn = ({ label, selected, setSelected, children, }) => {
169
+ export const QuillSelectColumn = ({ label, isSelected, setSelected, DragHandle, }) => {
223
170
  const [theme] = useContext(ThemeContext);
224
171
  return (_jsxs("div", { title: label, style: {
225
172
  boxShadow: '0px 1px 4px #e2e8f005',
@@ -231,13 +178,13 @@ export const QuillSelectColumn = ({ label, selected, setSelected, children, }) =
231
178
  display: 'flex',
232
179
  alignItems: 'center',
233
180
  backgroundColor: theme?.backgroundColor || 'white',
234
- }, children: [_jsx("div", { children: children }), _jsxs("label", { style: {
181
+ }, children: [_jsx(DragHandle, { dragIcon: QuillHandleButton }), _jsxs("label", { style: {
235
182
  display: 'flex',
236
183
  gap: 2,
237
184
  whiteSpace: 'nowrap',
238
185
  textOverflow: 'ellipsis',
239
186
  overflow: 'hidden',
240
- }, children: [_jsx(MemoizedCheckbox, { checked: selected, onChange: () => setSelected() }), _jsx("span", { style: {
187
+ }, children: [_jsx(MemoizedCheckbox, { isChecked: isSelected, onChange: () => setSelected() }), _jsx("span", { style: {
241
188
  marginLeft: 6,
242
189
  display: 'block',
243
190
  whiteSpace: 'nowrap',
@@ -247,8 +194,10 @@ export const QuillSelectColumn = ({ label, selected, setSelected, children, }) =
247
194
  color: theme?.primaryTextColor,
248
195
  }, children: snakeCaseToTitleCase(label) })] })] }));
249
196
  };
250
- // A draggable card with a grab-handle and a column name
251
- export const QuillDraggableColumn = ({ label, children, onDelete }) => {
197
+ /**
198
+ * A draggable card with a grab-handle and a column name
199
+ */
200
+ export const QuillDraggableColumn = ({ label, onDelete, DragHandle, }) => {
252
201
  const [theme] = useContext(ThemeContext);
253
202
  return (_jsxs("div", { style: {
254
203
  boxShadow: '0px 1px 4px #e2e8f005',
@@ -257,13 +206,14 @@ export const QuillDraggableColumn = ({ label, children, onDelete }) => {
257
206
  display: 'flex',
258
207
  alignItems: 'center',
259
208
  backgroundColor: theme?.backgroundColor || 'white',
260
- }, children: [_jsx("div", { children: children }), _jsx("div", { style: {
209
+ }, children: [_jsx(DragHandle, { dragIcon: QuillHandleButton }), _jsx("div", { style: {
261
210
  marginLeft: 2,
262
211
  marginRight: 'auto',
263
212
  fontSize: 14,
264
213
  display: 'block',
265
214
  whiteSpace: 'nowrap',
266
215
  textOverflow: 'ellipsis',
216
+ overflow: 'hidden',
267
217
  fontFamily: theme?.fontFamily,
268
218
  }, children: label }), _jsx("button", { onClick: onDelete, style: {
269
219
  paddingRight: 4,
@@ -281,11 +231,6 @@ export const QuillButtonLoadingState = () => {
281
231
  export const QuillTableLoadingState = () => {
282
232
  return (_jsx("div", { style: { display: 'flex', flexDirection: 'column', margin: 'auto' }, children: _jsx(LoadingSpinner, {}) }));
283
233
  };
284
- export const DEFAULT_TAB_OPTIONS = [
285
- { label: 'or', value: 'OR' },
286
- { label: 'and', value: 'AND' },
287
- ];
288
- export const QuillTabs = forwardRef(({ options = DEFAULT_TAB_OPTIONS, ...props }, ref) => (_jsx(MemoizedTabs, { ref: ref, options: options, ...props })));
289
234
  export const EditPopover = ({ onSave, onDelete, Button, renderNode, activeEditItem, }) => {
290
235
  const handleOnClick = () => {
291
236
  if (!allNumericNodesValidInTree(activeEditItem)) {
@@ -306,39 +251,45 @@ export const EditPopover = ({ onSave, onDelete, Button, renderNode, activeEditIt
306
251
  width: '100%',
307
252
  }, children: [_jsx(MemoizedSecondaryButton, { onClick: onDelete, label: "Delete" }), _jsx(Button, { onClick: handleOnClick, label: "Save" })] })] }));
308
253
  };
309
- export const QuillFilterPopover = ({ filterLabel, onClickDeleteFilter, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
310
- return (_jsx(QuillPopover, { isOpen: isOpen, title: popoverTitle, trigger: _jsx(QuillTag, { label: filterLabel, onClickDelete: onClickDeleteFilter, onClick: () => {
311
- setIsOpen((isOpen) => !isOpen);
312
- } }), onClose: () => {
313
- setIsOpen(false);
314
- }, children: popoverChildren }));
254
+ export const QuillFilterPopover = ({ filterLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
255
+ const handleSetIsOpen = (isOpen) => {
256
+ setIsOpen(isOpen);
257
+ };
258
+ return (_jsxs(_Fragment, { children: [_jsx(QuillTag, { label: filterLabel, onClickDelete: onClickDelete, onClick: () => setIsOpen(!isOpen) }), _jsx(MemoizedPopover, { isOpen: isOpen, setIsOpen: handleSetIsOpen, popoverTitle: popoverTitle, popoverChildren: popoverChildren })] }));
259
+ };
260
+ export const QuillSortPopover = ({ sortLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
261
+ return (_jsxs(_Fragment, { children: [_jsx(QuillTag, { label: sortLabel, onClickDelete: onClickDelete, onClick: () => {
262
+ setIsOpen(!isOpen);
263
+ } }), _jsx(MemoizedPopover, { isOpen: isOpen, popoverTitle: popoverTitle, setIsOpen: setIsOpen, popoverChildren: popoverChildren })] }));
315
264
  };
316
- export const QuillSortPopover = ({ filterLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
317
- return (_jsx(QuillPopover, { isOpen: isOpen, title: popoverTitle, trigger: _jsx(QuillTag, { label: filterLabel, onClickDelete: onClickDelete, onClick: () => {
318
- setIsOpen((isOpen) => !isOpen);
319
- } }), onClose: () => {
320
- setIsOpen(false);
321
- }, children: popoverChildren }));
265
+ export const QuillLimitPopover = ({ limitLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
266
+ return (_jsxs(_Fragment, { children: [_jsx(QuillTag, { label: limitLabel, onClickDelete: onClickDelete, onClick: () => {
267
+ setIsOpen(!isOpen);
268
+ } }), _jsx(MemoizedPopover, { isOpen: isOpen, popoverTitle: popoverTitle, setIsOpen: setIsOpen, popoverChildren: popoverChildren })] }));
322
269
  };
323
- export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, activeEditItem, setEditPopoverKey, setActiveEditItem, setActivePath, setOpenPopover, setIsPending, clearCheckboxes, fetchSqlQuery, handleDelete, setCheckboxes, handleReplaceSubtree, FilterPopover, getByKey, EditPopover, Button, renderNode, children, }) => {
270
+ export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, activeEditItem, setEditPopoverKey, setActiveEditItem, setActivePath, setOpenPopover, setIsPending, clearCheckboxes, handleDelete, setCheckboxes, handleReplaceSubtree, FilterPopover, getByKey, EditPopover, Button, renderNode, children, }) => {
324
271
  const [isOpen, setIsOpen] = useState(false);
272
+ const onOpen = () => {
273
+ setActiveEditItem(getByKey(formData, keyPrefix));
274
+ setActivePath(keyPrefix);
275
+ setIsPending(true);
276
+ setEditPopoverKey(keyPrefix);
277
+ setCheckboxes(getByKey(formData, keyPrefix));
278
+ };
279
+ const onClose = () => {
280
+ setEditPopoverKey(null);
281
+ setIsPending(false);
282
+ setActiveEditItem(null);
283
+ setActivePath(null);
284
+ setOpenPopover(null);
285
+ clearCheckboxes();
286
+ };
325
287
  useEffect(() => {
326
288
  if (isOpen) {
327
- // open
328
- setActiveEditItem(getByKey(formData, keyPrefix));
329
- setActivePath(keyPrefix);
330
- setIsPending(true);
331
- setEditPopoverKey(keyPrefix);
332
- setCheckboxes(getByKey(formData, keyPrefix));
289
+ onOpen();
333
290
  }
334
291
  else {
335
- // closed
336
- setEditPopoverKey(null);
337
- setIsPending(false);
338
- setActiveEditItem(null);
339
- setActivePath(null);
340
- setOpenPopover(null);
341
- clearCheckboxes();
292
+ onClose();
342
293
  }
343
294
  }, [isOpen]);
344
295
  if (isCard && isRow) {
@@ -352,7 +303,7 @@ export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData,
352
303
  setEditPopoverKey(null);
353
304
  clearCheckboxes();
354
305
  };
355
- return (_jsx("div", { style: { width: '100%' }, children: _jsx(FilterPopover, { isOpen: editPopoverKey === keyPrefix, popoverTitle: "Edit Filter", filterLabel: children, onClickDeleteFilter: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: _jsx(EditPopover, { Button: Button, renderNode: renderNode, activeEditItem: activeEditItem, onSave: () => {
306
+ return (_jsx("div", { style: { width: '100%' }, children: _jsx(FilterPopover, { isOpen: editPopoverKey === keyPrefix, popoverTitle: "Edit Filter", filterLabel: children, onClickDelete: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: _jsx(EditPopover, { Button: Button, renderNode: renderNode, activeEditItem: activeEditItem, onSave: () => {
356
307
  if (isNodeEmptyCollection(activeEditItem)) {
357
308
  setIsPending(false);
358
309
  setActiveEditItem(null);
@@ -360,7 +311,7 @@ export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData,
360
311
  setOpenPopover(null);
361
312
  setEditPopoverKey(null);
362
313
  handleDelete(keyPrefix);
363
- fetchSqlQuery();
314
+ setIsOpen(false);
364
315
  clearCheckboxes();
365
316
  }
366
317
  else {
@@ -370,6 +321,7 @@ export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData,
370
321
  setActiveEditItem(null);
371
322
  setActivePath(null);
372
323
  setOpenPopover(null);
324
+ setIsOpen(false);
373
325
  clearCheckboxes();
374
326
  }
375
327
  }, onDelete: () => {
@@ -378,8 +330,8 @@ export const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData,
378
330
  setActivePath(null);
379
331
  setOpenPopover(null);
380
332
  setEditPopoverKey(null);
333
+ setIsOpen(false);
381
334
  handleDelete(keyPrefix);
382
- fetchSqlQuery();
383
335
  clearCheckboxes();
384
336
  } }) }) })); // Make sure to close the <Tag> correctly
385
337
  }
@@ -21,11 +21,15 @@ export declare function formatDateComparisonNode(node: any): string | null;
21
21
  export declare function getInTheCurrentIntervalSentence(node: any, databaseType: string): string | null;
22
22
  export declare function getInTheLastIntervalSentence(node: any, databaseType: string): string | null;
23
23
  export declare function getInThePreviousIntervalSentence(node: any, databaseType: string): string | null;
24
+ export declare function getIsEqualsSentence(node: any, databaseType: string): string | null;
25
+ export declare function getIsAfterSentence(node: any, databaseType: string): string | null;
26
+ export declare function getIsBeforeSentence(node: any, databaseType: string): string | null;
24
27
  export declare const isInTheLastInterval: (node: any, databaseType: string) => boolean;
25
- export declare const isInTheLastIntervalBigQuery: (node: any) => boolean;
28
+ export declare const isAfter: (node: any, databaseType: string) => boolean | undefined;
29
+ export declare const isBefore: (node: any, databaseType: string) => boolean | undefined;
26
30
  export declare const isTheCurrentInterval: (node: any, databaseType: string) => boolean;
31
+ export declare const isEquals: (node: any, databaseType: string) => boolean;
27
32
  export declare const isThePreviousInterval: (node: any, databaseType: string) => any;
28
- export declare const isTheCurrentIntervalBigQuery: (node: any) => boolean;
29
33
  /**
30
34
  * Returns whether this node is the root of a binary expression
31
35
  * where the left child is a string but really should be
@@ -56,7 +60,7 @@ export declare function tryConvertDateEquality(node: any, databaseType?: string)
56
60
  * Returns whether this node is an equality of a date column with a
57
61
  * date trunc.
58
62
  */
59
- export declare const isDateTruncEquals: (node: any) => boolean;
63
+ export declare const isDateTruncEquals: (node: any, databaseType?: string) => boolean;
60
64
  /**
61
65
  * Returns whether this node is an equality of a date column with extract.
62
66
  */
@@ -73,6 +77,8 @@ export declare const getDateFilterInfo: (node: any) => {
73
77
  intervalType: any;
74
78
  intervalPaths: any;
75
79
  };
76
- export declare function removeNonSelectedTableReferences(ast: any, table: string): any;
80
+ export declare function removeNonSelectedTableReferences(ast: any, table: string, columns: string[]): any;
77
81
  export declare function allNumericNodesValidInTree(node: any): boolean;
82
+ export declare function isIdColumn(columnName?: string): boolean | "" | undefined;
83
+ export declare function getCustomSentence(node: any, databaseType: string): string | null;
78
84
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,eAAO,MAAM,qBAAqB,SAAU,GAAG,YAW9C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,WAa1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,WAK5C;AAGD,eAAO,MAAM,WAAW,SAAU,GAAG,YAuBpC,CAAC;AAKF,eAAO,MAAM,oBAAoB,SAAU,GAAG,QAE7C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG;;;;;;;;EAU3C;AAKD,eAAO,MAAM,eAAe,QAAS,GAAG,QAMvC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAiBvD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAQjD;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAOf;AAQD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAWf;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAOf;AAMD,eAAO,MAAM,mBAAmB,SAAU,GAAG,gBAAgB,MAAM,YA4BlE,CAAC;AAIF,eAAO,MAAM,2BAA2B,SAAU,GAAG,YAUpD,CAAC;AAIF,eAAO,MAAM,oBAAoB,SACzB,GAAG,gBACK,MAAM,KACnB,OAoBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,GAAG,gBAAgB,MAAM,QAYpE,CAAC;AAEF,eAAO,MAAM,4BAA4B,SAAU,GAAG,KAAG,OAUxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,SAAU,GAAG,QA4B3C,CAAC;AAGF,eAAO,MAAM,UAAU,eAAgB,MAAM,SAe5C,CAAC;AAmBF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,UAsBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,UAgB9C;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,sBAmBtE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,SAAU,GAAG,YAU1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,SAAU,GAAG,YAOxC,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,WAehD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,GAAG,GACV,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAyB1C;AAED,eAAO,MAAM,QAAQ,QAAS,GAAG,QAAoC,CAAC;AAEtE,eAAO,MAAM,QAAQ,MAAO,MAAM,WAA2C,CAAC;AA4L9E,eAAO,MAAM,iBAAiB,SAAU,GAAG;;;;;;;CAc1C,CAAC;AAqCF,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,OAQvE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAe7D"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  // A collection of reusable, pure, utility functions for the Report Builder.
2
- import { getQuarter } from 'date-fns';
2
+ import { getQuarter, format, addMinutes, } from 'date-fns';
3
3
  import { DATE_DESCRIPTION_MAP } from './bigDateMap';
4
4
  import { snakeCaseToTitleCase } from '../../utils/textProcessing';
5
+ import { isAfterBigQuery, isBeforeBigQuery, isEqualsBigQuery, isInTheLastIntervalBigQuery, isTheCurrentIntervalBigQuery, } from '../../utils/parserBigQuery';
6
+ import { isInTheLastIntervalPostgres, isTheCurrentIntervalPostgres, } from '../../utils/parserPostgres';
5
7
  /**
6
8
  * A node that is "in" or "not in" where none of the variants are selected.
7
9
  */
@@ -134,7 +136,7 @@ const BIG_QUERY_DAY_TO_INTERVAL_MAP = {
134
136
  };
135
137
  export function getInTheLastIntervalSentence(node, databaseType) {
136
138
  if (databaseType === 'BigQuery') {
137
- const dateColumn = snakeCaseToTitleCase(node.left.column);
139
+ const dateColumn = snakeCaseToTitleCase(node.left.column || node.left.args.value[0].columns || '');
138
140
  const amount = node.right.args.value[1].expr.value;
139
141
  let unit = node.right.args.value[1].unit.toLowerCase();
140
142
  if (unit.includes('*')) {
@@ -152,6 +154,48 @@ export function getInThePreviousIntervalSentence(node, databaseType) {
152
154
  }
153
155
  return null;
154
156
  }
157
+ export function getIsEqualsSentence(node, databaseType) {
158
+ if (databaseType === 'BigQuery') {
159
+ const dateColumn = snakeCaseToTitleCase(node.left.args.value[1].column);
160
+ const type = node.right.args.value[1].column.toLowerCase();
161
+ const value = node.right.args.value[0].value;
162
+ // using date-fns can I parse the date to short month year
163
+ const date = new Date(value);
164
+ if (type === 'year') {
165
+ return `${dateColumn} is in ${format(addMinutes(date, date.getTimezoneOffset()), 'yyyy')}`;
166
+ }
167
+ else if (type === 'month') {
168
+ return `${dateColumn} is in ${format(addMinutes(date, date.getTimezoneOffset()), 'MMM yyyy')}`;
169
+ }
170
+ else if (type === 'quarter') {
171
+ return `${dateColumn} is in ${format(addMinutes(date, date.getTimezoneOffset()), 'QQQ yyyy')}`;
172
+ }
173
+ return `${dateColumn} is in the ${type} of ${value}`;
174
+ }
175
+ return null;
176
+ }
177
+ export function getIsAfterSentence(node, databaseType) {
178
+ if (databaseType === 'BigQuery') {
179
+ const dateColumn = snakeCaseToTitleCase(node.left?.column || node.left?.args?.value[0]?.columns || '');
180
+ const value = node.right?.value || node.right?.args?.value[0]?.value || '';
181
+ if (!dateColumn || !value) {
182
+ return null;
183
+ }
184
+ return `${dateColumn} is after ${value}`;
185
+ }
186
+ return null;
187
+ }
188
+ export function getIsBeforeSentence(node, databaseType) {
189
+ if (databaseType === 'BigQuery') {
190
+ const dateColumn = snakeCaseToTitleCase(node.left?.column || node.left?.args?.value[0]?.columns || '');
191
+ const value = node.right?.value || node.right?.args?.value[0]?.value || '';
192
+ if (!dateColumn || !value) {
193
+ return null;
194
+ }
195
+ return `${dateColumn} is before ${value}`;
196
+ }
197
+ return null;
198
+ }
155
199
  // "created_at" >= date_trunc ('year', CURRENT_DATE) - INTERVAL '1 year'
156
200
  // or
157
201
  // "created_at" >= CURRENT_DATE - INTERVAL '1 year'
@@ -160,38 +204,17 @@ export const isInTheLastInterval = (node, databaseType) => {
160
204
  if (databaseType && databaseType.toLowerCase() === 'bigquery') {
161
205
  return isInTheLastIntervalBigQuery(node);
162
206
  }
163
- const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
164
- node.left.type === 'column_ref' &&
165
- node.right.type === 'binary_expr' &&
166
- node.right.operator === '-' &&
167
- node.right.left.type === 'function' &&
168
- node.right.left.name.toLowerCase() === 'date_trunc' &&
169
- node.right.left.args.value[0].type === 'single_quote_string' &&
170
- node.right.left.args.value[1].type === 'function' &&
171
- ['current_date', 'now'].includes(node.right.left.args.value[1].name.toLowerCase()) &&
172
- node.right.right.type.toLowerCase() === 'interval' &&
173
- node.right.right.expr.type === 'single_quote_string';
174
- const noDateTrunc = ['>=', '>'].includes(node.operator) &&
175
- node.left.type === 'column_ref' &&
176
- node.right.type === 'binary_expr' &&
177
- node.right.operator === '-' &&
178
- node.right.left.type === 'function' &&
179
- ['current_date', 'now'].includes(node.right.left.name.toLowerCase()) &&
180
- node.right.right.type.toLowerCase() === 'interval' &&
181
- node.right.right.expr.type === 'single_quote_string';
182
- return isOutsideOfDateTrunc || noDateTrunc;
207
+ return isInTheLastIntervalPostgres(node);
183
208
  };
184
- // created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)
185
- // in the last month aka one interval from today
186
- export const isInTheLastIntervalBigQuery = (node) => {
187
- const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
188
- node.left.type === 'column_ref' &&
189
- node.right.type === 'function' &&
190
- node.right.name.toLowerCase() === 'timestamp_sub' &&
191
- node.right.args.value[0].type === 'function' &&
192
- node.right.args.value[1].type === 'interval' &&
193
- ['current_timestamp'].includes(node.right.args.value[0].name.toLowerCase());
194
- return isOutsideOfDateTrunc;
209
+ export const isAfter = (node, databaseType) => {
210
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
211
+ return isAfterBigQuery(node);
212
+ }
213
+ };
214
+ export const isBefore = (node, databaseType) => {
215
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
216
+ return isBeforeBigQuery(node);
217
+ }
195
218
  };
196
219
  // "created_at" >= date_trunc ('year', CURRENT_DATE - INTERVAL '1 year')
197
220
  // this year
@@ -199,19 +222,15 @@ export const isTheCurrentInterval = (node, databaseType) => {
199
222
  if (databaseType && databaseType.toLowerCase() === 'bigquery') {
200
223
  return isTheCurrentIntervalBigQuery(node);
201
224
  }
202
- const isInsideOfDateTrunc = ['AND'].includes(node.operator) &&
203
- (node.left.operator === '=' || node.left.type === 'double_quote_string') &&
204
- node.right.operator === '=' &&
205
- node.right.name &&
206
- node.right.name.toLowerCase() === 'date_trunc' &&
207
- node.args.value[0].type === 'single_quote_string' &&
208
- node.args.value[1].type === 'binary_expr' &&
209
- node.args.value[1].operator === '-' &&
210
- node.args.value[1].left.type === 'function' &&
211
- ['now', 'current_date'].includes(node.args.value[1].left.name.toLowerCase()) &&
212
- node.args.value[1].right.type === 'interval' &&
213
- node.args.value[1].right.expr.type === 'single_quote_string';
214
- return isInsideOfDateTrunc;
225
+ return isTheCurrentIntervalPostgres(node);
226
+ };
227
+ // "created_at" >= date_trunc ('year', CURRENT_DATE - INTERVAL '1 year')
228
+ // this year
229
+ export const isEquals = (node, databaseType) => {
230
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
231
+ return isEqualsBigQuery(node);
232
+ }
233
+ return false;
215
234
  };
216
235
  export const isThePreviousInterval = (node, databaseType) => {
217
236
  const isInsideOfDateTrunc = ['='].includes(node.operator) &&
@@ -220,21 +239,11 @@ export const isThePreviousInterval = (node, databaseType) => {
220
239
  node.left.type === 'function' &&
221
240
  node.right.name &&
222
241
  node.right.name.toLowerCase() === 'timestamp_trunc' &&
223
- node.right.args.value[0].name.toLowerCase() === 'timestamp_sub' &&
242
+ node.right.args.value[0]?.name?.toLowerCase() === 'timestamp_sub' &&
224
243
  node.right.args.value[0].args.value[0].name.toLowerCase() ===
225
244
  'current_timestamp';
226
245
  return isInsideOfDateTrunc;
227
246
  };
228
- export const isTheCurrentIntervalBigQuery = (node) => {
229
- const isInsideOfDateTrunc = ['='].includes(node.operator) &&
230
- node.left.type === 'function' &&
231
- node.left.name &&
232
- node.left.name.toLowerCase() === 'timestamp_trunc' &&
233
- node.right.type === 'function' &&
234
- node.right.name.toLowerCase() === 'timestamp_trunc' &&
235
- node.right.args.value[0].name.toLowerCase() === 'current_timestamp';
236
- return isInsideOfDateTrunc;
237
- };
238
247
  /**
239
248
  * Returns whether this node is the root of a binary expression
240
249
  * where the left child is a string but really should be
@@ -355,7 +364,7 @@ export function extractSuffixToString(node) {
355
364
  }
356
365
  }
357
366
  export function tryConvertDateEquality(node, databaseType) {
358
- if (isDateTruncEquals(node)) {
367
+ if (isDateTruncEquals(node, databaseType)) {
359
368
  const columnNode = node.left.args.value[1];
360
369
  const columnName = columnNode.column ?? columnNode.value;
361
370
  const cleanColumnName = snakeCaseToTitleCase(columnName.replaceAll('_at', ''));
@@ -375,7 +384,7 @@ export function tryConvertDateEquality(node, databaseType) {
375
384
  * Returns whether this node is an equality of a date column with a
376
385
  * date trunc.
377
386
  */
378
- export const isDateTruncEquals = (node) => {
387
+ export const isDateTruncEquals = (node, databaseType) => {
379
388
  return (node.type === 'binary_expr' &&
380
389
  node.operator === '=' &&
381
390
  isDateTrunc(node.left) &&
@@ -627,18 +636,29 @@ function getNodeTable(node) {
627
636
  return null;
628
637
  }
629
638
  // Recursively remove filters that don't apply to the given table
630
- function removeNonSelectedTableFilters(node, table) {
639
+ function removeNonSelectedTableFilters(node, table, columns) {
631
640
  if (node.left.type !== 'binary_expr') {
632
641
  const referencedTable = getNodeTable(node.left);
633
- if (referencedTable && referencedTable !== table) {
642
+ const referencedColumn = node.left.column ||
643
+ node.left.value ||
644
+ node.left.args?.value[0]?.column ||
645
+ node.left.args?.value[0]?.value;
646
+ if ((referencedTable && referencedTable !== table) ||
647
+ !columns.includes(referencedColumn)) {
634
648
  return null;
635
649
  }
636
650
  else {
651
+ if (node.left.value) {
652
+ node.left.column = node.left.value;
653
+ }
654
+ else if (node.left.args?.value[0].value) {
655
+ node.left.args.value[0].column = node.left.args.value[0].value;
656
+ }
637
657
  return node;
638
658
  }
639
659
  }
640
- node.left = removeNonSelectedTableFilters(node.left, table);
641
- node.right = removeNonSelectedTableFilters(node.right, table);
660
+ node.left = removeNonSelectedTableFilters(node.left, table, columns);
661
+ node.right = removeNonSelectedTableFilters(node.right, table, columns);
642
662
  if (node.left && node.right) {
643
663
  return node;
644
664
  }
@@ -652,14 +672,13 @@ function removeNonSelectedTableFilters(node, table) {
652
672
  return null;
653
673
  }
654
674
  }
655
- export function removeNonSelectedTableReferences(ast, table) {
675
+ export function removeNonSelectedTableReferences(ast, table, columns) {
656
676
  ast.columns = ast.columns.filter((col) => {
657
677
  return col.table === table || col.expr.table === table || !col.expr.table;
658
678
  });
659
679
  if (!ast.where)
660
680
  return ast;
661
- ast.where = removeNonSelectedTableFilters(ast.where, table);
662
- console.log(ast);
681
+ ast.where = removeNonSelectedTableFilters(ast.where, table, columns);
663
682
  return ast;
664
683
  }
665
684
  export function allNumericNodesValidInTree(node) {
@@ -667,7 +686,6 @@ export function allNumericNodesValidInTree(node) {
667
686
  return true;
668
687
  if (node.type === 'number') {
669
688
  const value = parseFloat(node.value);
670
- console.log(node.value, value);
671
689
  if (Number.isNaN(value)) {
672
690
  return false;
673
691
  }
@@ -680,3 +698,32 @@ export function allNumericNodesValidInTree(node) {
680
698
  const isRightValid = allNumericNodesValidInTree(node.right);
681
699
  return isLeftValid && isRightValid;
682
700
  }
701
+ export function isIdColumn(columnName) {
702
+ return (columnName &&
703
+ (columnName.toLowerCase() === 'id' ||
704
+ columnName.toLowerCase().endsWith('_id') ||
705
+ columnName.endsWith('Id')));
706
+ }
707
+ // This function determines if a node is a custom node type.
708
+ // This will parse out date filters and some numeric filters that are unique (between).
709
+ export function getCustomSentence(node, databaseType) {
710
+ if (isTheCurrentInterval(node, databaseType)) {
711
+ return getInTheCurrentIntervalSentence(node, databaseType);
712
+ }
713
+ else if (isInTheLastInterval(node, databaseType)) {
714
+ return getInTheLastIntervalSentence(node, databaseType);
715
+ }
716
+ else if (isAfter(node, databaseType)) {
717
+ return getIsAfterSentence(node, databaseType);
718
+ }
719
+ else if (isBefore(node, databaseType)) {
720
+ return getIsBeforeSentence(node, databaseType);
721
+ }
722
+ else if (isThePreviousInterval(node, databaseType)) {
723
+ return getInThePreviousIntervalSentence(node, databaseType);
724
+ }
725
+ else if (isEquals(node, databaseType)) {
726
+ return getIsEqualsSentence(node, databaseType);
727
+ }
728
+ return null;
729
+ }