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