@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.
- package/dist/cjs/Chart.d.ts +109 -42
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +44 -18
- package/dist/cjs/ChartBuilder.d.ts +204 -30
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +124 -63
- package/dist/cjs/ChartEditor.d.ts +123 -19
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +47 -15
- package/dist/cjs/Dashboard.d.ts +148 -91
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +51 -159
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +5 -2
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/cjs/QuillProvider.d.ts +105 -2
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +59 -0
- package/dist/cjs/ReportBuilder.d.ts +194 -42
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +563 -416
- package/dist/cjs/SQLEditor.d.ts +160 -23
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +36 -30
- package/dist/cjs/Table.d.ts +119 -15
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +37 -6
- package/dist/cjs/TableChart.d.ts.map +1 -1
- package/dist/cjs/TableChart.js +0 -194
- package/dist/cjs/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -0
- package/dist/cjs/{BarList.js → components/Chart/BarList.js} +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -3
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +3 -3
- package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -0
- package/dist/cjs/{PieChart.js → components/Chart/PieChart.js} +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +2 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +6 -7
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +22 -0
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/cjs/components/Dashboard/DashboardFilter.js +75 -0
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts +2 -12
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +39 -17
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +6 -9
- package/dist/cjs/components/QuillCard.d.ts +2 -7
- package/dist/cjs/components/QuillCard.d.ts.map +1 -1
- package/dist/cjs/components/QuillCard.js +15 -9
- package/dist/cjs/components/QuillSelect.d.ts +4 -1
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +13 -8
- package/dist/cjs/components/QuillTable.d.ts +16 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +4 -4
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +10 -6
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +5 -15
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +21 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +15 -17
- package/dist/cjs/components/ReportBuilder/bigDateMap.js +1 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +3 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +60 -21
- package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -10
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +23 -10
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +82 -18
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +55 -103
- package/dist/cjs/components/ReportBuilder/util.d.ts +10 -4
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +124 -71
- package/dist/cjs/components/UiComponents.d.ts +81 -87
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +76 -103
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.d.ts.map +1 -1
- package/dist/cjs/hooks/index.js +3 -1
- package/dist/cjs/hooks/useTheme.d.ts +7 -0
- package/dist/cjs/hooks/useTheme.d.ts.map +1 -0
- package/dist/cjs/hooks/useTheme.js +12 -0
- package/dist/cjs/index.d.ts +10 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +5 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -21
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +30 -14
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +77 -52
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +2 -0
- package/dist/cjs/utils/parserBigQuery.d.ts +6 -0
- package/dist/cjs/utils/parserBigQuery.d.ts.map +1 -0
- package/dist/cjs/utils/parserBigQuery.js +60 -0
- package/dist/cjs/utils/parserPostgres.d.ts +3 -0
- package/dist/cjs/utils/parserPostgres.d.ts.map +1 -0
- package/dist/cjs/utils/parserPostgres.js +42 -0
- package/dist/esm/Chart.d.ts +109 -42
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +45 -19
- package/dist/esm/ChartBuilder.d.ts +204 -30
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +124 -63
- package/dist/esm/ChartEditor.d.ts +123 -19
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +51 -19
- package/dist/esm/Dashboard.d.ts +148 -91
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +54 -160
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +6 -3
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/esm/QuillProvider.d.ts +105 -2
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +59 -0
- package/dist/esm/ReportBuilder.d.ts +194 -42
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +566 -419
- package/dist/esm/SQLEditor.d.ts +160 -23
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +36 -30
- package/dist/esm/Table.d.ts +119 -15
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +38 -7
- package/dist/esm/TableChart.d.ts.map +1 -1
- package/dist/esm/TableChart.js +0 -194
- package/dist/esm/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
- package/dist/esm/{BarList.js → components/Chart/BarList.js} +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts +2 -3
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +3 -3
- package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
- package/dist/esm/{PieChart.js → components/Chart/PieChart.js} +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +2 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +5 -6
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +22 -0
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/esm/components/Dashboard/DashboardFilter.js +71 -0
- package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.d.ts +2 -12
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +39 -17
- package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +6 -9
- package/dist/esm/components/QuillCard.d.ts +2 -7
- package/dist/esm/components/QuillCard.d.ts.map +1 -1
- package/dist/esm/components/QuillCard.js +15 -9
- package/dist/esm/components/QuillSelect.d.ts +4 -1
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +14 -9
- package/dist/esm/components/QuillTable.d.ts +16 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +4 -4
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
- package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.js +10 -6
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +5 -15
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +21 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +17 -19
- package/dist/esm/components/ReportBuilder/bigDateMap.js +1 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts +3 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +51 -13
- package/dist/esm/components/ReportBuilder/operators.d.ts +15 -10
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +23 -10
- package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +82 -18
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +53 -101
- package/dist/esm/components/ReportBuilder/util.d.ts +10 -4
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +114 -67
- package/dist/esm/components/UiComponents.d.ts +81 -87
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +71 -102
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.d.ts.map +1 -1
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/useTheme.d.ts +7 -0
- package/dist/esm/hooks/useTheme.d.ts.map +1 -0
- package/dist/esm/hooks/useTheme.js +10 -0
- package/dist/esm/index.d.ts +10 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +5 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +21 -21
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +30 -14
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +77 -52
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +2 -0
- package/dist/esm/utils/parserBigQuery.d.ts +6 -0
- package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
- package/dist/esm/utils/parserBigQuery.js +52 -0
- package/dist/esm/utils/parserPostgres.d.ts +3 -0
- package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
- package/dist/esm/utils/parserPostgres.js +37 -0
- package/package.json +1 -1
- package/dist/cjs/BarList.d.ts.map +0 -1
- package/dist/cjs/PieChart.d.ts.map +0 -1
- package/dist/esm/BarList.d.ts.map +0 -1
- package/dist/esm/PieChart.d.ts.map +0 -1
- /package/dist/cjs/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
- /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,
|
|
3
|
-
import {
|
|
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 }) =>
|
|
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 =
|
|
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
|
-
},
|
|
109
|
+
}, children: children }));
|
|
111
110
|
// A big wrapper around the main content (ie. Input, Button, and Table)
|
|
112
|
-
export const CustomContainer =
|
|
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
|
-
},
|
|
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,
|
|
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(
|
|
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, {
|
|
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
|
-
|
|
251
|
-
|
|
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(
|
|
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,
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
|
317
|
-
return (
|
|
318
|
-
|
|
319
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
node
|
|
192
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
node
|
|
209
|
-
|
|
210
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
+
}
|