@quillsql/react 2.12.28 → 2.12.30
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 +24 -10
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +151 -189
- package/dist/cjs/ChartBuilder.d.ts +51 -11
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +162 -101
- package/dist/cjs/ChartEditor.d.ts +13 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +62 -121
- package/dist/cjs/Context.d.ts +1 -19
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +74 -85
- package/dist/cjs/Dashboard.d.ts +16 -7
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +90 -68
- package/dist/cjs/DateRangePicker/Calendar.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/Calendar.js +3 -6
- package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePicker.js +2 -3
- package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +1 -2
- package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePickerButton.js +2 -4
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -4
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -15
- package/dist/cjs/ReportBuilder.d.ts +22 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +758 -505
- package/dist/cjs/SQLEditor.d.ts +2 -9
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +142 -90
- package/dist/cjs/Table.d.ts +19 -3
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +110 -92
- package/dist/cjs/TableChart.d.ts.map +1 -1
- package/dist/cjs/TableChart.js +0 -1
- package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowDownIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowDownRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/CalendarIcon.d.ts.map +1 -1
- package/dist/cjs/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
- package/dist/cjs/assets/LoadingSpinner.d.ts.map +1 -1
- package/dist/cjs/assets/SearchIcon.d.ts.map +1 -1
- package/dist/cjs/assets/XCircleIcon.d.ts.map +1 -1
- package/dist/cjs/components/Banner/index.d.ts +1 -1
- package/dist/cjs/components/Banner/index.d.ts.map +1 -1
- package/dist/cjs/components/Banner/index.js +1 -1
- package/dist/cjs/components/BigModal/BigModal.d.ts.map +1 -1
- package/dist/cjs/components/BigModal/BigModal.js +6 -12
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarList.js +21 -14
- package/dist/cjs/components/Chart/ChartError.d.ts +8 -1
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +40 -5
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +8 -2
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +2 -2
- package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/PieChart.js +1 -3
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +5 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +10 -5
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -6
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +98 -187
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -4
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +3 -3
- package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/cjs/components/Dropdown/Dropdown.js +1 -3
- package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +1 -1
- package/dist/cjs/components/Dropdown/DropdownItem.js +3 -8
- package/dist/cjs/components/Dropdown/index.d.ts +2 -2
- package/dist/cjs/components/Modal/Modal.d.ts.map +1 -1
- package/dist/cjs/components/Modal/Modal.js +2 -3
- package/dist/cjs/components/Modal/index.d.ts +1 -1
- package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelect.js +18 -3
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +2 -2
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +2 -2
- package/dist/cjs/components/QuillTable.d.ts +1 -4
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +5 -11
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +5 -8
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -3
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +12 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +22 -0
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/FilterModal.js +555 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +33 -6
- package/dist/cjs/components/ReportBuilder/constants.d.ts +18 -3
- package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/constants.js +24 -3
- package/dist/cjs/components/ReportBuilder/convert.d.ts +12 -15
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +326 -494
- package/dist/cjs/components/ReportBuilder/operators.d.ts +24 -4
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +32 -4
- package/dist/cjs/components/ReportBuilder/ui.d.ts +20 -0
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +30 -4
- package/dist/cjs/components/ReportBuilder/util.d.ts +3 -11
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +15 -18
- package/dist/cjs/components/UiComponents.d.ts +10 -7
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +9 -8
- package/dist/cjs/components/selectUtils.d.ts +0 -1
- package/dist/cjs/components/selectUtils.d.ts.map +1 -1
- package/dist/cjs/components/selectUtils.js +1 -22
- package/dist/cjs/hooks/index.d.ts +4 -4
- package/dist/cjs/hooks/useAstToFilterTree.d.ts +11 -0
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -0
- package/dist/cjs/hooks/useAstToFilterTree.js +26 -0
- package/dist/cjs/hooks/useDashboard.d.ts +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +22 -4
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +3 -1
- package/dist/cjs/hooks/useOnClickOutside.js +4 -4
- package/dist/cjs/hooks/useOnWindowResize.d.ts.map +1 -1
- package/dist/cjs/hooks/useOnWindowResize.js +2 -2
- package/dist/cjs/hooks/useQuill.d.ts +10 -27
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +114 -82
- package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/cjs/hooks/useSelectOnKeyDown.js +4 -4
- package/dist/cjs/hooks/useTheme.js +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +8 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +2 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +2 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +64 -78
- package/dist/cjs/lib/utils.js +2 -2
- package/dist/cjs/models/Filter.d.ts +104 -4
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +91 -0
- package/dist/cjs/models/Pagination.d.ts +10 -0
- package/dist/cjs/models/Pagination.d.ts.map +1 -0
- package/dist/cjs/models/Pagination.js +2 -0
- package/dist/cjs/models/Report.d.ts +116 -0
- package/dist/cjs/models/Report.d.ts.map +1 -0
- package/dist/cjs/models/Report.js +2 -0
- package/dist/cjs/utils/aggregate.js +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts +36 -0
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/astFilterProcessing.js +8056 -0
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +4 -3
- package/dist/cjs/utils/axisFormatter.js +0 -71
- package/dist/cjs/utils/color.js +9 -87
- package/dist/cjs/utils/columnProcessing.d.ts +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +8 -1
- package/dist/cjs/utils/csv.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +4 -4
- package/dist/cjs/utils/dataFetcher.d.ts +1 -1
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +72 -5
- package/dist/cjs/utils/dataProcessing.d.ts +8 -0
- package/dist/cjs/utils/dataProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/dataProcessing.js +127 -0
- package/dist/cjs/utils/dates.d.ts +2 -1
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +12 -3
- package/dist/cjs/utils/error.d.ts +5 -0
- package/dist/cjs/utils/error.d.ts.map +1 -0
- package/dist/cjs/utils/error.js +12 -0
- package/dist/cjs/utils/filterConstants.d.ts +34 -0
- package/dist/cjs/utils/filterConstants.d.ts.map +1 -0
- package/dist/cjs/utils/filterConstants.js +36 -0
- package/dist/cjs/utils/filterProcessing.js +4 -4
- package/dist/cjs/utils/logging.d.ts.map +1 -1
- package/dist/cjs/utils/logging.js +1 -0
- package/dist/cjs/utils/merge.js +0 -21
- package/dist/cjs/utils/monacoConfig.d.ts +21 -0
- package/dist/cjs/utils/monacoConfig.d.ts.map +1 -0
- package/dist/cjs/utils/monacoConfig.js +324 -0
- package/dist/cjs/utils/paginationProcessing.d.ts +5 -0
- package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/paginationProcessing.js +30 -0
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +67 -5
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +12 -6
- package/dist/cjs/utils/queryConstructor.d.ts +4 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +121 -59
- package/dist/cjs/utils/report.d.ts +7 -0
- package/dist/cjs/utils/report.d.ts.map +1 -0
- package/dist/cjs/utils/report.js +93 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +35 -6
- package/dist/cjs/utils/styles.d.ts +1 -1
- package/dist/cjs/utils/styles.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.d.ts +23 -8
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +156 -38
- package/dist/cjs/utils/textProcessing.js +3 -3
- package/dist/cjs/utils/validation.d.ts +9 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +24 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +8 -4
- package/dist/esm/Chart.d.ts +24 -10
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +154 -192
- package/dist/esm/ChartBuilder.d.ts +51 -11
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +161 -101
- package/dist/esm/ChartEditor.d.ts +13 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +63 -122
- package/dist/esm/Context.d.ts +1 -19
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +74 -84
- package/dist/esm/Dashboard.d.ts +16 -7
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +91 -69
- package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/Calendar.js +5 -8
- package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePicker.js +2 -3
- package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +1 -2
- package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePickerButton.js +2 -4
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -4
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -15
- package/dist/esm/ReportBuilder.d.ts +22 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +766 -513
- package/dist/esm/SQLEditor.d.ts +2 -9
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +144 -92
- package/dist/esm/Table.d.ts +19 -3
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +112 -94
- package/dist/esm/TableChart.d.ts.map +1 -1
- package/dist/esm/TableChart.js +0 -1
- package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/CalendarIcon.d.ts.map +1 -1
- package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
- package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -1
- package/dist/esm/assets/SearchIcon.d.ts.map +1 -1
- package/dist/esm/assets/XCircleIcon.d.ts.map +1 -1
- package/dist/esm/components/Banner/index.d.ts +1 -1
- package/dist/esm/components/Banner/index.d.ts.map +1 -1
- package/dist/esm/components/Banner/index.js +1 -1
- package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -1
- package/dist/esm/components/BigModal/BigModal.js +7 -13
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarList.js +21 -14
- package/dist/esm/components/Chart/ChartError.d.ts +8 -1
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +39 -6
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +8 -2
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +2 -2
- package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/PieChart.js +1 -3
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +5 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +10 -5
- package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -6
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +98 -187
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -4
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +3 -3
- package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/esm/components/Dropdown/Dropdown.js +2 -4
- package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
- package/dist/esm/components/Dropdown/DropdownItem.js +4 -9
- package/dist/esm/components/Dropdown/index.d.ts +2 -2
- package/dist/esm/components/Dropdown/index.js +2 -2
- package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
- package/dist/esm/components/Modal/Modal.js +2 -3
- package/dist/esm/components/Modal/index.d.ts +1 -1
- package/dist/esm/components/Modal/index.js +1 -1
- package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelect.js +18 -3
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +2 -2
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +2 -2
- package/dist/esm/components/QuillTable.d.ts +1 -4
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +5 -11
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +8 -11
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -4
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +12 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +22 -0
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/FilterModal.js +552 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +31 -5
- package/dist/esm/components/ReportBuilder/constants.d.ts +18 -3
- package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/constants.js +24 -3
- package/dist/esm/components/ReportBuilder/convert.d.ts +12 -15
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +324 -493
- package/dist/esm/components/ReportBuilder/convert.uspec.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.js +1152 -0
- package/dist/esm/components/ReportBuilder/operators.d.ts +24 -4
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +32 -4
- package/dist/esm/components/ReportBuilder/ui.d.ts +20 -0
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +28 -3
- package/dist/esm/components/ReportBuilder/util.d.ts +3 -11
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +16 -19
- package/dist/esm/components/UiComponents.d.ts +10 -7
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +9 -8
- package/dist/esm/components/selectUtils.d.ts +0 -1
- package/dist/esm/components/selectUtils.d.ts.map +1 -1
- package/dist/esm/components/selectUtils.js +0 -20
- package/dist/esm/hooks/index.d.ts +4 -4
- package/dist/esm/hooks/index.js +4 -4
- package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
- package/dist/esm/hooks/useAstToFilterTree.js +24 -0
- package/dist/esm/hooks/useDashboard.d.ts +1 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +23 -5
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +4 -2
- package/dist/esm/hooks/useOnClickOutside.js +5 -5
- package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -1
- package/dist/esm/hooks/useOnWindowResize.js +3 -3
- package/dist/esm/hooks/useQuill.d.ts +10 -27
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +114 -82
- package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/esm/hooks/useSelectOnKeyDown.js +5 -5
- package/dist/esm/hooks/useTheme.js +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +2 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +68 -82
- package/dist/esm/lib/utils.js +2 -2
- package/dist/esm/models/Filter.d.ts +104 -4
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +90 -1
- package/dist/esm/models/Pagination.d.ts +10 -0
- package/dist/esm/models/Pagination.d.ts.map +1 -0
- package/dist/esm/models/Pagination.js +1 -0
- package/dist/esm/models/Report.d.ts +116 -0
- package/dist/esm/models/Report.d.ts.map +1 -0
- package/dist/esm/models/Report.js +1 -0
- package/dist/esm/utils/aggregate.js +1 -1
- package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
- package/dist/esm/utils/astFilterProcessing.js +8049 -0
- package/dist/esm/utils/astFilterProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/astFilterProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/astFilterProcessing.uspec.js +2729 -0
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +4 -3
- package/dist/esm/utils/axisFormatter.js +0 -71
- package/dist/esm/utils/color.js +9 -87
- package/dist/esm/utils/columnProcessing.d.ts +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +6 -0
- package/dist/esm/utils/csv.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +4 -4
- package/dist/esm/utils/dataFetcher.d.ts +1 -1
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +72 -5
- package/dist/esm/utils/dataProcessing.d.ts +8 -0
- package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
- package/dist/esm/utils/dataProcessing.js +122 -0
- package/dist/esm/utils/dataProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/dataProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/dataProcessing.uspec.js +204 -0
- package/dist/esm/utils/dates.d.ts +2 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +10 -2
- package/dist/esm/utils/error.d.ts +5 -0
- package/dist/esm/utils/error.d.ts.map +1 -0
- package/dist/esm/utils/error.js +8 -0
- package/dist/esm/utils/filterConstants.d.ts +34 -0
- package/dist/esm/utils/filterConstants.d.ts.map +1 -0
- package/dist/esm/utils/filterConstants.js +33 -0
- package/dist/esm/utils/filterProcessing.js +4 -4
- package/dist/esm/utils/logging.d.ts.map +1 -1
- package/dist/esm/utils/logging.js +1 -0
- package/dist/esm/utils/merge.js +0 -21
- package/dist/esm/utils/monacoConfig.d.ts +21 -0
- package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
- package/dist/esm/utils/monacoConfig.js +319 -0
- package/dist/esm/utils/paginationProcessing.d.ts +5 -0
- package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
- package/dist/esm/utils/paginationProcessing.js +25 -0
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +67 -5
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +12 -6
- package/dist/esm/utils/queryConstructor.d.ts +4 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +118 -58
- package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.uspec.js +223 -0
- package/dist/esm/utils/report.d.ts +7 -0
- package/dist/esm/utils/report.d.ts.map +1 -0
- package/dist/esm/utils/report.ispec.d.ts +2 -0
- package/dist/esm/utils/report.ispec.d.ts.map +1 -0
- package/dist/esm/utils/report.ispec.js +46 -0
- package/dist/esm/utils/report.js +88 -0
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +35 -6
- package/dist/esm/utils/styles.d.ts +1 -1
- package/dist/esm/utils/styles.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.d.ts +23 -8
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.ispec.d.ts +2 -0
- package/dist/esm/utils/tableProcessing.ispec.d.ts.map +1 -0
- package/dist/esm/utils/tableProcessing.ispec.js +61 -0
- package/dist/esm/utils/tableProcessing.js +152 -37
- package/dist/esm/utils/textProcessing.js +3 -3
- package/dist/esm/utils/validation.d.ts +9 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +20 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +8 -4
- package/package.json +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.convertRemoveSimpleParentheses = exports.convertStringComparison = exports.
|
|
3
|
+
exports.convertRemoveSimpleParentheses = exports.convertStringComparison = exports.convertGroupBy = exports.convertASTToPivotData = exports.convertColumnToGenericColumns = exports.convertWildcardColumns = exports.convertBigQuery = exports.recursiveSearchAndReplaceByKey = exports.recursiveSearchAndReplace = exports.convertDateComparison = void 0;
|
|
4
|
+
const date_fns_1 = require("date-fns");
|
|
4
5
|
const PivotModal_1 = require("../../internals/ReportBuilder/PivotModal");
|
|
5
6
|
const ast_1 = require("./ast");
|
|
6
7
|
const util_1 = require("./util");
|
|
8
|
+
const columnProcessing_1 = require("../../utils/columnProcessing");
|
|
7
9
|
// Helper functions that preprocess the AST.
|
|
8
10
|
// Find and replace certain pre-set date comparison queries with their
|
|
9
11
|
// more stable counterparts.
|
|
@@ -71,7 +73,7 @@ exports.recursiveSearchAndReplaceByKey = recursiveSearchAndReplaceByKey;
|
|
|
71
73
|
function convertBigQuery(ast) {
|
|
72
74
|
// For BigQuery, the info we want is nested inside the 'select' key
|
|
73
75
|
if ((0, ast_1.isBigQuery)(ast)) {
|
|
74
|
-
|
|
76
|
+
const newAst = ast.select;
|
|
75
77
|
newAst.from?.forEach((tbl) => {
|
|
76
78
|
tbl.table = tbl.table.replaceAll('`', '');
|
|
77
79
|
});
|
|
@@ -92,7 +94,7 @@ function convertBigQuery(ast) {
|
|
|
92
94
|
recursiveSearchAndReplaceByKey(newAst.where, 'week', '* 7 DAY', 'unit');
|
|
93
95
|
recursiveSearchAndReplaceByKey(newAst.where, 'month', '* 30 DAY', 'unit');
|
|
94
96
|
// TODO: handle joins nicely
|
|
95
|
-
if (newAst.from
|
|
97
|
+
if (newAst.from && newAst.from.length > 1) {
|
|
96
98
|
newAst.from = [newAst.from[0]];
|
|
97
99
|
}
|
|
98
100
|
// TODO: handle UNION ALL joins
|
|
@@ -103,7 +105,7 @@ function convertBigQuery(ast) {
|
|
|
103
105
|
}
|
|
104
106
|
else {
|
|
105
107
|
// TODO: handle joins nicely
|
|
106
|
-
if (ast.from
|
|
108
|
+
if (ast.from && ast.from.length > 1) {
|
|
107
109
|
ast.from = [ast.from[0]];
|
|
108
110
|
}
|
|
109
111
|
// TODO: handle UNION ALL joins
|
|
@@ -114,12 +116,18 @@ function convertBigQuery(ast) {
|
|
|
114
116
|
}
|
|
115
117
|
}
|
|
116
118
|
exports.convertBigQuery = convertBigQuery;
|
|
119
|
+
function columnExistsInNewColumns(columns, col) {
|
|
120
|
+
return columns.find((c) => [c.expr?.value, c.expr?.column, c.expr?.column?.expr?.value, c.as].includes(col));
|
|
121
|
+
}
|
|
117
122
|
/**
|
|
118
123
|
* Replaces the wildcard column selector with their literal column names.
|
|
119
124
|
*/
|
|
120
125
|
function convertWildcardColumns(ast, schemaTables) {
|
|
121
|
-
if (ast.columns !== '*' &&
|
|
126
|
+
if (ast.columns !== '*' &&
|
|
127
|
+
ast.columns.length !== 0 &&
|
|
128
|
+
(!ast.columns[0].expr || ast.columns[0].expr.column !== '*')) {
|
|
122
129
|
return ast;
|
|
130
|
+
}
|
|
123
131
|
if (!ast.from)
|
|
124
132
|
return ast;
|
|
125
133
|
// Map SELECT(*) to their actual columns
|
|
@@ -142,348 +150,64 @@ function convertWildcardColumns(ast, schemaTables) {
|
|
|
142
150
|
}
|
|
143
151
|
exports.convertWildcardColumns = convertWildcardColumns;
|
|
144
152
|
/**
|
|
145
|
-
*
|
|
146
|
-
* and a list of tables in the schema.
|
|
153
|
+
* Take a list of AST column objects of any form and turn them into the generic select form
|
|
147
154
|
*/
|
|
148
|
-
function
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
function convertColumnToGenericColumns(astColumns) {
|
|
156
|
+
const genericColumnReferences = [];
|
|
157
|
+
astColumns.forEach((column) => {
|
|
158
|
+
const columnName = (0, ast_1.getColumnName)(column);
|
|
159
|
+
if (!columnName) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
genericColumnReferences.push({
|
|
163
|
+
type: 'expr',
|
|
164
|
+
expr: {
|
|
165
|
+
type: 'column_ref',
|
|
166
|
+
table: null,
|
|
167
|
+
column: columnName,
|
|
168
|
+
},
|
|
169
|
+
as: columnName,
|
|
170
|
+
});
|
|
159
171
|
});
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
// If there was a pivot before, evaluate the pivot.
|
|
171
|
-
if (prevPivot) {
|
|
172
|
-
// Make sure that the AST includes all the columns on the prevPivot
|
|
173
|
-
const columnAlreadyExists = (col) => ast.columns.find((c) => [c.expr?.value, c.expr?.column, c.as].includes(col));
|
|
174
|
-
if (prevPivot.valueField) {
|
|
175
|
-
const existingCol = columnAlreadyExists(prevPivot.valueField);
|
|
176
|
-
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.valueField));
|
|
177
|
-
}
|
|
178
|
-
if (prevPivot.rowField) {
|
|
179
|
-
const existingCol = columnAlreadyExists(prevPivot.rowField);
|
|
180
|
-
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.rowField));
|
|
181
|
-
}
|
|
182
|
-
if (prevPivot.columnField) {
|
|
183
|
-
const existingCol = columnAlreadyExists(prevPivot.columnField);
|
|
184
|
-
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.columnField));
|
|
185
|
-
}
|
|
186
|
-
ast.columns = newColumns;
|
|
187
|
-
return { pivot: prevPivot, ast };
|
|
172
|
+
return genericColumnReferences;
|
|
173
|
+
}
|
|
174
|
+
exports.convertColumnToGenericColumns = convertColumnToGenericColumns;
|
|
175
|
+
function cleanASTColumns(ast, columns) {
|
|
176
|
+
let newColumns = convertColumnToGenericColumns(ast.columns);
|
|
177
|
+
const columnNames = [];
|
|
178
|
+
newColumns = newColumns.filter((col) => {
|
|
179
|
+
if (!columnNames.includes(col.as)) {
|
|
180
|
+
columnNames.push(col.as);
|
|
181
|
+
return true;
|
|
188
182
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
// Extract out the column name, note that there are several ways
|
|
192
|
-
// that a column node could be structured so we need to check.
|
|
193
|
-
let columnName;
|
|
194
|
-
let columnAs = null;
|
|
195
|
-
let columnTable = null;
|
|
196
|
-
if (column.type === 'expr') {
|
|
197
|
-
columnAs = column.as;
|
|
198
|
-
columnTable = column.expr.table;
|
|
199
|
-
if (column.expr.type === 'column_ref') {
|
|
200
|
-
columnName = column.expr.column;
|
|
201
|
-
}
|
|
202
|
-
else if (column.expr.type === 'string') {
|
|
203
|
-
columnName = column.expr.value;
|
|
204
|
-
}
|
|
205
|
-
else if (column.expr.type === 'double_quote_string') {
|
|
206
|
-
columnName = column.expr?.value;
|
|
207
|
-
}
|
|
208
|
-
else if (column.expr?.args?.expr) {
|
|
209
|
-
columnName = column.expr?.args?.expr?.value;
|
|
210
|
-
}
|
|
211
|
-
if (column.expr.type === 'aggr_func' && !(0, util_1.isIdColumn)(columnName)) {
|
|
212
|
-
pivot.aggregationType = column.expr.name.toLowerCase();
|
|
213
|
-
if (pivot.aggregationType === 'avg') {
|
|
214
|
-
pivot.aggregationType = 'average';
|
|
215
|
-
}
|
|
216
|
-
pivot.valueField =
|
|
217
|
-
column.expr.args?.expr?.value || column.expr.args?.expr?.column;
|
|
218
|
-
if (column.expr.args.expr.type === 'column_ref') {
|
|
219
|
-
columnTable = column.expr.args.expr.table;
|
|
220
|
-
columnName = column.expr.args.expr.column;
|
|
221
|
-
}
|
|
222
|
-
else if (column.expr.args.expr.type === 'double_quote_string') {
|
|
223
|
-
columnName = column.expr.args.expr?.value;
|
|
224
|
-
}
|
|
225
|
-
else if (column.expr?.args?.expr) {
|
|
226
|
-
columnName = column.expr?.args?.expr?.value;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
if (columnName === '*') {
|
|
231
|
-
// Use the first numeric column found, if none found, use the first column
|
|
232
|
-
let columnForValueField = columns.find((c) => {
|
|
233
|
-
return (0, ast_1.isNumericColumnType)(c.fieldType) && !(0, util_1.isIdColumn)(c.field);
|
|
234
|
-
});
|
|
235
|
-
if (!columnForValueField) {
|
|
236
|
-
columnForValueField = columns[0];
|
|
237
|
-
}
|
|
238
|
-
for (let i = 0; i < columns.length; i++) {
|
|
239
|
-
if (!(0, util_1.isIdColumn)(columns[i]?.field) &&
|
|
240
|
-
(0, ast_1.isNumericColumnType)(columns[i]?.fieldType)) {
|
|
241
|
-
columnForValueField = columns[i];
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
pivot.valueField = columnForValueField.field;
|
|
246
|
-
// pivot.valueFieldType = 'number';
|
|
247
|
-
columnName = columnForValueField.field;
|
|
248
|
-
}
|
|
249
|
-
newColumns.push({
|
|
250
|
-
type: 'expr',
|
|
251
|
-
expr: {
|
|
252
|
-
type: 'column_ref',
|
|
253
|
-
table: columnTable,
|
|
254
|
-
column: columnName,
|
|
255
|
-
},
|
|
256
|
-
as: columnName,
|
|
257
|
-
});
|
|
183
|
+
else {
|
|
184
|
+
return false;
|
|
258
185
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
186
|
+
});
|
|
187
|
+
newColumns = newColumns.filter((col) => columns.find((c) => c.field === col.as));
|
|
188
|
+
return newColumns;
|
|
189
|
+
}
|
|
190
|
+
function addAllPivotColumnsToColumnAST(astColumns, pivot) {
|
|
191
|
+
if (!pivot) {
|
|
192
|
+
return;
|
|
263
193
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const field = columns.find((c) => c.field === column.expr?.args?.expr?.column ||
|
|
268
|
-
c.field === column.expr?.args?.expr?.value);
|
|
269
|
-
if (column?.expr?.type === 'aggr_func') {
|
|
270
|
-
// CASE WHEN
|
|
271
|
-
if (column.expr?.args?.expr?.type.toLowerCase() === 'case' &&
|
|
272
|
-
['double_quote_string', 'column_ref'].includes(column.expr?.args?.expr?.args[0]?.result?.type)) {
|
|
273
|
-
// The result of the CASE is the column to use
|
|
274
|
-
const columnNode = column.expr?.args?.expr?.args[0]?.result;
|
|
275
|
-
const columnName = columnNode?.value ?? columnNode?.column;
|
|
276
|
-
if (!(0, util_1.isIdColumn)(columnName)) {
|
|
277
|
-
pivot.valueField = columnName;
|
|
278
|
-
pivot.aggregationType = column?.expr?.name?.toLowerCase();
|
|
279
|
-
if (pivot.aggregationType === 'avg') {
|
|
280
|
-
pivot.aggregationType = 'average';
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
|
|
284
|
-
if (!newColumns.find(findByName)) {
|
|
285
|
-
newColumns.push({
|
|
286
|
-
type: 'expr',
|
|
287
|
-
expr: {
|
|
288
|
-
type: 'column_ref',
|
|
289
|
-
table: null,
|
|
290
|
-
column: columnName,
|
|
291
|
-
},
|
|
292
|
-
as: null,
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
// We need to extract a column name from the condition expression of
|
|
296
|
-
// the CASE and we'll use that as the columnField in our pivot.
|
|
297
|
-
const condNode = column.expr?.args?.expr?.args[0]?.cond;
|
|
298
|
-
const condColumnName = condNode.left?.column ?? condNode.left?.value;
|
|
299
|
-
if (!(0, util_1.isIdColumn)(condColumnName)) {
|
|
300
|
-
pivot.columnField = condColumnName;
|
|
301
|
-
}
|
|
302
|
-
const findByColName = (x) => [x.expr?.value, x.expr?.column].includes(condColumnName);
|
|
303
|
-
if (!newColumns.find(findByColName)) {
|
|
304
|
-
// Make sure the column we extracted is in our column list.
|
|
305
|
-
newColumns.push({
|
|
306
|
-
type: 'expr',
|
|
307
|
-
expr: {
|
|
308
|
-
type: 'column_ref',
|
|
309
|
-
table: null,
|
|
310
|
-
column: condColumnName,
|
|
311
|
-
},
|
|
312
|
-
as: null,
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
// REGULAR
|
|
316
|
-
}
|
|
317
|
-
else if (
|
|
318
|
-
// sum("amount")
|
|
319
|
-
column.expr?.args?.expr?.type === 'double_quote_string' ||
|
|
320
|
-
// sum(amount)
|
|
321
|
-
column.expr?.args?.expr?.type === 'column_ref' ||
|
|
322
|
-
// count(*)
|
|
323
|
-
column.expr?.args?.expr?.type === 'star') {
|
|
324
|
-
const columnNode = column.expr?.args?.expr;
|
|
325
|
-
const columnName = columnNode?.value || columnNode?.column;
|
|
326
|
-
// if count(*), make the value field an actual column
|
|
327
|
-
if (columnName === '*') {
|
|
328
|
-
let columnForValueField = columns.find((c) => {
|
|
329
|
-
return (0, ast_1.isNumericColumnType)(c.fieldType) && !(0, util_1.isIdColumn)(c.field);
|
|
330
|
-
});
|
|
331
|
-
// if there aren't any numeric columns use the first column
|
|
332
|
-
if (!column) {
|
|
333
|
-
columnForValueField = columns[0];
|
|
334
|
-
}
|
|
335
|
-
pivot.valueField = columnForValueField?.field;
|
|
336
|
-
// pivot.valueFieldType = 'number';
|
|
337
|
-
pivot.aggregationType = column?.expr?.name.toLowerCase();
|
|
338
|
-
if (pivot.aggregationType === 'avg') {
|
|
339
|
-
pivot.aggregationType = 'average';
|
|
340
|
-
}
|
|
341
|
-
const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnForValueField.field);
|
|
342
|
-
if (!newColumns.find(findByName)) {
|
|
343
|
-
newColumns.push({
|
|
344
|
-
type: 'expr',
|
|
345
|
-
expr: {
|
|
346
|
-
type: 'column_ref',
|
|
347
|
-
table: null,
|
|
348
|
-
column: columnForValueField?.field || '',
|
|
349
|
-
},
|
|
350
|
-
as: null,
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
// ONLY SET VALUE FIELD IF THE FIELD TYPE IS A NUMBER
|
|
356
|
-
if ((0, ast_1.isNumericColumnType)(field?.fieldType) &&
|
|
357
|
-
!(0, util_1.isIdColumn)(columnName)) {
|
|
358
|
-
pivot.valueField = columnName;
|
|
359
|
-
pivot.aggregationType = column?.expr?.name.toLowerCase();
|
|
360
|
-
if (pivot.aggregationType === 'avg') {
|
|
361
|
-
pivot.aggregationType = 'average';
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
|
|
365
|
-
if (!newColumns.find(findByName)) {
|
|
366
|
-
newColumns.push({
|
|
367
|
-
type: 'expr',
|
|
368
|
-
expr: {
|
|
369
|
-
type: 'column_ref',
|
|
370
|
-
table: null,
|
|
371
|
-
column: columnName,
|
|
372
|
-
},
|
|
373
|
-
as: null,
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
// normal column?
|
|
380
|
-
const columnName = column.expr?.column || column.expr?.value;
|
|
381
|
-
const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
|
|
382
|
-
if (!newColumns.find(findByName)) {
|
|
383
|
-
newColumns.push(column);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
194
|
+
[pivot.valueField, pivot.rowField, pivot.columnField].forEach((field) => {
|
|
195
|
+
if (!field || columnExistsInNewColumns(astColumns, field)) {
|
|
196
|
+
return;
|
|
386
197
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
if (column.type === 'expr' &&
|
|
390
|
-
column.expr?.type.toLowerCase() === 'function' &&
|
|
391
|
-
column.expr?.name.toLowerCase() === 'date_trunc' &&
|
|
392
|
-
column.expr?.args?.type === 'expr_list' &&
|
|
393
|
-
column.as) {
|
|
394
|
-
const columnObj = column.expr?.args?.value[1];
|
|
395
|
-
const periodObj = column.expr?.args?.value[0];
|
|
396
|
-
aliasMap[column.as] = columnObj?.value ?? columnObj.column;
|
|
397
|
-
newColumns.push({
|
|
398
|
-
type: 'expr',
|
|
399
|
-
expr: {
|
|
400
|
-
type: 'function',
|
|
401
|
-
name: 'DATE_TRUNC',
|
|
402
|
-
args: {
|
|
403
|
-
type: 'expr_list',
|
|
404
|
-
value: [
|
|
405
|
-
{ type: 'single_quote_string', value: periodObj?.value },
|
|
406
|
-
{
|
|
407
|
-
type: 'column_ref',
|
|
408
|
-
table: null,
|
|
409
|
-
column: columnObj?.value ?? columnObj.column,
|
|
410
|
-
},
|
|
411
|
-
],
|
|
412
|
-
},
|
|
413
|
-
},
|
|
414
|
-
as: columnObj?.value ?? columnObj.column,
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
else if (column.type === 'expr' &&
|
|
418
|
-
column.expr?.type.toLowerCase() === 'function' &&
|
|
419
|
-
column.expr?.name.toLowerCase() === 'date' &&
|
|
420
|
-
column.expr?.args?.type === 'expr_list' &&
|
|
421
|
-
column.as) {
|
|
422
|
-
const columnObj = column.expr?.args?.value[0];
|
|
423
|
-
aliasMap[column.as] = columnObj?.value ?? columnObj.column;
|
|
424
|
-
newColumns.push({
|
|
425
|
-
type: 'expr',
|
|
426
|
-
expr: {
|
|
427
|
-
type: 'function',
|
|
428
|
-
name: 'DATE_TRUNC',
|
|
429
|
-
args: {
|
|
430
|
-
type: 'expr_list',
|
|
431
|
-
value: [
|
|
432
|
-
{ type: 'single_quote_string', value: 'day' },
|
|
433
|
-
{
|
|
434
|
-
type: 'column_ref',
|
|
435
|
-
table: null,
|
|
436
|
-
column: columnObj?.value ?? columnObj.column,
|
|
437
|
-
},
|
|
438
|
-
],
|
|
439
|
-
},
|
|
440
|
-
},
|
|
441
|
-
as: columnObj?.value ?? columnObj.column,
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
newColumns.push(column);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
else if (column.type === 'expr' &&
|
|
449
|
-
column.expr?.type.toLowerCase() === 'extract' &&
|
|
450
|
-
column.as) {
|
|
451
|
-
const cast_type = column.expr?.args.cast_type;
|
|
452
|
-
const source = column.expr?.args.source;
|
|
453
|
-
const field = column.expr?.args.field;
|
|
454
|
-
aliasMap[column.as] = source?.value ?? source.column;
|
|
455
|
-
newColumns.push({
|
|
456
|
-
type: 'expr',
|
|
457
|
-
expr: {
|
|
458
|
-
type: 'extract',
|
|
459
|
-
args: { field, cast_type, source },
|
|
460
|
-
},
|
|
461
|
-
as: source?.value ?? source.column,
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
const columnNode = column.expr;
|
|
466
|
-
newColumns.push({
|
|
467
|
-
type: 'expr',
|
|
468
|
-
expr: {
|
|
469
|
-
type: 'column_ref',
|
|
470
|
-
table: columnNode.table,
|
|
471
|
-
column: columnNode.args?.length
|
|
472
|
-
? columnNode.args?.value.find((elem) => ['double_quote_string', 'column_ref'].includes(elem.type))?.value
|
|
473
|
-
: columnNode.column ?? columnNode?.value,
|
|
474
|
-
},
|
|
475
|
-
as: null,
|
|
476
|
-
});
|
|
198
|
+
if (field && !astColumns.find((col) => col.as === field)) {
|
|
199
|
+
astColumns.push((0, util_1.generateColumnExpr)(field));
|
|
477
200
|
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
function convertGroupByToPivotData(ast, columns, aliasMap) {
|
|
204
|
+
if (!ast.groupby) {
|
|
205
|
+
return {};
|
|
478
206
|
}
|
|
479
|
-
|
|
480
|
-
// If there are no date_trunc in the GROUP BY, we also need to check
|
|
481
|
-
// to see if there was a date_trunc column that was given an alias and
|
|
482
|
-
// that alias is used in the GROUP BY (which is also set to rowField).
|
|
207
|
+
const pivot = {};
|
|
483
208
|
const isDateTrunc = (item) => ['function', 'date_trunc'].includes(item.type);
|
|
484
209
|
const isExtract = (item) => 'extract' === item.type;
|
|
485
210
|
const isCol = (x) => ['double_quote_string', 'column_ref'].includes(x.type);
|
|
486
|
-
const isAlias = (x) => isCol(x) && aliasMap[(0, ast_1.extractColumnish)(x)];
|
|
487
211
|
const dateTruncGroup = ast.groupby.find(isDateTrunc);
|
|
488
212
|
const extractGroup = ast.groupby.find(isExtract);
|
|
489
213
|
if (dateTruncGroup) {
|
|
@@ -498,15 +222,6 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
|
|
|
498
222
|
pivot.rowField = columnName;
|
|
499
223
|
pivot.rowFieldType = columns.find((c) => c.field === columnName)?.fieldType;
|
|
500
224
|
}
|
|
501
|
-
else if (aliasMap) {
|
|
502
|
-
const match = ast.groupby.find(isAlias);
|
|
503
|
-
const matchColumnish = (0, ast_1.extractColumnish)(match);
|
|
504
|
-
if (matchColumnish) {
|
|
505
|
-
const actualColumnName = aliasMap[matchColumnish];
|
|
506
|
-
pivot.rowField = actualColumnName;
|
|
507
|
-
pivot.rowFieldType = columns.find((c) => c.field === actualColumnName)?.fieldType;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
225
|
// Otherwise, set the first groupby to rowField then set
|
|
511
226
|
// next field to columnField (if there is one)
|
|
512
227
|
for (let j = 0; j < ast.groupby.length; j++) {
|
|
@@ -520,6 +235,12 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
|
|
|
520
235
|
groupValue = aliasMap[groupValue];
|
|
521
236
|
}
|
|
522
237
|
// Try to set the rowField and columnField.
|
|
238
|
+
const column = columns.find((c) => c.field === groupValue);
|
|
239
|
+
if (!column ||
|
|
240
|
+
(0, ast_1.isNumericColumnType)(column.fieldType) ||
|
|
241
|
+
(0, util_1.isIdColumn)(column.field)) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
523
244
|
if (!pivot.rowField) {
|
|
524
245
|
pivot.rowField = groupValue;
|
|
525
246
|
pivot.rowFieldType = columns.find((c) => c.field === groupValue)?.fieldType;
|
|
@@ -528,157 +249,210 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
|
|
|
528
249
|
pivot.columnField = groupValue;
|
|
529
250
|
}
|
|
530
251
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
const
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
const isPivot1D = pivot.rowField && !pivot.columnField;
|
|
544
|
-
const isRowFieldDateish = (0, util_1.isColumnDateish)(newAst.columns.find((c) => c.as === pivot?.rowField));
|
|
545
|
-
const isAutoOrderBy = isPivot1D || isRowFieldDateish;
|
|
546
|
-
newAst.orderby = isAutoOrderBy
|
|
547
|
-
? [
|
|
548
|
-
{
|
|
549
|
-
expr: { type: 'column_ref', table: null, column: pivot.rowField },
|
|
550
|
-
type: newAst.orderby !== null
|
|
551
|
-
? newAst.orderby[0]?.type ?? 'DESC'
|
|
552
|
-
: 'DESC',
|
|
553
|
-
},
|
|
554
|
-
]
|
|
555
|
-
: null;
|
|
556
|
-
// If the AI didn't generate an aggregate, add one. DO NOT ADD ID FOR VALUE FIELD
|
|
557
|
-
if (!pivot.valueField) {
|
|
558
|
-
for (let i = 0; i < newAst.columns.length; i++) {
|
|
559
|
-
const columnName = newAst.columns[i].expr?.column ||
|
|
560
|
-
newAst.columns[i].expr?.value ||
|
|
561
|
-
undefined;
|
|
562
|
-
if (columnName &&
|
|
563
|
-
!(0, util_1.isIdColumn)(columnName) &&
|
|
564
|
-
(0, ast_1.isNumericColumnType)(columns.find((c) => c.field === columnName)?.fieldType)) {
|
|
565
|
-
pivot.valueField = columnName;
|
|
566
|
-
pivot.aggregationType = 'sum';
|
|
252
|
+
return pivot;
|
|
253
|
+
}
|
|
254
|
+
function convertCaseWhenToPivotData(column) {
|
|
255
|
+
const pivot = {};
|
|
256
|
+
const columnNode = column.expr?.args?.expr?.args[0]?.result;
|
|
257
|
+
const columnName = columnNode?.value ?? columnNode?.column?.expr?.value ?? columnNode?.column;
|
|
258
|
+
if (columnName && typeof columnName === 'string') {
|
|
259
|
+
if (!(0, util_1.isIdColumn)(columnName)) {
|
|
260
|
+
pivot.valueField = columnName;
|
|
261
|
+
pivot.aggregationType = column?.expr?.name?.toLowerCase();
|
|
262
|
+
if (pivot.aggregationType === 'avg') {
|
|
263
|
+
pivot.aggregationType = 'average';
|
|
567
264
|
}
|
|
568
265
|
}
|
|
569
266
|
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
267
|
+
// We need to extract a column name from the condition expression of
|
|
268
|
+
// the CASE and we'll use that as the columnField in our pivot.
|
|
269
|
+
const condNode = column.expr?.args?.expr?.args[0]?.cond;
|
|
270
|
+
const condColumnName = condNode.left?.column?.expr?.value ??
|
|
271
|
+
condNode.left?.column ??
|
|
272
|
+
condNode.left?.value;
|
|
273
|
+
if (!(0, util_1.isIdColumn)(condColumnName)) {
|
|
274
|
+
pivot.columnField = condColumnName;
|
|
575
275
|
}
|
|
576
|
-
|
|
577
|
-
const title = (0, PivotModal_1.generatePivotTitle)(pivot);
|
|
578
|
-
return { pivot: { ...pivot, title }, ast: newAst };
|
|
276
|
+
return pivot;
|
|
579
277
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
const keys = Object.keys(rows[0]);
|
|
606
|
-
for (const row of rows) {
|
|
607
|
-
let newRow = newRows.find((r) => r[rowField] === row[rowField]);
|
|
608
|
-
if (newRow) {
|
|
609
|
-
// Aggregate the existing row with this row
|
|
610
|
-
newRow[valueField] = AGGREGATORS[aggregationType](newRow[valueField], row[valueField], newRow.count ?? 0);
|
|
611
|
-
newRow.count = (newRow.count ?? 0) + 1;
|
|
278
|
+
function convertASTToPivotData(ast, columnInfo) {
|
|
279
|
+
const newPivot = {};
|
|
280
|
+
const aliasMap = {};
|
|
281
|
+
if (ast.columns === '*') {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
ast.columns.forEach((column) => {
|
|
285
|
+
const columnName = (0, ast_1.getColumnName)(column);
|
|
286
|
+
if (!columnName) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const alias = column.as || columnName;
|
|
290
|
+
aliasMap[alias] = columnName;
|
|
291
|
+
if (column.expr?.args?.expr?.type.toLowerCase() === 'case' &&
|
|
292
|
+
['double_quote_string', 'column_ref'].includes(column.expr?.args?.expr?.args[0]?.result?.type)) {
|
|
293
|
+
const caseWhenPivot = convertCaseWhenToPivotData(column);
|
|
294
|
+
newPivot.valueField = caseWhenPivot.valueField;
|
|
295
|
+
newPivot.aggregationType = caseWhenPivot.aggregationType;
|
|
296
|
+
newPivot.columnField = caseWhenPivot.columnField;
|
|
297
|
+
}
|
|
298
|
+
else if (column.expr.type === 'aggr_func' && !(0, util_1.isIdColumn)(columnName)) {
|
|
299
|
+
const aggObj = column.expr;
|
|
300
|
+
newPivot.aggregationType = aggObj.name.toLowerCase();
|
|
301
|
+
if (newPivot.aggregationType === 'avg') {
|
|
302
|
+
newPivot.aggregationType = 'average';
|
|
612
303
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
304
|
+
newPivot.valueField = columnName;
|
|
305
|
+
}
|
|
306
|
+
else if (column.expr.type === 'function') {
|
|
307
|
+
const functionInfo = column.expr.name;
|
|
308
|
+
if (Array.isArray(functionInfo.name) &&
|
|
309
|
+
functionInfo.name[0].value &&
|
|
310
|
+
['timestamp_trunc', 'date_trunc', 'date_part'].includes(functionInfo.name[0].value.toLowerCase())) {
|
|
311
|
+
newPivot.rowField = columnName;
|
|
621
312
|
}
|
|
622
313
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
314
|
+
});
|
|
315
|
+
const pivotData = convertGroupByToPivotData(ast, columnInfo, aliasMap);
|
|
316
|
+
const finalPivot = { ...pivotData, ...newPivot };
|
|
317
|
+
const isColumnDate = columnInfo.find((column) => column.field === finalPivot?.columnField)
|
|
318
|
+
?.fieldType === 'date';
|
|
319
|
+
if (finalPivot) {
|
|
320
|
+
// Make sure date fields are set to the rowField
|
|
321
|
+
const isPivot1D = finalPivot.rowField && !finalPivot.columnField;
|
|
322
|
+
if (finalPivot.columnField && isColumnDate) {
|
|
323
|
+
[finalPivot.rowField, finalPivot.columnField] = [
|
|
324
|
+
finalPivot.columnField,
|
|
325
|
+
finalPivot.rowField,
|
|
326
|
+
];
|
|
327
|
+
finalPivot.rowFieldType = 'date';
|
|
626
328
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
const newFields = [
|
|
635
|
-
rowFieldColumnType,
|
|
636
|
-
...columnVariants.map((name) => {
|
|
637
|
-
return { ...valueFieldColumnType, name, label: name };
|
|
638
|
-
}),
|
|
639
|
-
];
|
|
640
|
-
for (const row of rows) {
|
|
641
|
-
let newRow = newRows.find((r) => r[rowField] === row[rowField]);
|
|
642
|
-
if (newRow) {
|
|
643
|
-
// Aggregate the existing row with this row
|
|
644
|
-
newRow[row[columnField]] = AGGREGATORS[aggregationType](newRow[row[columnField]], row[valueField], newRow[`${row[columnField]}_count`] ?? 0);
|
|
645
|
-
newRow[`${row[columnField]}_count`] += 1;
|
|
329
|
+
// Make sure pivot value field is of numeric type
|
|
330
|
+
if (finalPivot.valueField) {
|
|
331
|
+
const column = columnInfo.find((c) => c.field === finalPivot.valueField);
|
|
332
|
+
if (!column || !(0, ast_1.isNumericColumnType)(column.fieldType)) {
|
|
333
|
+
// @ts-ignore
|
|
334
|
+
finalPivot.valueField = null;
|
|
335
|
+
finalPivot.aggregationType = 'count';
|
|
646
336
|
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
337
|
+
}
|
|
338
|
+
if (finalPivot.rowFieldType === 'date') {
|
|
339
|
+
finalPivot.sort = true;
|
|
340
|
+
finalPivot.sortDirection = 'ASC';
|
|
341
|
+
finalPivot.sortField = finalPivot.rowField;
|
|
342
|
+
finalPivot.sortFieldType = finalPivot.rowFieldType;
|
|
343
|
+
}
|
|
344
|
+
else if (isPivot1D) {
|
|
345
|
+
finalPivot.sort = true;
|
|
346
|
+
finalPivot.sortDirection = 'ASC';
|
|
347
|
+
finalPivot.sortField = finalPivot.rowField;
|
|
348
|
+
finalPivot.sortFieldType = finalPivot.rowFieldType;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return finalPivot;
|
|
352
|
+
}
|
|
353
|
+
exports.convertASTToPivotData = convertASTToPivotData;
|
|
354
|
+
function addValueFieldToPivot(newAst, pivot, columns) {
|
|
355
|
+
if (!pivot) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (!pivot.valueField) {
|
|
359
|
+
let firstNumericNonIdColumn = undefined;
|
|
360
|
+
newAst.columns.forEach((col) => {
|
|
361
|
+
if (!(0, util_1.isIdColumn)(col.as) &&
|
|
362
|
+
(0, ast_1.isNumericColumnType)(columns.find((c) => c.field === col.as)?.fieldType)) {
|
|
363
|
+
firstNumericNonIdColumn = { ...col };
|
|
663
364
|
}
|
|
365
|
+
});
|
|
366
|
+
if (firstNumericNonIdColumn) {
|
|
367
|
+
pivot.valueField = firstNumericNonIdColumn.as;
|
|
368
|
+
pivot.aggregationType = 'sum';
|
|
664
369
|
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
370
|
+
else {
|
|
371
|
+
pivot.aggregationType = 'count';
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Processes the AST and builds up a new pivot, given the old AST, the old pivot
|
|
377
|
+
* and a list of tables in the schema.
|
|
378
|
+
*/
|
|
379
|
+
function convertGroupBy(ast, prevPivot = null, schemaTables) {
|
|
380
|
+
if (!(0, ast_1.isSelect)(ast))
|
|
381
|
+
return { ast, pivot: prevPivot };
|
|
382
|
+
let newAst = {};
|
|
383
|
+
let pivot;
|
|
384
|
+
const newColumns = [];
|
|
385
|
+
const tableNamesInQuery = (ast.from ?? []).map((tbl) => {
|
|
386
|
+
// This assumes that all the entries in the from clause are BaseFrom.
|
|
387
|
+
// TODO: Handle Join, TableExpr, and Dual (maybe not the last one).
|
|
388
|
+
return tbl.table;
|
|
389
|
+
});
|
|
390
|
+
const columns = schemaTables
|
|
391
|
+
.filter((t) => tableNamesInQuery.includes(t.displayName))
|
|
392
|
+
.flatMap((table) => table.columns)
|
|
393
|
+
.map((column) => {
|
|
394
|
+
return (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column);
|
|
395
|
+
});
|
|
396
|
+
// If there is not GROUP BY clause in the AST, we still need to process the
|
|
397
|
+
// AST but it should pass-through in nature.
|
|
398
|
+
if (!ast.groupby) {
|
|
399
|
+
// If there was a pivot before, evaluate the pivot.
|
|
400
|
+
if (prevPivot) {
|
|
401
|
+
// Make sure that the AST includes all the columns on the prevPivot
|
|
402
|
+
const columnAlreadyExists = (col) => ast.columns.find((c) => [
|
|
403
|
+
c.expr?.value,
|
|
404
|
+
c.expr?.column,
|
|
405
|
+
c.expr?.column?.expr?.value,
|
|
406
|
+
c.as,
|
|
407
|
+
].includes(col));
|
|
408
|
+
if (prevPivot.valueField) {
|
|
409
|
+
const existingCol = columnAlreadyExists(prevPivot.valueField);
|
|
410
|
+
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.valueField));
|
|
411
|
+
}
|
|
412
|
+
if (prevPivot.rowField) {
|
|
413
|
+
const existingCol = columnAlreadyExists(prevPivot.rowField);
|
|
414
|
+
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.rowField));
|
|
415
|
+
}
|
|
416
|
+
if (prevPivot.columnField) {
|
|
417
|
+
const existingCol = columnAlreadyExists(prevPivot.columnField);
|
|
418
|
+
newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.columnField));
|
|
676
419
|
}
|
|
420
|
+
ast.columns = newColumns;
|
|
421
|
+
return { pivot: prevPivot, ast };
|
|
677
422
|
}
|
|
678
|
-
|
|
423
|
+
pivot = convertASTToPivotData(ast, columns);
|
|
424
|
+
if (pivot && Object.keys(pivot).length === 0) {
|
|
425
|
+
pivot = null;
|
|
426
|
+
}
|
|
427
|
+
addAllPivotColumnsToColumnAST(ast.columns, pivot);
|
|
428
|
+
newAst = { ...ast };
|
|
429
|
+
newAst.columns = cleanASTColumns(ast, columns);
|
|
430
|
+
addValueFieldToPivot(newAst, pivot, columns);
|
|
431
|
+
return { pivot, ast: newAst };
|
|
432
|
+
}
|
|
433
|
+
pivot = convertASTToPivotData(ast, columns);
|
|
434
|
+
if (!pivot || pivot == null) {
|
|
435
|
+
throw new Error('Pivot is null');
|
|
436
|
+
}
|
|
437
|
+
addAllPivotColumnsToColumnAST(ast.columns, pivot);
|
|
438
|
+
newAst = { ...ast };
|
|
439
|
+
newAst.groupby = null;
|
|
440
|
+
newAst.columns = cleanASTColumns(ast, columns);
|
|
441
|
+
// ADD sort if pivot has sort
|
|
442
|
+
if (pivot.sort) {
|
|
443
|
+
newAst.orderby = [
|
|
444
|
+
{
|
|
445
|
+
expr: { type: 'column_ref', table: null, column: pivot.rowField },
|
|
446
|
+
type: newAst.orderby !== null ? newAst.orderby[0]?.type ?? 'DESC' : 'DESC',
|
|
447
|
+
},
|
|
448
|
+
];
|
|
679
449
|
}
|
|
450
|
+
addValueFieldToPivot(newAst, pivot, columns);
|
|
451
|
+
// @ts-ignore
|
|
452
|
+
const title = (0, PivotModal_1.generatePivotTitle)(pivot);
|
|
453
|
+
return { pivot: { ...pivot, title }, ast: newAst };
|
|
680
454
|
}
|
|
681
|
-
exports.
|
|
455
|
+
exports.convertGroupBy = convertGroupBy;
|
|
682
456
|
function convertStringComparison(node, databaseType) {
|
|
683
457
|
// Function to recursively search and replace the pattern in the object
|
|
684
458
|
function searchAndReplace(obj) {
|
|
@@ -691,7 +465,7 @@ function convertStringComparison(node, databaseType) {
|
|
|
691
465
|
else if (typeof obj === 'object' && obj !== null) {
|
|
692
466
|
// If the current node is an object, check for the pattern
|
|
693
467
|
if (obj.type === 'binary_expr' &&
|
|
694
|
-
(obj.operator === '=' ||
|
|
468
|
+
((obj.operator === '=' && !(0, date_fns_1.isValid)((0, date_fns_1.parseISO)(obj.right.value))) || // don't do it on date objects
|
|
695
469
|
obj.operator === 'LIKE' ||
|
|
696
470
|
obj.operator === 'ILIKE') &&
|
|
697
471
|
obj.left &&
|
|
@@ -703,25 +477,49 @@ function convertStringComparison(node, databaseType) {
|
|
|
703
477
|
obj.operator = 'LIKE';
|
|
704
478
|
obj.left = {
|
|
705
479
|
type: 'function',
|
|
706
|
-
name:
|
|
480
|
+
name: {
|
|
481
|
+
name: [
|
|
482
|
+
{
|
|
483
|
+
type: 'default',
|
|
484
|
+
value: 'LOWER',
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
},
|
|
707
488
|
args: {
|
|
708
489
|
type: 'expr_list',
|
|
709
490
|
value: [
|
|
710
491
|
databaseType === 'BigQuery'
|
|
711
492
|
? {
|
|
712
493
|
type: 'column_ref',
|
|
713
|
-
value: obj.left.column ||
|
|
494
|
+
value: obj.left.column?.expr?.value ||
|
|
495
|
+
obj.left.column ||
|
|
496
|
+
obj.left.value,
|
|
714
497
|
}
|
|
715
498
|
: {
|
|
716
|
-
type: '
|
|
717
|
-
|
|
499
|
+
type: 'column_ref',
|
|
500
|
+
table: null,
|
|
501
|
+
column: {
|
|
502
|
+
expr: {
|
|
503
|
+
type: 'default',
|
|
504
|
+
value: obj.left.column?.expr?.value ||
|
|
505
|
+
obj.left.column ||
|
|
506
|
+
obj.left.value,
|
|
507
|
+
},
|
|
508
|
+
},
|
|
718
509
|
},
|
|
719
510
|
],
|
|
720
511
|
},
|
|
721
512
|
};
|
|
722
513
|
obj.right = {
|
|
723
514
|
type: 'function',
|
|
724
|
-
name:
|
|
515
|
+
name: {
|
|
516
|
+
name: [
|
|
517
|
+
{
|
|
518
|
+
type: 'default',
|
|
519
|
+
value: 'LOWER',
|
|
520
|
+
},
|
|
521
|
+
],
|
|
522
|
+
},
|
|
725
523
|
args: {
|
|
726
524
|
type: 'expr_list',
|
|
727
525
|
value: [
|
|
@@ -747,25 +545,43 @@ function convertStringComparison(node, databaseType) {
|
|
|
747
545
|
obj.operator = 'NOT LIKE';
|
|
748
546
|
obj.left = {
|
|
749
547
|
type: 'function',
|
|
750
|
-
name:
|
|
548
|
+
name: {
|
|
549
|
+
name: [
|
|
550
|
+
{
|
|
551
|
+
type: 'default',
|
|
552
|
+
value: 'LOWER',
|
|
553
|
+
},
|
|
554
|
+
],
|
|
555
|
+
},
|
|
751
556
|
args: {
|
|
752
557
|
type: 'expr_list',
|
|
753
558
|
value: [
|
|
754
559
|
databaseType === 'BigQuery'
|
|
755
560
|
? {
|
|
756
561
|
type: 'column_ref',
|
|
757
|
-
value: obj.left.column ||
|
|
562
|
+
value: obj.left.column?.expr?.value ||
|
|
563
|
+
obj.left.column ||
|
|
564
|
+
obj.left.value,
|
|
758
565
|
}
|
|
759
566
|
: {
|
|
760
567
|
type: 'double_quote_string',
|
|
761
|
-
value: obj.left.column ||
|
|
568
|
+
value: obj.left.column?.expr?.value ||
|
|
569
|
+
obj.left.column ||
|
|
570
|
+
obj.left.value,
|
|
762
571
|
},
|
|
763
572
|
],
|
|
764
573
|
},
|
|
765
574
|
};
|
|
766
575
|
obj.right = {
|
|
767
576
|
type: 'function',
|
|
768
|
-
name:
|
|
577
|
+
name: {
|
|
578
|
+
name: [
|
|
579
|
+
{
|
|
580
|
+
type: 'default',
|
|
581
|
+
value: 'LOWER',
|
|
582
|
+
},
|
|
583
|
+
],
|
|
584
|
+
},
|
|
769
585
|
args: {
|
|
770
586
|
type: 'expr_list',
|
|
771
587
|
value: [
|
|
@@ -789,18 +605,28 @@ function convertStringComparison(node, databaseType) {
|
|
|
789
605
|
obj.right.value[0].type === 'single_quote_string') {
|
|
790
606
|
obj.left = {
|
|
791
607
|
type: 'function',
|
|
792
|
-
name:
|
|
608
|
+
name: {
|
|
609
|
+
name: [],
|
|
610
|
+
schema: {
|
|
611
|
+
type: 'default',
|
|
612
|
+
value: 'LOWER',
|
|
613
|
+
},
|
|
614
|
+
},
|
|
793
615
|
args: {
|
|
794
616
|
type: 'expr_list',
|
|
795
617
|
value: [
|
|
796
618
|
databaseType === 'BigQuery'
|
|
797
619
|
? {
|
|
798
620
|
type: 'column_ref',
|
|
799
|
-
value: obj.left.column ||
|
|
621
|
+
value: obj.left.column?.expr?.value ||
|
|
622
|
+
obj.left.column ||
|
|
623
|
+
obj.left.value,
|
|
800
624
|
}
|
|
801
625
|
: {
|
|
802
626
|
type: 'double_quote_string',
|
|
803
|
-
value: obj.left.column ||
|
|
627
|
+
value: obj.left.column?.expr?.value ||
|
|
628
|
+
obj.left.column ||
|
|
629
|
+
obj.left.value,
|
|
804
630
|
},
|
|
805
631
|
],
|
|
806
632
|
},
|
|
@@ -810,7 +636,13 @@ function convertStringComparison(node, databaseType) {
|
|
|
810
636
|
// convert NOT IN ('fuel', 'food') to NOT IN (LOWER('fuel'), LOWER('food'))
|
|
811
637
|
value: obj.right.value.map((elem) => ({
|
|
812
638
|
type: 'function',
|
|
813
|
-
name:
|
|
639
|
+
name: {
|
|
640
|
+
name: [],
|
|
641
|
+
schema: {
|
|
642
|
+
type: 'default',
|
|
643
|
+
value: 'LOWER',
|
|
644
|
+
},
|
|
645
|
+
},
|
|
814
646
|
args: {
|
|
815
647
|
type: 'expr_list',
|
|
816
648
|
value: [{ type: 'single_quote_string', value: elem.value }],
|