diff --git a/UPDATING.md b/UPDATING.md index b319c196279f1..e490d142884d7 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -26,6 +26,7 @@ assists people when migrating to a new version. ### Breaking Changes +- [16660](https://github.com/apache/incubator-superset/pull/16660): The `columns` Jinja parameter has been renamed `table_columns` to make the `columns` query object parameter available in the Jinja context. - [16711](https://github.com/apache/incubator-superset/pull/16711): The `url_param` Jinja function will now by default escape the result. For instance, the value `O'Brien` will now be changed to `O''Brien`. To disable this behavior, call `url_param` with `escape_result` set to `False`: `url_param("my_key", "my default", escape_result=False)`. ### Potential Downtime diff --git a/docs/src/pages/docs/installation/sql_templating.mdx b/docs/src/pages/docs/installation/sql_templating.mdx index f60ef7853d359..97564b0726d61 100644 --- a/docs/src/pages/docs/installation/sql_templating.mdx +++ b/docs/src/pages/docs/installation/sql_templating.mdx @@ -16,14 +16,15 @@ To enable templating, the `ENABLE_TEMPLATE_PROCESSING` feature flag needs to be in Custom SQL in the filter and metric controls in Explore. By default, the following variables are made available in the Jinja context: -- `columns`: columns available in the dataset +- `columns`: columns which to group by in the query - `filter`: filters applied in the query - `from_dttm`: start `datetime` value from the selected time range (`None` if undefined) - `to_dttm`: end `datetime` value from the selected time range (`None` if undefined) -- `groupby`: columns which to group by in the query +- `groupby`: columns which to group by in the query (deprecated) - `metrics`: aggregate expressions in the query - `row_limit`: row limit of the query - `row_offset`: row offset of the query +- `table_columns`: columns available in the dataset - `time_column`: temporal column of the query (`None` if undefined) - `time_grain`: selected time grain (`None` if undefined) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 628aea96ba835..95aa5599f3fe0 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -16,35 +16,35 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "@superset-ui/chart-controls": "^0.18.2", - "@superset-ui/core": "^0.18.2", - "@superset-ui/legacy-plugin-chart-calendar": "^0.18.2", - "@superset-ui/legacy-plugin-chart-chord": "^0.18.2", - "@superset-ui/legacy-plugin-chart-country-map": "^0.18.2", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.18.2", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.18.2", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.18.2", - "@superset-ui/legacy-plugin-chart-histogram": "^0.18.2", - "@superset-ui/legacy-plugin-chart-horizon": "^0.18.2", - "@superset-ui/legacy-plugin-chart-map-box": "^0.18.2", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.18.2", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.18.2", - "@superset-ui/legacy-plugin-chart-partition": "^0.18.2", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.18.2", - "@superset-ui/legacy-plugin-chart-rose": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sankey": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.18.2", - "@superset-ui/legacy-plugin-chart-treemap": "^0.18.2", - "@superset-ui/legacy-plugin-chart-world-map": "^0.18.2", - "@superset-ui/legacy-preset-chart-big-number": "^0.18.2", + "@superset-ui/chart-controls": "^0.18.4", + "@superset-ui/core": "^0.18.4", + "@superset-ui/legacy-plugin-chart-calendar": "^0.18.4", + "@superset-ui/legacy-plugin-chart-chord": "^0.18.4", + "@superset-ui/legacy-plugin-chart-country-map": "^0.18.4", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.18.4", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.18.4", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.18.4", + "@superset-ui/legacy-plugin-chart-histogram": "^0.18.4", + "@superset-ui/legacy-plugin-chart-horizon": "^0.18.4", + "@superset-ui/legacy-plugin-chart-map-box": "^0.18.4", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.18.4", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.18.4", + "@superset-ui/legacy-plugin-chart-partition": "^0.18.4", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.18.4", + "@superset-ui/legacy-plugin-chart-rose": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sankey": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.18.4", + "@superset-ui/legacy-plugin-chart-treemap": "^0.18.4", + "@superset-ui/legacy-plugin-chart-world-map": "^0.18.4", + "@superset-ui/legacy-preset-chart-big-number": "^0.18.4", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.12", - "@superset-ui/legacy-preset-chart-nvd3": "^0.18.2", - "@superset-ui/plugin-chart-echarts": "^0.18.2", - "@superset-ui/plugin-chart-pivot-table": "^0.18.2", - "@superset-ui/plugin-chart-table": "^0.18.2", - "@superset-ui/plugin-chart-word-cloud": "^0.18.2", - "@superset-ui/preset-chart-xy": "^0.18.2", + "@superset-ui/legacy-preset-chart-nvd3": "^0.18.4", + "@superset-ui/plugin-chart-echarts": "^0.18.4", + "@superset-ui/plugin-chart-pivot-table": "^0.18.4", + "@superset-ui/plugin-chart-table": "^0.18.4", + "@superset-ui/plugin-chart-word-cloud": "^0.18.4", + "@superset-ui/preset-chart-xy": "^0.18.4", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -13579,12 +13579,12 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.18.2.tgz", - "integrity": "sha512-nVb88SqPxtg1qjtzXmw3UcXiHXpyPHFzJik7q7l0CkNVnqWucMMA/ZvKw6ldoNj5Z8gnUfS9V5Q0GYGDzWk4hA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.18.4.tgz", + "integrity": "sha512-MmY5BhKto74OjcUQVJfP9gYq3NBpUckwofpk6IWD5yo38+bmGpKYn+ZcAw9ZTsx6PWuc6i5hNMwEvUdy03JnbA==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.18.2", + "@superset-ui/core": "0.18.4", "lodash": "^4.17.15", "prop-types": "^15.7.2" }, @@ -13596,9 +13596,9 @@ } }, "node_modules/@superset-ui/core": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.18.2.tgz", - "integrity": "sha512-YzaDFCEBKR0WzPQeh5smHfVPw5ig9YxqvdNE1wZxcxCg63W5QFJ+UW0u0WYgIGVb1Pd2HRRGsoJRMCqa+Po/gA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.18.4.tgz", + "integrity": "sha512-KUwLpKInGtyK3iibq6t8CizIPQ1+oBFXJR/37nRHDkBRyyXHegtqFP9OZ0sbsTYTs8KmOb+l3Plq2yWlUAywiw==", "dependencies": { "@babel/runtime": "^7.1.2", "@types/d3-format": "^1.3.0", @@ -13681,12 +13681,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.18.2.tgz", - "integrity": "sha512-F6sMcl0kkDnYZL7nJUAlsrIHW5d15ac7ISVUO5afMf+CIfIvIbMr+nMJpi36Nr2pegsWsmacKHTdDyNIGaiGHw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.18.4.tgz", + "integrity": "sha512-M8sYJCYsLlBgo4nUSo739C++4zydvGlPWJmGlynlNaJhM3ZEJZc0cydRi54IeM1wCX15IhKdTVHBAxMrhN1SHg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -13705,24 +13705,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.18.2.tgz", - "integrity": "sha512-TKMSIkdURc7QbZaMuXkvhiB2oomK9yzkQ4Tz+Kg+FrgzY1pIa+oxLR83QONxL9bU7D84sPeEMCktxsMlqYtIUw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.18.4.tgz", + "integrity": "sha512-Ct+KBUBSmTFnQd6/lTH9KkldbQuuHMbkPtYy9/s9SyGKn+gVVZFrOJ9qbJlnqrR6611W8RhZ5zMsH6bE1JUAIQ==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.18.2.tgz", - "integrity": "sha512-lYCQgbe3RsRX2gekxkvzWxPtptJElfKa8h3AJO0FB5mGEfSq6JCrnaxlvg/dwwrtcHEZxr+nuJlEpDwd1n+VMw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.18.4.tgz", + "integrity": "sha512-WhKbQDL8v4D3zIeUx1IzG5jeyAHkVOFw4JjA8Bwc6ziC8gT4PppHCSOoajB8u3cyAnUxpHW5tnYh2Am4aD4LvA==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -13737,13 +13737,13 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.18.2.tgz", - "integrity": "sha512-IMJ9q2H+UcaQZIFAWIQY09CRq76ki2N5fg6gib2Bea+P8JPRjf1OBnybPML/BOhs8iTMWGdXAo61QVtb/qG8bw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.18.4.tgz", + "integrity": "sha512-DN3Jl+r7aFo3sIVvj/66lc/8Ke69mhSR4y3kzV98suu6HMxo+yjKRypyvtProOcurtRArr1W6QONenGTEWCF0Q==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "prop-types": "^15.6.2" }, "peerDependencies": { @@ -13751,12 +13751,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.18.2.tgz", - "integrity": "sha512-2CfePDivVGhlivbsUluKBTnmA2VmShAoqLWsz/GZlY4JfS4gajp9SnN4fdqzdT9PEslmkeSFFEubc10aR6CIIw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.18.4.tgz", + "integrity": "sha512-2LGvXwT61PxyDlUs3OtMx00RBUlxzmxHQfYFXpybzPCGLbtTOhaCR+PYsPU715tLCLnT3VfMzEhixpx3JsQ3IA==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -13765,12 +13765,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.18.2.tgz", - "integrity": "sha512-qzterUQkbZyy4iSm/q+GoT0EMzQA2VBIxHRgYD6ftiBN6eT2vw8aBjcrPgLLJvVO//htnECReTmDAONmQrj1Zw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.18.4.tgz", + "integrity": "sha512-yPNg7s+n+4u00TTy7DPSegWQnXJd15FwmG4/nXsfc3j5JS1VHpSHihRmcUt8vfw4QykdcCJcDwktI/Cwcf/Sqw==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -13778,14 +13778,14 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.18.2.tgz", - "integrity": "sha512-4recTD03JJ5pp3BPMMiqPqpmJ+4dGAt4Xnxvsn2GrA6X1DY5H5oieYonEMUxh4no/2qJdbzfGc9ym+4XV3PSbg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.18.4.tgz", + "integrity": "sha512-6Z6qXDILIMAiNa/PhaLzrqv2dyEFuECdUKAnplq30tvQfnIUKbI1ltwnYyi7GD4HKWTu4PK2Hnp53efP1GfShw==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -13863,12 +13863,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.18.2.tgz", - "integrity": "sha512-S7wM3LwRYyCQSindhuv/6DmON5ER6iA3BMKjbzOj8WtloGoD7nwBBtbHH/3cLlSTbHfh8zO+PcpSSb5OcAPsyQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.18.4.tgz", + "integrity": "sha512-Mk/uwmhz1luZktBK0mp6qWrbyg2HGJOc+hI9CFUuIxSfMfq6GgrmjxF06K0ybLwuSM6glGPXbgGsZYZ1j64QwA==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -13898,12 +13898,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.18.2.tgz", - "integrity": "sha512-aDIKN65anJhE1a3gNT93oU2sBcqrN1K6uMkSDIfufJ1YRsWKM0bb2fo4uR6n1ej7dIU+shkjtFhAGh363rp2QQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.18.4.tgz", + "integrity": "sha512-aH2JlCbNMzMQeQJPNRwtcG375QurKFhby9I/coqWl5XCL5W3B8mtrzasGtE/zhvWBVJg3051VPskkxWFnvCxYg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -13924,12 +13924,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.18.2.tgz", - "integrity": "sha512-QIuoZ9twS3V5W5Uqg2UsyNfJtKo7xWjT+J+ZJD/23X6Ceg9WifjKKAyD7gNJOLpj6A9Zir6SgVgV4MN/quAa6g==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.18.4.tgz", + "integrity": "sha512-+msk7pvzGopaNpsFu4+cx7ctNtwTbTPRQbzUZW5VBp0NCdbwvjziesdImIsczkWMWJXtiAlopkKvXKe1a+A3gg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" @@ -13939,12 +13939,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.18.2.tgz", - "integrity": "sha512-sZy7GPU2L4HCiHFg4NvMe9LFSZ6rcNX7KHLQbm33PVYEd5CW2yVDZgG5pLn2sRSvDlmqkpkirCbWwpZbjxWNIw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.18.4.tgz", + "integrity": "sha512-D6cB67VKNHnO66v9QBnOFDoSBopikIzoobTu/9FlOGQW3GVr7+1qWfALGoa2UMHy8uR47bfZKvxscaxzipSdLQ==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -13953,12 +13953,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.18.2.tgz", - "integrity": "sha512-rQxPL/y3xZI6DXq8TAbfkerVA8J8/KXkPiY/1bdL2HAwfRv72pj9EJ2Va1VRcofsz6casNlXv0gNkFjiTr5oKw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.18.4.tgz", + "integrity": "sha512-/Pda9eefe7uqZL8ZR/Spn5/KBsAQUn7KxUGcQOGxajxekhXr2lEtThGs8oHmmBlw2kEImkSwK7E4i+sBv841oA==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" @@ -13968,24 +13968,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.18.2.tgz", - "integrity": "sha512-jB+jWSIodD2gXPV2ePLjYJNWZJ3mq58sCgGYpH0Uh+rYDD4m14UYSdjJjbYsZGq/Z9d7RduwH+7pqz27msc+Gw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.18.4.tgz", + "integrity": "sha512-0Trn0yRxJYguyPg5OxsMCmvjUSQa+pueZGFKrwlSb+smneAFtpTh9jN/lDl+9VBp/Oi+eLeVU92xANeDr5oa7g==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-rose": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.18.2.tgz", - "integrity": "sha512-FlsAoMuceFqrIJ0V+xjxMBuPerIw2BSENtrfwBUHMjgDbRHdv8rRc+Rn/8SFfA/r+BKr1kv+4pb8iMMVkW/9Zg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.18.4.tgz", + "integrity": "sha512-rtjp5qvghasHXD2RkmZ7i6ZxFzEE1MJ59ETmnt82i1C0DGZWrC0I5PbDw3HiQ719sKfKiEBhZCg3MKMmdDm4hw==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" @@ -13995,12 +13995,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.18.2.tgz", - "integrity": "sha512-Ipr1KywI966r2q8cg+MjkUq1SJpdC5TUCgbd+Vfr8Gcz3sM1q3UIzKlMFhEmonhTkTSRC+sa4Aqpl2/0AR77HA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.18.4.tgz", + "integrity": "sha512-XmNTOOozMfzE26Y3snvcsu59YhbOkXrQ7k0oJueHg8KkMIzHkZlL6SxE82Mz4YMMGrFQ0FC6qivwoE3xcZ+mFg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" @@ -14010,47 +14010,47 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.18.2.tgz", - "integrity": "sha512-rOO0opUc3P7KCn8+NFAJG+G4LwyPJBjHyMpz9DLPwvhyqm72Xx6DYAHhXzzpElHRk2mnwMsoCG9YnCKSgYirSg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.18.4.tgz", + "integrity": "sha512-UDG6lTQe8lAHjRqc8oSrV6tZNK3c/Zq16qMexPDuexWMoSdzf1hiHqnDyCvs+Y14kTkYJp0vFVlaFNGOTuwP5w==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.18.2.tgz", - "integrity": "sha512-QVYSOSr1k26Nx00cJbF/7lXI+TZmvFX8JZEW58p1sgbaCTvAI9VUT8CK6TIeEyurFSBqwlOVal6wRUy58tTTaA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.18.4.tgz", + "integrity": "sha512-Z9Erc8BdsdL7euKHlMmI8031EdiKiHxkn0mXX8ExaLKjhiCFpqnYkuptQIsjDk+raglV9Tv4DuKzkVu4H/1AqA==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.18.2.tgz", - "integrity": "sha512-CtJQeDC++vgrOdpjIbJn50Z2M1BNp2fl80/mhVC/YDP1bTsciGpMSA6dvGnKb0zK9IDeGSyhzos8HF792HVoRw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.18.4.tgz", + "integrity": "sha512-BmhyAmfwKnlKXxae/BWDSQ0qYLFfwSCfbQwP50c8sxt+5lPsZvqjqQX/qRsbvoRCqtNADdSeX28mL8kmH4cVWg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.18.2.tgz", - "integrity": "sha512-3xM/vGqC3C25adjz5uWO4Uxazyu8mOxevRxjDx5prhymv6IPslBcMixDfYhSBL5+dbXxzO4QLTN2ahx4iQEmgQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.18.4.tgz", + "integrity": "sha512-DNOKk9XUbPy4/Xa5HK39X300Y3n6L3qspMLD0rqRZKRT9FWwxtJTS21Fyz74Tk6anizNckh+4vTAIcFyy2L2rg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -14070,13 +14070,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.18.2.tgz", - "integrity": "sha512-k8fchqSAjNgQEmDQMN8iAIyaIt34T2j6GdwOx4iHlyhUVOMEH7ExQdghbVq9+b5TK/JOFJ3ypEoJH6MqnZ30tQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.18.4.tgz", + "integrity": "sha512-2+ZbDrDIb4jXCPXq6sh1H0eqWris3PYmy4NkD9J11WgNjT5rzrEnAXrN7mOhxZNKW3+EyPg1QwTsONpmfQF3dA==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -14252,13 +14252,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.18.2.tgz", - "integrity": "sha512-pG+bTJoxhVhh0jgUPEhWHLXAgV3LiGdur+uOko0ObNZyf819tgOy6vt0ip5zUnz2eM4Cpw7k7YuJsvzvAAtYOw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.18.4.tgz", + "integrity": "sha512-/GegpIuzjLbS1lQUVxfL2cosgRst3m5PAkH5REfyVJu2pd4I6QyYz5qe6Cz5sGVwjjpBBT243rBpOAPrxZa99w==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -14275,12 +14275,12 @@ } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.18.2.tgz", - "integrity": "sha512-2sid5t05d5FMuhBrZU+pyyUT/M++v0tPjdsYWbpn5NRzAztwFMmSvd4xzY6zp7F8FSx94p5OApdDjOsN+AEJmQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.18.4.tgz", + "integrity": "sha512-VvKS3lGVHx//PiSuPMssA3uCIxp/WW43A0r5UvVkKjWoHYHMkxHBRHZunHlWGgxYLUeIsGaIZl8n/3e6dkdDDQ==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.2.0", @@ -14292,12 +14292,12 @@ } }, "node_modules/@superset-ui/plugin-chart-pivot-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.18.2.tgz", - "integrity": "sha512-CKaIia5zprBth/nYBxMJA3UorlOtAngt/64ihAOl2vSZRqh9UCXBbhZUL26ziyWaMFJz/ROH22XADQSPaWPV2Q==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.18.4.tgz", + "integrity": "sha512-FB2Y8R6cXEynghyMZnNyEI6XoY/W9iHYVVxDXVHDuEgr5LwE1MODHzIGkl4VTjeO+IjeEAMy3Bth98giA/g6fg==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@superset-ui/react-pivottable": "^0.12.12" }, "peerDependencies": { @@ -14306,13 +14306,13 @@ } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.18.2.tgz", - "integrity": "sha512-ni3IH/0f8JNOpXlDHi2Lh7KESeyUrEkmlS1wGUICbLpTz6pSUqL2xHpsBISNdyuRJ+ZQM3f0yeDOC54ESYKJag==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.18.4.tgz", + "integrity": "sha512-8SXDkyBLnkT3NBiVksWvOQZYShfxhNWSNUSGE7M7dlaK8iixGfGuaz/Lot0VnKHfk4Lt9BAKNvklIsFVn2Q8LQ==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -14337,12 +14337,12 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.18.2.tgz", - "integrity": "sha512-c8WXk4W/l/DIGVxc5ly7dt2jvoRWMMYAWIJK9vp46Wle3q16e52NKZC6Ee3xguAMdF5YUJGjrJzsOlmsvkT17Q==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.18.4.tgz", + "integrity": "sha512-pXzpinFGXoNNQyF/Z7HhThUlLXrcMXK5XZaTiCwv3yqXk8Fi4xBwwMIwuTs3khAf54mKRGqsLbCy4Xt+SvHyqw==", "dependencies": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -14375,14 +14375,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.18.2.tgz", - "integrity": "sha512-r7ufcPFc8onwjkITB0SOcaPygQs2zAw8pLLnp8SLu56kUZCZCj94zgpANKe77RB18L1AU5Z8viVfq2Ecx1QZaw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.18.4.tgz", + "integrity": "sha512-O+5NagwoXNef9dTUwF/k7+T6yweApVV/0HmkgW9gekR3lcYL86TgQ9HxkPbxzlznH0YpFAVIMFU8EjuIhHDleg==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -65444,20 +65444,20 @@ } }, "@superset-ui/chart-controls": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.18.2.tgz", - "integrity": "sha512-nVb88SqPxtg1qjtzXmw3UcXiHXpyPHFzJik7q7l0CkNVnqWucMMA/ZvKw6ldoNj5Z8gnUfS9V5Q0GYGDzWk4hA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.18.4.tgz", + "integrity": "sha512-MmY5BhKto74OjcUQVJfP9gYq3NBpUckwofpk6IWD5yo38+bmGpKYn+ZcAw9ZTsx6PWuc6i5hNMwEvUdy03JnbA==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.18.2", + "@superset-ui/core": "0.18.4", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.18.2.tgz", - "integrity": "sha512-YzaDFCEBKR0WzPQeh5smHfVPw5ig9YxqvdNE1wZxcxCg63W5QFJ+UW0u0WYgIGVb1Pd2HRRGsoJRMCqa+Po/gA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.18.4.tgz", + "integrity": "sha512-KUwLpKInGtyK3iibq6t8CizIPQ1+oBFXJR/37nRHDkBRyyXHegtqFP9OZ0sbsTYTs8KmOb+l3Plq2yWlUAywiw==", "requires": { "@babel/runtime": "^7.1.2", "@types/d3-format": "^1.3.0", @@ -65532,12 +65532,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.18.2.tgz", - "integrity": "sha512-F6sMcl0kkDnYZL7nJUAlsrIHW5d15ac7ISVUO5afMf+CIfIvIbMr+nMJpi36Nr2pegsWsmacKHTdDyNIGaiGHw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.18.4.tgz", + "integrity": "sha512-M8sYJCYsLlBgo4nUSo739C++4zydvGlPWJmGlynlNaJhM3ZEJZc0cydRi54IeM1wCX15IhKdTVHBAxMrhN1SHg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -65555,24 +65555,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.18.2.tgz", - "integrity": "sha512-TKMSIkdURc7QbZaMuXkvhiB2oomK9yzkQ4Tz+Kg+FrgzY1pIa+oxLR83QONxL9bU7D84sPeEMCktxsMlqYtIUw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.18.4.tgz", + "integrity": "sha512-Ct+KBUBSmTFnQd6/lTH9KkldbQuuHMbkPtYy9/s9SyGKn+gVVZFrOJ9qbJlnqrR6611W8RhZ5zMsH6bE1JUAIQ==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.18.2.tgz", - "integrity": "sha512-lYCQgbe3RsRX2gekxkvzWxPtptJElfKa8h3AJO0FB5mGEfSq6JCrnaxlvg/dwwrtcHEZxr+nuJlEpDwd1n+VMw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.18.4.tgz", + "integrity": "sha512-WhKbQDL8v4D3zIeUx1IzG5jeyAHkVOFw4JjA8Bwc6ziC8gT4PppHCSOoajB8u3cyAnUxpHW5tnYh2Am4aD4LvA==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -65589,34 +65589,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.18.2.tgz", - "integrity": "sha512-IMJ9q2H+UcaQZIFAWIQY09CRq76ki2N5fg6gib2Bea+P8JPRjf1OBnybPML/BOhs8iTMWGdXAo61QVtb/qG8bw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.18.4.tgz", + "integrity": "sha512-DN3Jl+r7aFo3sIVvj/66lc/8Ke69mhSR4y3kzV98suu6HMxo+yjKRypyvtProOcurtRArr1W6QONenGTEWCF0Q==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.18.2.tgz", - "integrity": "sha512-2CfePDivVGhlivbsUluKBTnmA2VmShAoqLWsz/GZlY4JfS4gajp9SnN4fdqzdT9PEslmkeSFFEubc10aR6CIIw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.18.4.tgz", + "integrity": "sha512-2LGvXwT61PxyDlUs3OtMx00RBUlxzmxHQfYFXpybzPCGLbtTOhaCR+PYsPU715tLCLnT3VfMzEhixpx3JsQ3IA==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.18.2.tgz", - "integrity": "sha512-qzterUQkbZyy4iSm/q+GoT0EMzQA2VBIxHRgYD6ftiBN6eT2vw8aBjcrPgLLJvVO//htnECReTmDAONmQrj1Zw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.18.4.tgz", + "integrity": "sha512-yPNg7s+n+4u00TTy7DPSegWQnXJd15FwmG4/nXsfc3j5JS1VHpSHihRmcUt8vfw4QykdcCJcDwktI/Cwcf/Sqw==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -65624,14 +65624,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.18.2.tgz", - "integrity": "sha512-4recTD03JJ5pp3BPMMiqPqpmJ+4dGAt4Xnxvsn2GrA6X1DY5H5oieYonEMUxh4no/2qJdbzfGc9ym+4XV3PSbg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.18.4.tgz", + "integrity": "sha512-6Z6qXDILIMAiNa/PhaLzrqv2dyEFuECdUKAnplq30tvQfnIUKbI1ltwnYyi7GD4HKWTu4PK2Hnp53efP1GfShw==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -65699,12 +65699,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.18.2.tgz", - "integrity": "sha512-S7wM3LwRYyCQSindhuv/6DmON5ER6iA3BMKjbzOj8WtloGoD7nwBBtbHH/3cLlSTbHfh8zO+PcpSSb5OcAPsyQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.18.4.tgz", + "integrity": "sha512-Mk/uwmhz1luZktBK0mp6qWrbyg2HGJOc+hI9CFUuIxSfMfq6GgrmjxF06K0ybLwuSM6glGPXbgGsZYZ1j64QwA==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -65733,12 +65733,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.18.2.tgz", - "integrity": "sha512-aDIKN65anJhE1a3gNT93oU2sBcqrN1K6uMkSDIfufJ1YRsWKM0bb2fo4uR6n1ej7dIU+shkjtFhAGh363rp2QQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.18.4.tgz", + "integrity": "sha512-aH2JlCbNMzMQeQJPNRwtcG375QurKFhby9I/coqWl5XCL5W3B8mtrzasGtE/zhvWBVJg3051VPskkxWFnvCxYg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -65755,118 +65755,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.18.2.tgz", - "integrity": "sha512-QIuoZ9twS3V5W5Uqg2UsyNfJtKo7xWjT+J+ZJD/23X6Ceg9WifjKKAyD7gNJOLpj6A9Zir6SgVgV4MN/quAa6g==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.18.4.tgz", + "integrity": "sha512-+msk7pvzGopaNpsFu4+cx7ctNtwTbTPRQbzUZW5VBp0NCdbwvjziesdImIsczkWMWJXtiAlopkKvXKe1a+A3gg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.18.2.tgz", - "integrity": "sha512-sZy7GPU2L4HCiHFg4NvMe9LFSZ6rcNX7KHLQbm33PVYEd5CW2yVDZgG5pLn2sRSvDlmqkpkirCbWwpZbjxWNIw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.18.4.tgz", + "integrity": "sha512-D6cB67VKNHnO66v9QBnOFDoSBopikIzoobTu/9FlOGQW3GVr7+1qWfALGoa2UMHy8uR47bfZKvxscaxzipSdLQ==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.18.2.tgz", - "integrity": "sha512-rQxPL/y3xZI6DXq8TAbfkerVA8J8/KXkPiY/1bdL2HAwfRv72pj9EJ2Va1VRcofsz6casNlXv0gNkFjiTr5oKw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.18.4.tgz", + "integrity": "sha512-/Pda9eefe7uqZL8ZR/Spn5/KBsAQUn7KxUGcQOGxajxekhXr2lEtThGs8oHmmBlw2kEImkSwK7E4i+sBv841oA==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.18.2.tgz", - "integrity": "sha512-jB+jWSIodD2gXPV2ePLjYJNWZJ3mq58sCgGYpH0Uh+rYDD4m14UYSdjJjbYsZGq/Z9d7RduwH+7pqz27msc+Gw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.18.4.tgz", + "integrity": "sha512-0Trn0yRxJYguyPg5OxsMCmvjUSQa+pueZGFKrwlSb+smneAFtpTh9jN/lDl+9VBp/Oi+eLeVU92xANeDr5oa7g==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.18.2.tgz", - "integrity": "sha512-FlsAoMuceFqrIJ0V+xjxMBuPerIw2BSENtrfwBUHMjgDbRHdv8rRc+Rn/8SFfA/r+BKr1kv+4pb8iMMVkW/9Zg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.18.4.tgz", + "integrity": "sha512-rtjp5qvghasHXD2RkmZ7i6ZxFzEE1MJ59ETmnt82i1C0DGZWrC0I5PbDw3HiQ719sKfKiEBhZCg3MKMmdDm4hw==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.18.2.tgz", - "integrity": "sha512-Ipr1KywI966r2q8cg+MjkUq1SJpdC5TUCgbd+Vfr8Gcz3sM1q3UIzKlMFhEmonhTkTSRC+sa4Aqpl2/0AR77HA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.18.4.tgz", + "integrity": "sha512-XmNTOOozMfzE26Y3snvcsu59YhbOkXrQ7k0oJueHg8KkMIzHkZlL6SxE82Mz4YMMGrFQ0FC6qivwoE3xcZ+mFg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.18.2.tgz", - "integrity": "sha512-rOO0opUc3P7KCn8+NFAJG+G4LwyPJBjHyMpz9DLPwvhyqm72Xx6DYAHhXzzpElHRk2mnwMsoCG9YnCKSgYirSg==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.18.4.tgz", + "integrity": "sha512-UDG6lTQe8lAHjRqc8oSrV6tZNK3c/Zq16qMexPDuexWMoSdzf1hiHqnDyCvs+Y14kTkYJp0vFVlaFNGOTuwP5w==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.18.2.tgz", - "integrity": "sha512-QVYSOSr1k26Nx00cJbF/7lXI+TZmvFX8JZEW58p1sgbaCTvAI9VUT8CK6TIeEyurFSBqwlOVal6wRUy58tTTaA==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.18.4.tgz", + "integrity": "sha512-Z9Erc8BdsdL7euKHlMmI8031EdiKiHxkn0mXX8ExaLKjhiCFpqnYkuptQIsjDk+raglV9Tv4DuKzkVu4H/1AqA==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.18.2.tgz", - "integrity": "sha512-CtJQeDC++vgrOdpjIbJn50Z2M1BNp2fl80/mhVC/YDP1bTsciGpMSA6dvGnKb0zK9IDeGSyhzos8HF792HVoRw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.18.4.tgz", + "integrity": "sha512-BmhyAmfwKnlKXxae/BWDSQ0qYLFfwSCfbQwP50c8sxt+5lPsZvqjqQX/qRsbvoRCqtNADdSeX28mL8kmH4cVWg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.18.2.tgz", - "integrity": "sha512-3xM/vGqC3C25adjz5uWO4Uxazyu8mOxevRxjDx5prhymv6IPslBcMixDfYhSBL5+dbXxzO4QLTN2ahx4iQEmgQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.18.4.tgz", + "integrity": "sha512-DNOKk9XUbPy4/Xa5HK39X300Y3n6L3qspMLD0rqRZKRT9FWwxtJTS21Fyz74Tk6anizNckh+4vTAIcFyy2L2rg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -65885,13 +65885,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.18.2.tgz", - "integrity": "sha512-k8fchqSAjNgQEmDQMN8iAIyaIt34T2j6GdwOx4iHlyhUVOMEH7ExQdghbVq9+b5TK/JOFJ3ypEoJH6MqnZ30tQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.18.4.tgz", + "integrity": "sha512-2+ZbDrDIb4jXCPXq6sh1H0eqWris3PYmy4NkD9J11WgNjT5rzrEnAXrN7mOhxZNKW3+EyPg1QwTsONpmfQF3dA==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -66046,13 +66046,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.18.2.tgz", - "integrity": "sha512-pG+bTJoxhVhh0jgUPEhWHLXAgV3LiGdur+uOko0ObNZyf819tgOy6vt0ip5zUnz2eM4Cpw7k7YuJsvzvAAtYOw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.18.4.tgz", + "integrity": "sha512-/GegpIuzjLbS1lQUVxfL2cosgRst3m5PAkH5REfyVJu2pd4I6QyYz5qe6Cz5sGVwjjpBBT243rBpOAPrxZa99w==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -66066,12 +66066,12 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.18.2.tgz", - "integrity": "sha512-2sid5t05d5FMuhBrZU+pyyUT/M++v0tPjdsYWbpn5NRzAztwFMmSvd4xzY6zp7F8FSx94p5OApdDjOsN+AEJmQ==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.18.4.tgz", + "integrity": "sha512-VvKS3lGVHx//PiSuPMssA3uCIxp/WW43A0r5UvVkKjWoHYHMkxHBRHZunHlWGgxYLUeIsGaIZl8n/3e6dkdDDQ==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.2.0", @@ -66080,23 +66080,23 @@ } }, "@superset-ui/plugin-chart-pivot-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.18.2.tgz", - "integrity": "sha512-CKaIia5zprBth/nYBxMJA3UorlOtAngt/64ihAOl2vSZRqh9UCXBbhZUL26ziyWaMFJz/ROH22XADQSPaWPV2Q==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.18.4.tgz", + "integrity": "sha512-FB2Y8R6cXEynghyMZnNyEI6XoY/W9iHYVVxDXVHDuEgr5LwE1MODHzIGkl4VTjeO+IjeEAMy3Bth98giA/g6fg==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@superset-ui/react-pivottable": "^0.12.12" } }, "@superset-ui/plugin-chart-table": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.18.2.tgz", - "integrity": "sha512-ni3IH/0f8JNOpXlDHi2Lh7KESeyUrEkmlS1wGUICbLpTz6pSUqL2xHpsBISNdyuRJ+ZQM3f0yeDOC54ESYKJag==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.18.4.tgz", + "integrity": "sha512-8SXDkyBLnkT3NBiVksWvOQZYShfxhNWSNUSGE7M7dlaK8iixGfGuaz/Lot0VnKHfk4Lt9BAKNvklIsFVn2Q8LQ==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -66118,12 +66118,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.18.2.tgz", - "integrity": "sha512-c8WXk4W/l/DIGVxc5ly7dt2jvoRWMMYAWIJK9vp46Wle3q16e52NKZC6Ee3xguAMdF5YUJGjrJzsOlmsvkT17Q==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.18.4.tgz", + "integrity": "sha512-pXzpinFGXoNNQyF/Z7HhThUlLXrcMXK5XZaTiCwv3yqXk8Fi4xBwwMIwuTs3khAf54mKRGqsLbCy4Xt+SvHyqw==", "requires": { - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -66154,14 +66154,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.18.2.tgz", - "integrity": "sha512-r7ufcPFc8onwjkITB0SOcaPygQs2zAw8pLLnp8SLu56kUZCZCj94zgpANKe77RB18L1AU5Z8viVfq2Ecx1QZaw==", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.18.4.tgz", + "integrity": "sha512-O+5NagwoXNef9dTUwF/k7+T6yweApVV/0HmkgW9gekR3lcYL86TgQ9HxkPbxzlznH0YpFAVIMFU8EjuIhHDleg==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.18.2", - "@superset-ui/core": "0.18.2", + "@superset-ui/chart-controls": "0.18.4", + "@superset-ui/core": "0.18.4", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index e7ffc366dd73a..6127415872a5f 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -68,35 +68,35 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "@superset-ui/chart-controls": "^0.18.2", - "@superset-ui/core": "^0.18.2", - "@superset-ui/legacy-plugin-chart-calendar": "^0.18.2", - "@superset-ui/legacy-plugin-chart-chord": "^0.18.2", - "@superset-ui/legacy-plugin-chart-country-map": "^0.18.2", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.18.2", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.18.2", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.18.2", - "@superset-ui/legacy-plugin-chart-histogram": "^0.18.2", - "@superset-ui/legacy-plugin-chart-horizon": "^0.18.2", - "@superset-ui/legacy-plugin-chart-map-box": "^0.18.2", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.18.2", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.18.2", - "@superset-ui/legacy-plugin-chart-partition": "^0.18.2", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.18.2", - "@superset-ui/legacy-plugin-chart-rose": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sankey": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.18.2", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.18.2", - "@superset-ui/legacy-plugin-chart-treemap": "^0.18.2", - "@superset-ui/legacy-plugin-chart-world-map": "^0.18.2", - "@superset-ui/legacy-preset-chart-big-number": "^0.18.2", + "@superset-ui/chart-controls": "^0.18.4", + "@superset-ui/core": "^0.18.4", + "@superset-ui/legacy-plugin-chart-calendar": "^0.18.4", + "@superset-ui/legacy-plugin-chart-chord": "^0.18.4", + "@superset-ui/legacy-plugin-chart-country-map": "^0.18.4", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.18.4", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.18.4", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.18.4", + "@superset-ui/legacy-plugin-chart-histogram": "^0.18.4", + "@superset-ui/legacy-plugin-chart-horizon": "^0.18.4", + "@superset-ui/legacy-plugin-chart-map-box": "^0.18.4", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.18.4", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.18.4", + "@superset-ui/legacy-plugin-chart-partition": "^0.18.4", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.18.4", + "@superset-ui/legacy-plugin-chart-rose": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sankey": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.18.4", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.18.4", + "@superset-ui/legacy-plugin-chart-treemap": "^0.18.4", + "@superset-ui/legacy-plugin-chart-world-map": "^0.18.4", + "@superset-ui/legacy-preset-chart-big-number": "^0.18.4", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.12", - "@superset-ui/legacy-preset-chart-nvd3": "^0.18.2", - "@superset-ui/plugin-chart-echarts": "^0.18.2", - "@superset-ui/plugin-chart-pivot-table": "^0.18.2", - "@superset-ui/plugin-chart-table": "^0.18.2", - "@superset-ui/plugin-chart-word-cloud": "^0.18.2", - "@superset-ui/preset-chart-xy": "^0.18.2", + "@superset-ui/legacy-preset-chart-nvd3": "^0.18.4", + "@superset-ui/plugin-chart-echarts": "^0.18.4", + "@superset-ui/plugin-chart-pivot-table": "^0.18.4", + "@superset-ui/plugin-chart-table": "^0.18.4", + "@superset-ui/plugin-chart-word-cloud": "^0.18.4", + "@superset-ui/preset-chart-xy": "^0.18.4", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index ca84ff4113cab..a8a4d69d1443c 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -639,18 +639,15 @@ class ChartDataPivotOptionsSchema(ChartDataPostProcessingOperationOptionsSchema) index = ( fields.List( - fields.String( - allow_none=False, - description="Columns to group by on the table index (=rows)", - ), + fields.String(allow_none=False), + description="Columns to group by on the table index (=rows)", minLength=1, required=True, ), ) columns = fields.List( - fields.String( - allow_none=False, description="Columns to group by on the table columns", - ), + fields.String(allow_none=False), + description="Columns to group by on the table columns", ) metric_fill_value = fields.Number( description="Value to replace missing values with in aggregate calculations.", @@ -964,7 +961,9 @@ class Meta: # pylint: disable=too-few-public-methods deprecated=True, ) groupby = fields.List( - fields.String(description="Columns by which to group the query.",), + fields.String(), + description="Columns by which to group the query. " + "This field is deprecated, use `columns` instead.", allow_none=True, ) metrics = fields.List( @@ -1012,12 +1011,33 @@ class Meta: # pylint: disable=too-few-public-methods is_timeseries = fields.Boolean( description="Is the `query_object` a timeseries.", allow_none=True, ) + series_columns = fields.List( + fields.String(), + description="Columns to use when limiting series count. " + "All columns must be present in the `columns` property. " + "Requires `series_limit` and `series_limit_metric` to be set.", + allow_none=True, + ) + series_limit = fields.Integer( + description="Maximum number of series. " + "Requires `series` and `series_limit_metric` to be set.", + allow_none=True, + ) + series_limit_metric = fields.Raw( + description="Metric used to limit timeseries queries by. " + "Requires `series` and `series_limit` to be set.", + allow_none=True, + ) timeseries_limit = fields.Integer( - description="Maximum row count for timeseries queries. Default: `0`", + description="Maximum row count for timeseries queries. " + "This field is deprecated, use `series_limit` instead." + "Default: `0`", allow_none=True, ) timeseries_limit_metric = fields.Raw( - description="Metric used to limit timeseries queries by.", allow_none=True, + description="Metric used to limit timeseries queries by. " + "This field is deprecated, use `series_limit_metric` instead.", + allow_none=True, ) row_limit = fields.Integer( description='Maximum row count (0=disabled). Default: `config["ROW_LIMIT"]`', diff --git a/superset/common/query_actions.py b/superset/common/query_actions.py index 349d62d38227e..440ab7ce6570b 100644 --- a/superset/common/query_actions.py +++ b/superset/common/query_actions.py @@ -135,7 +135,6 @@ def _get_samples( query_obj = copy.copy(query_obj) query_obj.is_timeseries = False query_obj.orderby = [] - query_obj.groupby = [] query_obj.metrics = [] query_obj.post_processing = [] query_obj.row_limit = min(row_limit, config["SAMPLES_ROW_LIMIT"]) diff --git a/superset/common/query_context.py b/superset/common/query_context.py index 566b01c8613be..2cf04e26459ba 100644 --- a/superset/common/query_context.py +++ b/superset/common/query_context.py @@ -451,7 +451,6 @@ def get_df_payload( invalid_columns = [ col for col in query_obj.columns - + query_obj.groupby + get_column_names_from_metrics(query_obj.metrics or []) if col not in self.datasource.column_names and col != DTTM_ALIAS ] diff --git a/superset/common/query_object.py b/superset/common/query_object.py index bdf5f89e964db..c8f08146732df 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -55,6 +55,9 @@ class DeprecatedField(NamedTuple): DEPRECATED_FIELDS = ( DeprecatedField(old_name="granularity_sqla", new_name="granularity"), + DeprecatedField(old_name="groupby", new_name="columns"), + DeprecatedField(old_name="timeseries_limit", new_name="series_limit"), + DeprecatedField(old_name="timeseries_limit_metric", new_name="series_limit_metric"), ) DEPRECATED_EXTRAS_FIELDS = ( @@ -74,63 +77,68 @@ class QueryObject: # pylint: disable=too-many-instance-attributes annotation_layers: List[Dict[str, Any]] applied_time_extras: Dict[str, str] apply_fetch_values_predicate: bool - granularity: Optional[str] + columns: List[str] + datasource: Optional[BaseDatasource] + extras: Dict[str, Any] + filter: List[QueryObjectFilterClause] from_dttm: Optional[datetime] - to_dttm: Optional[datetime] + granularity: Optional[str] inner_from_dttm: Optional[datetime] inner_to_dttm: Optional[datetime] + is_rowcount: bool is_timeseries: bool - time_shift: Optional[timedelta] - groupby: List[str] - metrics: Optional[List[Metric]] - row_limit: int - row_offset: int - filter: List[QueryObjectFilterClause] - timeseries_limit: int - timeseries_limit_metric: Optional[Metric] order_desc: bool - extras: Dict[str, Any] - columns: List[str] orderby: List[OrderBy] - post_processing: List[Dict[str, Any]] - datasource: Optional[BaseDatasource] + metrics: Optional[List[Metric]] result_type: Optional[ChartDataResultType] - is_rowcount: bool + row_limit: int + row_offset: int + series_columns: List[str] + series_limit: int + series_limit_metric: Optional[Metric] time_offsets: List[str] + time_shift: Optional[timedelta] + to_dttm: Optional[datetime] + post_processing: List[Dict[str, Any]] def __init__( # pylint: disable=too-many-arguments,too-many-locals self, - datasource: Optional[DatasourceDict] = None, - result_type: Optional[ChartDataResultType] = None, annotation_layers: Optional[List[Dict[str, Any]]] = None, applied_time_extras: Optional[Dict[str, str]] = None, apply_fetch_values_predicate: bool = False, - granularity: Optional[str] = None, - metrics: Optional[List[Metric]] = None, - groupby: Optional[List[str]] = None, + columns: Optional[List[str]] = None, + datasource: Optional[DatasourceDict] = None, + extras: Optional[Dict[str, Any]] = None, filters: Optional[List[QueryObjectFilterClause]] = None, - time_range: Optional[str] = None, - time_shift: Optional[str] = None, + granularity: Optional[str] = None, + is_rowcount: bool = False, is_timeseries: Optional[bool] = None, - timeseries_limit: int = 0, - row_limit: Optional[int] = None, - row_offset: Optional[int] = None, - timeseries_limit_metric: Optional[Metric] = None, + metrics: Optional[List[Metric]] = None, order_desc: bool = True, - extras: Optional[Dict[str, Any]] = None, - columns: Optional[List[str]] = None, orderby: Optional[List[OrderBy]] = None, post_processing: Optional[List[Optional[Dict[str, Any]]]] = None, - is_rowcount: bool = False, + result_type: Optional[ChartDataResultType] = None, + row_limit: Optional[int] = None, + row_offset: Optional[int] = None, + series_columns: Optional[List[str]] = None, + series_limit: int = 0, + series_limit_metric: Optional[Metric] = None, + time_range: Optional[str] = None, + time_shift: Optional[str] = None, **kwargs: Any, ): columns = columns or [] - groupby = groupby or [] extras = extras or {} annotation_layers = annotation_layers or [] self.time_offsets = kwargs.get("time_offsets", []) self.inner_from_dttm = kwargs.get("inner_from_dttm") self.inner_to_dttm = kwargs.get("inner_to_dttm") + if series_columns: + self.series_columns = series_columns + elif is_timeseries and metrics: + self.series_columns = columns + else: + self.series_columns = [] self.is_rowcount = is_rowcount self.datasource = None @@ -161,9 +169,7 @@ def __init__( # pylint: disable=too-many-arguments,too-many-locals # is_timeseries is True if time column is in either columns or groupby # (both are dimensions) self.is_timeseries = ( - is_timeseries - if is_timeseries is not None - else DTTM_ALIAS in columns + groupby + is_timeseries if is_timeseries is not None else DTTM_ALIAS in columns ) self.time_range = time_range self.time_shift = parse_human_timedelta(time_shift) @@ -183,8 +189,8 @@ def __init__( # pylint: disable=too-many-arguments,too-many-locals self.row_limit = config["ROW_LIMIT"] if row_limit is None else row_limit self.row_offset = row_offset or 0 self.filter = filters or [] - self.timeseries_limit = timeseries_limit - self.timeseries_limit_metric = timeseries_limit_metric + self.series_limit = series_limit + self.series_limit_metric = series_limit_metric self.order_desc = order_desc self.extras = extras @@ -194,9 +200,12 @@ def __init__( # pylint: disable=too-many-arguments,too-many-locals ) self.columns = columns - self.groupby = groupby or [] self.orderby = orderby or [] + self._rename_deprecated_fields(kwargs) + self._move_deprecated_extra_fields(kwargs) + + def _rename_deprecated_fields(self, kwargs: Dict[str, Any]) -> None: # rename deprecated fields for field in DEPRECATED_FIELDS: if field.old_name in kwargs: @@ -216,6 +225,7 @@ def __init__( # pylint: disable=too-many-arguments,too-many-locals ) setattr(self, field.new_name, value) + def _move_deprecated_extra_fields(self, kwargs: Dict[str, Any]) -> None: # move deprecated extras fields to extras for field in DEPRECATED_EXTRAS_FIELDS: if field.old_name in kwargs: @@ -254,6 +264,14 @@ def validate( """Validate query object""" error: Optional[QueryObjectValidationError] = None all_labels = self.metric_names + self.column_names + missing_series = [col for col in self.series_columns if col not in self.columns] + if missing_series: + _( + "The following entries in `series_columns` are missing " + "in `columns`: %(columns)s. ", + columns=", ".join(f'"{x}"' for x in missing_series), + ) + if len(set(all_labels)) < len(all_labels): dup_labels = find_duplicates(all_labels) error = QueryObjectValidationError( @@ -270,24 +288,24 @@ def validate( def to_dict(self) -> Dict[str, Any]: query_object_dict = { "apply_fetch_values_predicate": self.apply_fetch_values_predicate, - "granularity": self.granularity, - "groupby": self.groupby, + "columns": self.columns, + "extras": self.extras, + "filter": self.filter, "from_dttm": self.from_dttm, - "to_dttm": self.to_dttm, + "granularity": self.granularity, "inner_from_dttm": self.inner_from_dttm, "inner_to_dttm": self.inner_to_dttm, "is_rowcount": self.is_rowcount, "is_timeseries": self.is_timeseries, "metrics": self.metrics, - "row_limit": self.row_limit, - "row_offset": self.row_offset, - "filter": self.filter, - "timeseries_limit": self.timeseries_limit, - "timeseries_limit_metric": self.timeseries_limit_metric, "order_desc": self.order_desc, - "extras": self.extras, - "columns": self.columns, "orderby": self.orderby, + "row_limit": self.row_limit, + "row_offset": self.row_offset, + "series_columns": self.series_columns, + "series_limit": self.series_limit, + "series_limit_metric": self.series_limit_metric, + "to_dttm": self.to_dttm, } return query_object_dict diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index f6c5e43d84134..66b604937f8b1 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -19,7 +19,7 @@ import json import logging import re -from collections import defaultdict, OrderedDict +from collections import defaultdict from dataclasses import dataclass, field from datetime import datetime, timedelta from typing import ( @@ -931,27 +931,30 @@ def _get_sqla_row_level_filters( def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-many-branches,too-many-statements self, - metrics: Optional[List[Metric]] = None, - granularity: Optional[str] = None, - from_dttm: Optional[datetime] = None, - to_dttm: Optional[datetime] = None, + apply_fetch_values_predicate: bool = False, columns: Optional[List[str]] = None, - groupby: Optional[List[str]] = None, + extras: Optional[Dict[str, Any]] = None, filter: Optional[ # pylint: disable=redefined-builtin List[QueryObjectFilterClause] ] = None, - is_timeseries: bool = True, - timeseries_limit: int = 15, - timeseries_limit_metric: Optional[Metric] = None, - row_limit: Optional[int] = None, - row_offset: Optional[int] = None, + from_dttm: Optional[datetime] = None, + granularity: Optional[str] = None, + groupby: Optional[List[str]] = None, inner_from_dttm: Optional[datetime] = None, inner_to_dttm: Optional[datetime] = None, + is_rowcount: bool = False, + is_timeseries: bool = True, + metrics: Optional[List[Metric]] = None, orderby: Optional[List[OrderBy]] = None, - extras: Optional[Dict[str, Any]] = None, order_desc: bool = True, - is_rowcount: bool = False, - apply_fetch_values_predicate: bool = False, + to_dttm: Optional[datetime] = None, + series_columns: Optional[List[str]] = None, + series_limit: Optional[int] = None, + series_limit_metric: Optional[Metric] = None, + row_limit: Optional[int] = None, + row_offset: Optional[int] = None, + timeseries_limit: Optional[int] = None, + timeseries_limit_metric: Optional[Metric] = None, ) -> SqlaQuery: """Querying any sqla table from this common interface""" if granularity not in self.dttm_cols and granularity is not None: @@ -961,6 +964,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma time_grain = extras.get("time_grain_sqla") template_kwargs = { + "columns": columns, "from_dttm": from_dttm.isoformat() if from_dttm else None, "groupby": groupby, "metrics": metrics, @@ -969,9 +973,14 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma "time_column": granularity, "time_grain": time_grain, "to_dttm": to_dttm.isoformat() if to_dttm else None, + "table_columns": [col.column_name for col in self.columns], "filter": filter, - "columns": [col.column_name for col in self.columns], } + series_columns = series_columns or [] + # deprecated, to be removed in 2.0 + if is_timeseries and timeseries_limit: + series_limit = timeseries_limit + series_limit_metric = series_limit_metric or timeseries_limit_metric template_kwargs.update(self.template_params_dict) extra_cache_keys: List[Any] = [] template_kwargs["extra_cache_keys"] = extra_cache_keys @@ -984,8 +993,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma need_groupby = bool(metrics is not None or groupby) metrics = metrics or [] - # Database spec supports join-free timeslot grouping - time_groupby_inline = db_engine_spec.time_groupby_inline + # For backward compatibility + if granularity not in self.dttm_cols and granularity is not None: + granularity = self.main_dttm_col columns_by_name: Dict[str, TableColumn] = { col.column_name: col for col in self.columns @@ -1057,7 +1067,8 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) select_exprs: List[Union[Column, Label]] = [] - groupby_exprs_sans_timestamp = OrderedDict() + groupby_all_columns = {} + groupby_series_columns = {} # filter out the pseudo column __timestamp from columns columns = columns or [] @@ -1078,7 +1089,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma else: outer = literal_column(f"({selected})") outer = self.make_sqla_column_compatible(outer, selected) - groupby_exprs_sans_timestamp[outer.name] = outer + groupby_all_columns[outer.name] = outer + if not series_columns or outer.name in series_columns: + groupby_series_columns[outer.name] = outer select_exprs.append(outer) elif columns: for selected in columns: @@ -1090,7 +1103,6 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma metrics_exprs = [] time_range_endpoints = extras.get("time_range_endpoints") - groupby_exprs_with_timestamp = OrderedDict(groupby_exprs_sans_timestamp.items()) if granularity: if granularity not in columns_by_name or not dttm_col: @@ -1106,7 +1118,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma timestamp = dttm_col.get_timestamp_expression(time_grain) # always put timestamp as the first column select_exprs.insert(0, timestamp) - groupby_exprs_with_timestamp[timestamp.name] = timestamp + groupby_all_columns[timestamp.name] = timestamp # Use main dttm column to support index with secondary dttm columns. if ( @@ -1142,8 +1154,8 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma tbl = self.get_from_clause(template_processor) - if groupby_exprs_with_timestamp: - qry = qry.group_by(*groupby_exprs_with_timestamp.values()) + if groupby_all_columns: + qry = qry.group_by(*groupby_all_columns.values()) where_clause_and = [] having_clause_and = [] @@ -1289,13 +1301,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma if row_offset: qry = qry.offset(row_offset) - if ( - is_timeseries - and timeseries_limit - and not time_groupby_inline - and groupby_exprs_sans_timestamp - and dttm_col - ): + if db_engine_spec.allows_subqueries and series_limit and groupby_series_columns: if db_engine_spec.allows_joins: # some sql dialects require for order by expressions # to also be in the select clause -- others, e.g. vertica, @@ -1305,32 +1311,37 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) inner_groupby_exprs = [] inner_select_exprs = [] - for gby_name, gby_obj in groupby_exprs_sans_timestamp.items(): + for gby_name, gby_obj in groupby_series_columns.items(): inner = self.make_sqla_column_compatible(gby_obj, gby_name + "__") inner_groupby_exprs.append(inner) inner_select_exprs.append(inner) inner_select_exprs += [inner_main_metric_expr] subq = select(inner_select_exprs).select_from(tbl) - inner_time_filter = dttm_col.get_time_filter( - inner_from_dttm or from_dttm, - inner_to_dttm or to_dttm, - time_range_endpoints, - ) - subq = subq.where(and_(*(where_clause_and + [inner_time_filter]))) + inner_time_filter = [] + + if dttm_col and not db_engine_spec.time_groupby_inline: + inner_time_filter = [ + dttm_col.get_time_filter( + inner_from_dttm or from_dttm, + inner_to_dttm or to_dttm, + time_range_endpoints, + ) + ] + subq = subq.where(and_(*(where_clause_and + inner_time_filter))) subq = subq.group_by(*inner_groupby_exprs) ob = inner_main_metric_expr - if timeseries_limit_metric: - ob = self._get_timeseries_orderby( - timeseries_limit_metric, metrics_by_name, columns_by_name + if series_limit_metric: + ob = self._get_series_orderby( + series_limit_metric, metrics_by_name, columns_by_name ) direction = desc if order_desc else asc subq = subq.order_by(direction(ob)) - subq = subq.limit(timeseries_limit) + subq = subq.limit(series_limit) on_clause = [] - for gby_name, gby_obj in groupby_exprs_sans_timestamp.items(): + for gby_name, gby_obj in groupby_series_columns.items(): # in this case the column name, not the alias, needs to be # conditionally mutated, as it refers to the column alias in # the inner query @@ -1339,13 +1350,11 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma tbl = tbl.join(subq.alias(), and_(*on_clause)) else: - if timeseries_limit_metric: + if series_limit_metric: orderby = [ ( - self._get_timeseries_orderby( - timeseries_limit_metric, - metrics_by_name, - columns_by_name, + self._get_series_orderby( + series_limit_metric, metrics_by_name, columns_by_name, ), False, ) @@ -1354,7 +1363,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma # run prequery to get top groups prequery_obj = { "is_timeseries": False, - "row_limit": timeseries_limit, + "row_limit": series_limit, "metrics": metrics, "granularity": granularity, "groupby": groupby, @@ -1372,10 +1381,10 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma dimensions = [ c for c in result.df.columns - if c not in metrics and c in groupby_exprs_sans_timestamp + if c not in metrics and c in groupby_series_columns ] top_groups = self._get_top_groups( - result.df, dimensions, groupby_exprs_sans_timestamp + result.df, dimensions, groupby_series_columns ) qry = qry.where(top_groups) @@ -1398,31 +1407,29 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma prequeries=prequeries, ) - def _get_timeseries_orderby( + def _get_series_orderby( self, - timeseries_limit_metric: Metric, + series_limit_metric: Metric, metrics_by_name: Dict[str, SqlMetric], columns_by_name: Dict[str, TableColumn], ) -> Column: - if utils.is_adhoc_metric(timeseries_limit_metric): - assert isinstance(timeseries_limit_metric, dict) - ob = self.adhoc_metric_to_sqla(timeseries_limit_metric, columns_by_name) + if utils.is_adhoc_metric(series_limit_metric): + assert isinstance(series_limit_metric, dict) + ob = self.adhoc_metric_to_sqla(series_limit_metric, columns_by_name) elif ( - isinstance(timeseries_limit_metric, str) - and timeseries_limit_metric in metrics_by_name + isinstance(series_limit_metric, str) + and series_limit_metric in metrics_by_name ): - ob = metrics_by_name[timeseries_limit_metric].get_sqla_col() + ob = metrics_by_name[series_limit_metric].get_sqla_col() else: raise QueryObjectValidationError( - _("Metric '%(metric)s' does not exist", metric=timeseries_limit_metric) + _("Metric '%(metric)s' does not exist", metric=series_limit_metric) ) return ob - def _get_top_groups( # pylint: disable=no-self-use - self, - df: pd.DataFrame, - dimensions: List[str], - groupby_exprs: "OrderedDict[str, Any]", + @staticmethod + def _get_top_groups( + df: pd.DataFrame, dimensions: List[str], groupby_exprs: Dict[str, Any], ) -> ColumnElement: groups = [] for _unused, row in df.iterrows(): diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index f10ded906cf91..5b3790ac18e32 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -272,6 +272,8 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods GenericDataType.BOOLEAN, ), ) + + # Does database support join-free timeslot grouping time_groupby_inline = False limit_method = LimitMethod.FORCE_LIMIT time_secondary_columns = False diff --git a/tests/integration_tests/charts/api_tests.py b/tests/integration_tests/charts/api_tests.py index ca0e45ed520a0..05ddb0832c506 100644 --- a/tests/integration_tests/charts/api_tests.py +++ b/tests/integration_tests/charts/api_tests.py @@ -35,7 +35,7 @@ import prison import pytest import yaml -from sqlalchemy import and_, or_ +from sqlalchemy import and_ from sqlalchemy.sql import func from tests.integration_tests.fixtures.world_bank_dashboard import ( @@ -1956,3 +1956,24 @@ def test_chart_data_timegrains(self): "verbose_name", "dtype", ] + + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_chart_data_series_limit(self): + """ + Chart data API: Query total rows + """ + SERIES_LIMIT = 5 + self.login(username="admin") + request_payload = get_query_context("birth_names") + request_payload["queries"][0]["columns"] = ["state", "name"] + request_payload["queries"][0]["series_columns"] = ["name"] + request_payload["queries"][0]["series_limit"] = SERIES_LIMIT + rv = self.post_assert_metric(CHART_DATA_URI, request_payload, "data") + response_payload = json.loads(rv.data.decode("utf-8")) + data = response_payload["result"][0]["data"] + unique_names = set(row["name"] for row in data) + self.maxDiff = None + self.assertEqual(len(unique_names), SERIES_LIMIT) + self.assertEqual( + set(column for column in data[0].keys()), {"state", "name", "sum__num"} + ) diff --git a/tests/integration_tests/fixtures/query_context.py b/tests/integration_tests/fixtures/query_context.py index beb961cd61595..d36a01087753f 100644 --- a/tests/integration_tests/fixtures/query_context.py +++ b/tests/integration_tests/fixtures/query_context.py @@ -29,7 +29,7 @@ ), "time_grain_sqla": "P1D", }, - "groupby": ["name"], + "columns": ["name"], "metrics": [{"label": "sum__num"}], "orderby": [("sum__num", False)], "row_limit": 100, diff --git a/tests/integration_tests/model_tests.py b/tests/integration_tests/model_tests.py index c8499ce59207a..e84f9183faf89 100644 --- a/tests/integration_tests/model_tests.py +++ b/tests/integration_tests/model_tests.py @@ -432,6 +432,7 @@ def query_with_expr_helper(self, is_timeseries, inner_join=True): from_dttm=None, to_dttm=None, extras=dict(time_grain_sqla="P1Y"), + series_limit=15 if inner_join and is_timeseries else None, ) qr = tbl.query(query_obj) self.assertEqual(qr.status, QueryStatus.SUCCESS) diff --git a/tests/integration_tests/query_context_tests.py b/tests/integration_tests/query_context_tests.py index 87af4c931b988..b6d7f97e2d6db 100644 --- a/tests/integration_tests/query_context_tests.py +++ b/tests/integration_tests/query_context_tests.py @@ -69,7 +69,7 @@ def test_schema_deserialization(self): # check basic properies self.assertEqual(query.extras, payload_query["extras"]) self.assertEqual(query.filter, payload_query["filters"]) - self.assertEqual(query.groupby, payload_query["groupby"]) + self.assertEqual(query.columns, payload_query["columns"]) # metrics are mutated during creation for metric_idx, metric in enumerate(query.metrics): @@ -277,12 +277,20 @@ def test_convert_deprecated_fields(self): """ self.login(username="admin") payload = get_query_context("birth_names") + columns = payload["queries"][0]["columns"] + payload["queries"][0]["groupby"] = columns + payload["queries"][0]["timeseries_limit"] = 99 + payload["queries"][0]["timeseries_limit_metric"] = "sum__num" + del payload["queries"][0]["columns"] payload["queries"][0]["granularity_sqla"] = "timecol" payload["queries"][0]["having_filters"] = [{"col": "a", "op": "==", "val": "b"}] query_context = ChartDataQueryContextSchema().load(payload) self.assertEqual(len(query_context.queries), 1) query_object = query_context.queries[0] self.assertEqual(query_object.granularity, "timecol") + self.assertEqual(query_object.columns, columns) + self.assertEqual(query_object.series_limit, 99) + self.assertEqual(query_object.series_limit_metric, "sum__num") self.assertIn("having_druid", query_object.extras) @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")