From dad3e430ca1039b556b7ba989cfd87a81396608f Mon Sep 17 00:00:00 2001 From: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Date: Tue, 10 Aug 2021 19:18:46 +0300 Subject: [PATCH] feat(cross-filters): add support for temporal filters (#16139) * feat(cross-filters): add support for temporal filters * fix test * make filter optional * remove mocks * fix more tests * remove unnecessary optionality * fix even more tests * bump superset-ui * add isExtra to schema * address comments * fix presto test (cherry picked from commit f042910a01708b983ab770529b59e1cac9eb9c44) --- superset-frontend/package-lock.json | 604 ++++++++++---------- superset-frontend/package.json | 56 +- superset/charts/schemas.py | 14 + superset/common/query_object.py | 5 +- superset/connectors/sqla/models.py | 65 ++- superset/db_engine_specs/base.py | 4 +- superset/typing.py | 2 +- superset/utils/core.py | 94 ++- superset/viz.py | 6 +- tests/integration_tests/model_tests.py | 9 +- tests/integration_tests/utils/core_tests.py | 51 +- tests/integration_tests/utils_tests.py | 60 +- tests/integration_tests/viz_tests.py | 12 +- 13 files changed, 543 insertions(+), 439 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 51d88149d561c..39608e36ee9f0 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -15,35 +15,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.79", - "@superset-ui/core": "^0.17.75", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.79", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.79", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.79", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.79", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.79", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.79", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.79", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.79", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.79", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.79", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.79", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.79", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.79", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.79", + "@superset-ui/chart-controls": "^0.17.80", + "@superset-ui/core": "^0.17.80", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.80", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.80", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.80", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.80", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.80", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.80", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.80", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.80", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.80", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.80", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.80", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.80", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.80", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.80", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.9", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.79", - "@superset-ui/plugin-chart-echarts": "^0.17.79", - "@superset-ui/plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/plugin-chart-table": "^0.17.79", - "@superset-ui/plugin-chart-word-cloud": "^0.17.79", - "@superset-ui/preset-chart-xy": "^0.17.79", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.80", + "@superset-ui/plugin-chart-echarts": "^0.17.80", + "@superset-ui/plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/plugin-chart-table": "^0.17.80", + "@superset-ui/plugin-chart-word-cloud": "^0.17.80", + "@superset-ui/preset-chart-xy": "^0.17.80", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -11688,12 +11688,12 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.79.tgz", - "integrity": "sha512-Mdgi6/ZYZHrDSyA88+JJZGyp2g0ZVM/2n1aNkKk9pQYr4E7W8OcvFX4HksjyWvicEsR8sQR3q3PczHUuwbm5OA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.80.tgz", + "integrity": "sha512-40H8LPvAsl2Y7UrLMA8DoK7zpNcxPeWPPyb1WIaRVXyZS7F8IeapSuDgj7SnnYGZ6O6zNnS95x2WX7hB4owKZQ==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.17.75", + "@superset-ui/core": "0.17.80", "lodash": "^4.17.15", "prop-types": "^15.7.2" }, @@ -11704,9 +11704,9 @@ } }, "node_modules/@superset-ui/core": { - "version": "0.17.75", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.75.tgz", - "integrity": "sha512-9g9YiQzsI4PFi9963DnizVghuejpHKSnbjGyyYkZa3SDSqTMLFkj4tuBd/s+Skayoo1DNoxzD2ZMMw41D81RcA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.80.tgz", + "integrity": "sha512-BrUF4ba6SyKyjRsDu4y67pywq8LJYVX7vpJ98qOR1Hu634H9a5in5PVu8N03tpfaQXpdao00YfP6T/3bTWMkmA==", "dependencies": { "@babel/runtime": "^7.1.2", "@emotion/styled": "^11.3.0", @@ -11828,12 +11828,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.79.tgz", - "integrity": "sha512-hgKVzR0m0eS6hP2BTk7f3dY/FnWDWKsNDmSie9TbFn04XdOYnf4H6p253rf+sI0TtQ6/G2DM39nKxUehm8wJfQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.80.tgz", + "integrity": "sha512-dFRBDDbSmPfA+EI31F5dWQdNZRlR6COPr+5NQXzXm7HGcHpBfmI4YjCzeLgwJxtOWjvl1k7yEs+dfdV3Vc6tuA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -11852,24 +11852,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.79.tgz", - "integrity": "sha512-okUKLettzXkqkcZ4GpeA8IchK6FMrb9CjuRYNB8U3jdXypNdwbYN1EKkuAm4H0AUvk3oBhr1k/2BTkG1y8UGeg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.80.tgz", + "integrity": "sha512-jhOvHRbG3p1HZa5t22jFphhs3OBfoz+Tfh4YtllLCBmezP0A+a/GxLERknBJyHiXLRWl7cWiLILrD5/D4rkVWA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.79.tgz", - "integrity": "sha512-xQFCQ5Baf14HU/NOCLcCjRobGz+pYrjkz3aYXuj+db6xjz1wVdZUBtLM2atD7TzHM7Yn5jHdpQa8XRUUHQc2cg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.80.tgz", + "integrity": "sha512-IqAPteHUyt75TiouAWkDNcxSZrC4PT5CaP0jsjtVpbtww3bhS6R7tnB2onOhb5mqTNhkkqHxBxuFHPYwtjdGPw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -11884,13 +11884,13 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.79.tgz", - "integrity": "sha512-hC0sen6ojNaZ+WIOtzEjEafPK2uJDUP3yF1dx9Z2QuoYATHthz74X5KHKWit/l5qi/R4jEH5ORw4M4qAFytwDw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.80.tgz", + "integrity": "sha512-CODDrH4tGbHRomKlPlHtLxA8S6d1keTKxle3ADp440WR+JvuttNgT9+LdB/8eO8zMoU1g11CViFIW5duWZ+pnA==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "prop-types": "^15.6.2" }, "peerDependencies": { @@ -11898,12 +11898,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.79.tgz", - "integrity": "sha512-nhXyFgXuLqxURu5qFHc66NaD8T/8nBmNQEzDjJ+o7qrrMJeldgzAEjZGjoN1O014qiktA/D+nNKtyVmGeGRbIg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.80.tgz", + "integrity": "sha512-W6MU/DY9ZAPDf5Q0cO9VyvrEic8wBiaSPMPNQ40IQv6UYmukjPoZhWhyQUex7ieCsqqKANCPbARPAK+F3/Y/uA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -11912,12 +11912,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.79.tgz", - "integrity": "sha512-EkcK1d/1F91Eu3+/7RqeUuBJgYebaFATI+nrRmcZ9S80V+iEw9V/9d9dm7UetSxMA2afcK2gNrvTcZ86x5z1Sw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.80.tgz", + "integrity": "sha512-jn6U0fOvUo62wCyMmeCgSUYpjGTrHbhxPi4zZ3JmamkPnXsMxz8c57B7G2cNk9/WpntxJfw7urHjEvlGRZ/L9w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -11925,14 +11925,14 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.79.tgz", - "integrity": "sha512-v9j3s11yqv5KgLwn7UIXoDzkBvkCnGt94l8Mh3QMWWfqSt2EENWVQSQ+yc9wV4ytpbIZepY+z8BDC6TWAiZdwg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.80.tgz", + "integrity": "sha512-RoUJN0w4KFSva9A6tI3wz0IPqzP6ZojpjQWu/Xs95pgZsbHPhz3beTrpv28QaOV8zAEWoTM01u+piASAbPOIVg==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -12001,12 +12001,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.79.tgz", - "integrity": "sha512-rG+PBv6sPkDKQ1ycfusdgq3oUwv6cv1n4hIfoETelsSMqx2PNtwh4gWA4eWqBp2OJR59huAMuUzsvB3xdcNCJA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.80.tgz", + "integrity": "sha512-db2QyGn95Y71wAOdiircDYjmSimmKCNdZ8NjwhXvtreCjDT5IYU3jX14hHQ4HVD/R0PkcZSth4Xg33T0FMBxBw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -12036,12 +12036,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.79.tgz", - "integrity": "sha512-dlO+miiN9jnb3lCY1UwMSws/tr/wO6NBMRHeAzIh+j7I7qcDDtSuNnTG3kBc1LnvP6wqMhgCKU2e63K3aG0gYA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.80.tgz", + "integrity": "sha512-ajaJr3LPuibV5orFfQ2wEnsDadowapTrBYWnPz9LQb0o9DKMXrNKlwuYYKb1xm+7ZdVghFajvoYKQqH9Mm1GAw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -12062,12 +12062,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.79.tgz", - "integrity": "sha512-KWJvuXyM6viUVrARD33tupIjV2L6UGXkp64o3SnRybCuXFUbrLYrCfRlbv+t0IaSt8QgYvM2qT7pCt8iQ5RzMg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.80.tgz", + "integrity": "sha512-bKiHHOM20AooaMMAQDoHMUJjbaN6MftCtYLSXIhoS5vd4d7F6sIkOOtIjxlR/FbmDA5Dcg97hz8M7H3idCtZtg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" @@ -12077,12 +12077,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.79.tgz", - "integrity": "sha512-aliDFjhVuojAXkSeisMZ2uuRK++09A9aCchM1DTiHsI44ZT5GJoUi6Te5Rm/kNRKGyHfFjrXGJmJ3wbJaqxUOA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.80.tgz", + "integrity": "sha512-8W8NhdUbZJrhFcjtOMoEfHv2QXIom0xncJW9xi/HFLsw3j8lbsKw0hfXs+DeqTFITa8ThxqUiw0c8vCiQ94iig==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -12091,12 +12091,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.79.tgz", - "integrity": "sha512-Xh7Ozb+IweXX2SVuQeXlXnVXw2neErTLJ2rFzZz4voyZvcGH93C/rfeKT25QQwButfcfFI6SIXCAXgIwJ0VsRw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.80.tgz", + "integrity": "sha512-IohJ9/iXTjHZdbEYNe09ALy6AT0wBTovGFps6BUNJXPu8i/QrDDr+1gB5cLxw+lb0M4OS+huDd6bn14A2HczSQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" @@ -12106,24 +12106,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-GsVxldm0sRbd9jjGKmgaQ8uyqwlVBr/CYiifsxVRP3VcHRYaMX+1JgYMeko7mImbOpoo4GR1lnQvbzQCWH0yFg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-NF1yMET2MQ1FeBe3pPbNYtyftI12lC5DkDg/diblQq99CU3e8LfAsLuGOWVZiq6TSzFjySs4BaVTBt7BBL0YpQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "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.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.79.tgz", - "integrity": "sha512-rDT+C+3a8gMnA+QCatETSJ3GL3IPsiZ2aHWCXWdcbZo5exNwLYD8gZfyHf8do6LLBc46tSrErE8bXs5TDV2LYg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.80.tgz", + "integrity": "sha512-JJWre7sJkCPrOEM/tlWCAzKGoYO/3VKgNf25luo7P0aMRFAjXYH6AHXqsitQMsUzgMQQ+53+6lE/RS2U9ukHzQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" @@ -12133,12 +12133,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.79.tgz", - "integrity": "sha512-3AMEH15bOInmSHF87f3lgSS9vwKTMYjo67h4NhIflfXMR3EveXCA8dIIJfgS6xYSmaGEE7OL6aeeQE5+rnj4pQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.80.tgz", + "integrity": "sha512-AT7Gm8oUCSqabtVR8OqhOhaNDArl/MFDlV4I2uKN/PdPr8FA8aJCPi0Ud9t6GpUxPMdV6wVUfnW8XfIJdRzwGA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" @@ -12148,47 +12148,47 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.79.tgz", - "integrity": "sha512-OdFBPQbE+vkN/fw9XqeM7lZ8f0xB2itXiwyOKei6MeC6G1cN45/DUlnTAY436ulRvZFhwLhel7g91TN8djSDoA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.80.tgz", + "integrity": "sha512-qivsrBeObFF9ZeAcxyQva4cbA5CgDg6ia9oYWrv6ARWWPqJ121n2UyNbKJd9sGMi85cKT09uVjDNx36Od/7mKA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "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.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.79.tgz", - "integrity": "sha512-VmRsKn/XHUlDKrQ2AQ+C1TRXIJ6m6ittKKuXMqz0XxZWs3jn5RUkNv0W8GuYg814abmZl/e1e0/3lgmYX6LyZg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.80.tgz", + "integrity": "sha512-WAChRf6ECGMltGUEyhpLGWgrysktrChuCJl6BN28l2+/l+w0hIQmdNhtpO+PDLiaUGKCb19pAyr0jUuPoUB3/A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.79.tgz", - "integrity": "sha512-b204bAeVodLiYyzout0a4HXmltptXD/81kX8aA94IIDCAoA7QhbAvb9W9wZcQiDJQwu7MVsS+KPqyyv35Mxo8A==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.80.tgz", + "integrity": "sha512-zm6kDJrSqlOdjp7mmuOCgHVXsjENptAccbon9LHuWcHWp2xByfqgykBNkKoh2v4KMulEmg6JIPI3AzGHJEh8mw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "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.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.79.tgz", - "integrity": "sha512-4iVqpwn4zlI9T4b9venoRLgoEy0+lZKaWbccmUkXPvYL+gpUtkB3z7KuFfp/MWWyruLRCKCd1z2Fedm4wv8ELA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.80.tgz", + "integrity": "sha512-F173Yo6YUXiqH6ZrCZmtRT38b13Bf0Iq4jI3B9POu7fgZWJXmhFVGKzgjPMau5t/5BLjTnyKoTRZ28UqFOomCg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -12213,13 +12213,13 @@ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.79.tgz", - "integrity": "sha512-+OjEbyYugynYGbnobP6pNI59bMXfsaqgX6z+oz7fxCtb5BWxTiciz9W7aKhAqT6XM+I8gkkHUKFj76cyjawY5g==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.80.tgz", + "integrity": "sha512-mwG2fvMIACPlVNnWlXS7Il48AI/TGqVXxEs6LVutyKJXxb9Yrl63hDaWzod7otAF5QW2qsMM17IvEljA8EGpiA==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -12260,13 +12260,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.79.tgz", - "integrity": "sha512-hmBof4w5aF6wZag+wnqQCCYjnxul2KBWqRAj0gWQYohUwgqxxuR3CaEwTP62SNVvmnt8R2iCHM9RpIxfcWpjeQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.80.tgz", + "integrity": "sha512-pWeL/9Es3pwYgm7rENXLoH3FAuTrA5cw02aE+lhClVTJVMruPi39yT3O0cfPx2JAsKhmENR7OFu+nG8wSwd7tw==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -12283,12 +12283,12 @@ } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.79.tgz", - "integrity": "sha512-+lZO5hbQC47G8dDvyqeI4dBsjD2CRSQDqCGFXoecnhKZTzRw3zLX7TYckCK6ZxvLDbgW0ncjRBdcCJtvFs+MAw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.80.tgz", + "integrity": "sha512-Oz1BQI6IvtYAU1zsZvMzT8WPL7234OcLTmM/pfRRLbjDsY942tioGHAr/kOfnoeVmgtdhrZDt3ch1n+vrvK6Aw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.2", @@ -12300,12 +12300,12 @@ } }, "node_modules/@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-sz3FfM8Odm+r094rNCRO1DGxMNZl8j0ySnwFYQTbdZNFgqUvcQme9x7QC51IBk3OQ/TOm8oMJG5hTV1/4HrCKA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-JP+fS5++2u1Cr+FjNETllJWwAauuXJGJ2q5Gv0mMAw+kB/9i5yZKRvM6VQyL4NvYO4VqYjL5g440G0OLqGeQ6A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@superset-ui/react-pivottable": "^0.12.11" }, "peerDependencies": { @@ -12314,13 +12314,13 @@ } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.79.tgz", - "integrity": "sha512-gPXgLJntH72ligPD0V6XNT5Cj6eWzztL154/uhUf8qxXKSBB5wETrFqtIl00S99wJQeaPRN6UGER/eiuGqGOTA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.80.tgz", + "integrity": "sha512-0404twIq84jGiKbC/yfQwbYFh0RNBn8qMJnRO3oCtzvVmF3gelm8+mGKtUnxpd/OC6wiAXyorfoF3mlSW615oA==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -12345,12 +12345,12 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.79.tgz", - "integrity": "sha512-EpHMJ1Qd7GnykEjlC+3bOzzBauLTFwZZuFFuCHs8m0exozuFaHQS1VxmpR1h3zJsp6pjF3PRFU05fpQ5LUAbnA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.80.tgz", + "integrity": "sha512-BBXJywPpF5q5y/+7S4PxJFajEufcURKgbTDbVE2uVj85v5m1XtdM5UpvjJ6O4AmksxKD3J1PfSBXtXehttf3hg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -12383,14 +12383,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.79.tgz", - "integrity": "sha512-JisKp00zIVa8VKSBXG1HNDj6hcRf70kHAGuSXHrQ8BUdfhy9Xc20oUMMFKeWSi0cc5NzPkgGg9Vl/vd3fvsO8Q==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.80.tgz", + "integrity": "sha512-AfxeBs9w0D7Af5NAKeJ1PmMfitjodpR2AELlsx1s9VkVXoz4Y3FgY9YkUCsphietzjF7Z1kSPYXPLY+wa57oMQ==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -60549,20 +60549,20 @@ } }, "@superset-ui/chart-controls": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.79.tgz", - "integrity": "sha512-Mdgi6/ZYZHrDSyA88+JJZGyp2g0ZVM/2n1aNkKk9pQYr4E7W8OcvFX4HksjyWvicEsR8sQR3q3PczHUuwbm5OA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.80.tgz", + "integrity": "sha512-40H8LPvAsl2Y7UrLMA8DoK7zpNcxPeWPPyb1WIaRVXyZS7F8IeapSuDgj7SnnYGZ6O6zNnS95x2WX7hB4owKZQ==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.17.75", + "@superset-ui/core": "0.17.80", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.17.75", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.75.tgz", - "integrity": "sha512-9g9YiQzsI4PFi9963DnizVghuejpHKSnbjGyyYkZa3SDSqTMLFkj4tuBd/s+Skayoo1DNoxzD2ZMMw41D81RcA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.80.tgz", + "integrity": "sha512-BrUF4ba6SyKyjRsDu4y67pywq8LJYVX7vpJ98qOR1Hu634H9a5in5PVu8N03tpfaQXpdao00YfP6T/3bTWMkmA==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/styled": "^11.3.0", @@ -60682,12 +60682,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.79.tgz", - "integrity": "sha512-hgKVzR0m0eS6hP2BTk7f3dY/FnWDWKsNDmSie9TbFn04XdOYnf4H6p253rf+sI0TtQ6/G2DM39nKxUehm8wJfQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.80.tgz", + "integrity": "sha512-dFRBDDbSmPfA+EI31F5dWQdNZRlR6COPr+5NQXzXm7HGcHpBfmI4YjCzeLgwJxtOWjvl1k7yEs+dfdV3Vc6tuA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -60705,24 +60705,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.79.tgz", - "integrity": "sha512-okUKLettzXkqkcZ4GpeA8IchK6FMrb9CjuRYNB8U3jdXypNdwbYN1EKkuAm4H0AUvk3oBhr1k/2BTkG1y8UGeg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.80.tgz", + "integrity": "sha512-jhOvHRbG3p1HZa5t22jFphhs3OBfoz+Tfh4YtllLCBmezP0A+a/GxLERknBJyHiXLRWl7cWiLILrD5/D4rkVWA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.79.tgz", - "integrity": "sha512-xQFCQ5Baf14HU/NOCLcCjRobGz+pYrjkz3aYXuj+db6xjz1wVdZUBtLM2atD7TzHM7Yn5jHdpQa8XRUUHQc2cg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.80.tgz", + "integrity": "sha512-IqAPteHUyt75TiouAWkDNcxSZrC4PT5CaP0jsjtVpbtww3bhS6R7tnB2onOhb5mqTNhkkqHxBxuFHPYwtjdGPw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -60739,34 +60739,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.79.tgz", - "integrity": "sha512-hC0sen6ojNaZ+WIOtzEjEafPK2uJDUP3yF1dx9Z2QuoYATHthz74X5KHKWit/l5qi/R4jEH5ORw4M4qAFytwDw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.80.tgz", + "integrity": "sha512-CODDrH4tGbHRomKlPlHtLxA8S6d1keTKxle3ADp440WR+JvuttNgT9+LdB/8eO8zMoU1g11CViFIW5duWZ+pnA==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.79.tgz", - "integrity": "sha512-nhXyFgXuLqxURu5qFHc66NaD8T/8nBmNQEzDjJ+o7qrrMJeldgzAEjZGjoN1O014qiktA/D+nNKtyVmGeGRbIg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.80.tgz", + "integrity": "sha512-W6MU/DY9ZAPDf5Q0cO9VyvrEic8wBiaSPMPNQ40IQv6UYmukjPoZhWhyQUex7ieCsqqKANCPbARPAK+F3/Y/uA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.79.tgz", - "integrity": "sha512-EkcK1d/1F91Eu3+/7RqeUuBJgYebaFATI+nrRmcZ9S80V+iEw9V/9d9dm7UetSxMA2afcK2gNrvTcZ86x5z1Sw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.80.tgz", + "integrity": "sha512-jn6U0fOvUo62wCyMmeCgSUYpjGTrHbhxPi4zZ3JmamkPnXsMxz8c57B7G2cNk9/WpntxJfw7urHjEvlGRZ/L9w==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -60774,14 +60774,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.79.tgz", - "integrity": "sha512-v9j3s11yqv5KgLwn7UIXoDzkBvkCnGt94l8Mh3QMWWfqSt2EENWVQSQ+yc9wV4ytpbIZepY+z8BDC6TWAiZdwg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.80.tgz", + "integrity": "sha512-RoUJN0w4KFSva9A6tI3wz0IPqzP6ZojpjQWu/Xs95pgZsbHPhz3beTrpv28QaOV8zAEWoTM01u+piASAbPOIVg==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -60849,12 +60849,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.79.tgz", - "integrity": "sha512-rG+PBv6sPkDKQ1ycfusdgq3oUwv6cv1n4hIfoETelsSMqx2PNtwh4gWA4eWqBp2OJR59huAMuUzsvB3xdcNCJA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.80.tgz", + "integrity": "sha512-db2QyGn95Y71wAOdiircDYjmSimmKCNdZ8NjwhXvtreCjDT5IYU3jX14hHQ4HVD/R0PkcZSth4Xg33T0FMBxBw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -60883,12 +60883,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.79.tgz", - "integrity": "sha512-dlO+miiN9jnb3lCY1UwMSws/tr/wO6NBMRHeAzIh+j7I7qcDDtSuNnTG3kBc1LnvP6wqMhgCKU2e63K3aG0gYA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.80.tgz", + "integrity": "sha512-ajaJr3LPuibV5orFfQ2wEnsDadowapTrBYWnPz9LQb0o9DKMXrNKlwuYYKb1xm+7ZdVghFajvoYKQqH9Mm1GAw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -60905,118 +60905,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.79.tgz", - "integrity": "sha512-KWJvuXyM6viUVrARD33tupIjV2L6UGXkp64o3SnRybCuXFUbrLYrCfRlbv+t0IaSt8QgYvM2qT7pCt8iQ5RzMg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.80.tgz", + "integrity": "sha512-bKiHHOM20AooaMMAQDoHMUJjbaN6MftCtYLSXIhoS5vd4d7F6sIkOOtIjxlR/FbmDA5Dcg97hz8M7H3idCtZtg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.79.tgz", - "integrity": "sha512-aliDFjhVuojAXkSeisMZ2uuRK++09A9aCchM1DTiHsI44ZT5GJoUi6Te5Rm/kNRKGyHfFjrXGJmJ3wbJaqxUOA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.80.tgz", + "integrity": "sha512-8W8NhdUbZJrhFcjtOMoEfHv2QXIom0xncJW9xi/HFLsw3j8lbsKw0hfXs+DeqTFITa8ThxqUiw0c8vCiQ94iig==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.79.tgz", - "integrity": "sha512-Xh7Ozb+IweXX2SVuQeXlXnVXw2neErTLJ2rFzZz4voyZvcGH93C/rfeKT25QQwButfcfFI6SIXCAXgIwJ0VsRw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.80.tgz", + "integrity": "sha512-IohJ9/iXTjHZdbEYNe09ALy6AT0wBTovGFps6BUNJXPu8i/QrDDr+1gB5cLxw+lb0M4OS+huDd6bn14A2HczSQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-GsVxldm0sRbd9jjGKmgaQ8uyqwlVBr/CYiifsxVRP3VcHRYaMX+1JgYMeko7mImbOpoo4GR1lnQvbzQCWH0yFg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-NF1yMET2MQ1FeBe3pPbNYtyftI12lC5DkDg/diblQq99CU3e8LfAsLuGOWVZiq6TSzFjySs4BaVTBt7BBL0YpQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.79.tgz", - "integrity": "sha512-rDT+C+3a8gMnA+QCatETSJ3GL3IPsiZ2aHWCXWdcbZo5exNwLYD8gZfyHf8do6LLBc46tSrErE8bXs5TDV2LYg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.80.tgz", + "integrity": "sha512-JJWre7sJkCPrOEM/tlWCAzKGoYO/3VKgNf25luo7P0aMRFAjXYH6AHXqsitQMsUzgMQQ+53+6lE/RS2U9ukHzQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.79.tgz", - "integrity": "sha512-3AMEH15bOInmSHF87f3lgSS9vwKTMYjo67h4NhIflfXMR3EveXCA8dIIJfgS6xYSmaGEE7OL6aeeQE5+rnj4pQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.80.tgz", + "integrity": "sha512-AT7Gm8oUCSqabtVR8OqhOhaNDArl/MFDlV4I2uKN/PdPr8FA8aJCPi0Ud9t6GpUxPMdV6wVUfnW8XfIJdRzwGA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.79.tgz", - "integrity": "sha512-OdFBPQbE+vkN/fw9XqeM7lZ8f0xB2itXiwyOKei6MeC6G1cN45/DUlnTAY436ulRvZFhwLhel7g91TN8djSDoA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.80.tgz", + "integrity": "sha512-qivsrBeObFF9ZeAcxyQva4cbA5CgDg6ia9oYWrv6ARWWPqJ121n2UyNbKJd9sGMi85cKT09uVjDNx36Od/7mKA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.79.tgz", - "integrity": "sha512-VmRsKn/XHUlDKrQ2AQ+C1TRXIJ6m6ittKKuXMqz0XxZWs3jn5RUkNv0W8GuYg814abmZl/e1e0/3lgmYX6LyZg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.80.tgz", + "integrity": "sha512-WAChRf6ECGMltGUEyhpLGWgrysktrChuCJl6BN28l2+/l+w0hIQmdNhtpO+PDLiaUGKCb19pAyr0jUuPoUB3/A==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.79.tgz", - "integrity": "sha512-b204bAeVodLiYyzout0a4HXmltptXD/81kX8aA94IIDCAoA7QhbAvb9W9wZcQiDJQwu7MVsS+KPqyyv35Mxo8A==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.80.tgz", + "integrity": "sha512-zm6kDJrSqlOdjp7mmuOCgHVXsjENptAccbon9LHuWcHWp2xByfqgykBNkKoh2v4KMulEmg6JIPI3AzGHJEh8mw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.79.tgz", - "integrity": "sha512-4iVqpwn4zlI9T4b9venoRLgoEy0+lZKaWbccmUkXPvYL+gpUtkB3z7KuFfp/MWWyruLRCKCd1z2Fedm4wv8ELA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.80.tgz", + "integrity": "sha512-F173Yo6YUXiqH6ZrCZmtRT38b13Bf0Iq4jI3B9POu7fgZWJXmhFVGKzgjPMau5t/5BLjTnyKoTRZ28UqFOomCg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -61040,13 +61040,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.79.tgz", - "integrity": "sha512-+OjEbyYugynYGbnobP6pNI59bMXfsaqgX6z+oz7fxCtb5BWxTiciz9W7aKhAqT6XM+I8gkkHUKFj76cyjawY5g==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.80.tgz", + "integrity": "sha512-mwG2fvMIACPlVNnWlXS7Il48AI/TGqVXxEs6LVutyKJXxb9Yrl63hDaWzod7otAF5QW2qsMM17IvEljA8EGpiA==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -61079,13 +61079,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.79.tgz", - "integrity": "sha512-hmBof4w5aF6wZag+wnqQCCYjnxul2KBWqRAj0gWQYohUwgqxxuR3CaEwTP62SNVvmnt8R2iCHM9RpIxfcWpjeQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.80.tgz", + "integrity": "sha512-pWeL/9Es3pwYgm7rENXLoH3FAuTrA5cw02aE+lhClVTJVMruPi39yT3O0cfPx2JAsKhmENR7OFu+nG8wSwd7tw==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -61099,12 +61099,12 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.79.tgz", - "integrity": "sha512-+lZO5hbQC47G8dDvyqeI4dBsjD2CRSQDqCGFXoecnhKZTzRw3zLX7TYckCK6ZxvLDbgW0ncjRBdcCJtvFs+MAw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.80.tgz", + "integrity": "sha512-Oz1BQI6IvtYAU1zsZvMzT8WPL7234OcLTmM/pfRRLbjDsY942tioGHAr/kOfnoeVmgtdhrZDt3ch1n+vrvK6Aw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.2", @@ -61113,23 +61113,23 @@ } }, "@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-sz3FfM8Odm+r094rNCRO1DGxMNZl8j0ySnwFYQTbdZNFgqUvcQme9x7QC51IBk3OQ/TOm8oMJG5hTV1/4HrCKA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-JP+fS5++2u1Cr+FjNETllJWwAauuXJGJ2q5Gv0mMAw+kB/9i5yZKRvM6VQyL4NvYO4VqYjL5g440G0OLqGeQ6A==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@superset-ui/react-pivottable": "^0.12.11" } }, "@superset-ui/plugin-chart-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.79.tgz", - "integrity": "sha512-gPXgLJntH72ligPD0V6XNT5Cj6eWzztL154/uhUf8qxXKSBB5wETrFqtIl00S99wJQeaPRN6UGER/eiuGqGOTA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.80.tgz", + "integrity": "sha512-0404twIq84jGiKbC/yfQwbYFh0RNBn8qMJnRO3oCtzvVmF3gelm8+mGKtUnxpd/OC6wiAXyorfoF3mlSW615oA==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -61151,12 +61151,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.79.tgz", - "integrity": "sha512-EpHMJ1Qd7GnykEjlC+3bOzzBauLTFwZZuFFuCHs8m0exozuFaHQS1VxmpR1h3zJsp6pjF3PRFU05fpQ5LUAbnA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.80.tgz", + "integrity": "sha512-BBXJywPpF5q5y/+7S4PxJFajEufcURKgbTDbVE2uVj85v5m1XtdM5UpvjJ6O4AmksxKD3J1PfSBXtXehttf3hg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -61187,14 +61187,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.79.tgz", - "integrity": "sha512-JisKp00zIVa8VKSBXG1HNDj6hcRf70kHAGuSXHrQ8BUdfhy9Xc20oUMMFKeWSi0cc5NzPkgGg9Vl/vd3fvsO8Q==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.80.tgz", + "integrity": "sha512-AfxeBs9w0D7Af5NAKeJ1PmMfitjodpR2AELlsx1s9VkVXoz4Y3FgY9YkUCsphietzjF7Z1kSPYXPLY+wa57oMQ==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@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 e3d83d97a2a48..ccda31d468894 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -67,35 +67,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.79", - "@superset-ui/core": "^0.17.75", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.79", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.79", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.79", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.79", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.79", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.79", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.79", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.79", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.79", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.79", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.79", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.79", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.79", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.79", + "@superset-ui/chart-controls": "^0.17.80", + "@superset-ui/core": "^0.17.80", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.80", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.80", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.80", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.80", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.80", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.80", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.80", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.80", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.80", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.80", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.80", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.80", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.80", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.80", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.9", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.79", - "@superset-ui/plugin-chart-echarts": "^0.17.79", - "@superset-ui/plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/plugin-chart-table": "^0.17.79", - "@superset-ui/plugin-chart-word-cloud": "^0.17.79", - "@superset-ui/preset-chart-xy": "^0.17.79", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.80", + "@superset-ui/plugin-chart-echarts": "^0.17.80", + "@superset-ui/plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/plugin-chart-table": "^0.17.80", + "@superset-ui/plugin-chart-word-cloud": "^0.17.80", + "@superset-ui/preset-chart-xy": "^0.17.80", "@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 bef857de91953..9c086a74b5a57 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -294,6 +294,13 @@ class ChartDataAdhocMetricSchema(Schema): "will be generated.", example="metric_aec60732-fac0-4b17-b736-93f1a5c93e30", ) + timeGrain = fields.String( + description="Optional time grain for temporal filters", example="PT1M", + ) + isExtra = fields.Boolean( + description="Indicates if the filter has been added by a filter component as " + "opposed to being a part of the original query." + ) class ChartDataAggregateConfigField(fields.Dict): @@ -772,6 +779,13 @@ class ChartDataFilterSchema(Schema): "integer, decimal or list, depending on the operator.", example=["China", "France", "Japan"], ) + grain = fields.String( + description="Optional time grain for temporal filters", example="PT1M", + ) + isExtra = fields.Boolean( + description="Indicates if the filter has been added by a filter component as " + "opposed to being a part of the original query." + ) class ChartDataExtrasSchema(Schema): diff --git a/superset/common/query_object.py b/superset/common/query_object.py index 8ab4c620f4c77..01ceaecbc4610 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -36,6 +36,7 @@ get_metric_names, is_adhoc_metric, json_int_dttm_ser, + QueryObjectFilterClause, ) from superset.utils.date_parser import get_since_until, parse_human_timedelta from superset.utils.hashing import md5_sha_from_dict @@ -85,7 +86,7 @@ class QueryObject: metrics: Optional[List[Metric]] row_limit: int row_offset: int - filter: List[Dict[str, Any]] + filter: List[QueryObjectFilterClause] timeseries_limit: int timeseries_limit_metric: Optional[Metric] order_desc: bool @@ -108,7 +109,7 @@ def __init__( granularity: Optional[str] = None, metrics: Optional[List[Metric]] = None, groupby: Optional[List[str]] = None, - filters: Optional[List[Dict[str, Any]]] = None, + filters: Optional[List[QueryObjectFilterClause]] = None, time_range: Optional[str] = None, time_shift: Optional[str] = None, is_timeseries: Optional[bool] = None, diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index d838c27d9177a..d4d185eef6ef1 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -86,7 +86,11 @@ from superset.sql_parse import ParsedQuery from superset.typing import AdhocMetric, Metric, OrderBy, QueryObjectDict from superset.utils import core as utils -from superset.utils.core import GenericDataType, remove_duplicates +from superset.utils.core import ( + GenericDataType, + QueryObjectFilterClause, + remove_duplicates, +) config = app.config metadata = Model.metadata # pylint: disable=no-member @@ -304,13 +308,15 @@ def get_timestamp_expression( pdf = self.python_date_format is_epoch = pdf in ("epoch_s", "epoch_ms") + column_spec = self.db_engine_spec.get_column_spec(self.type) + type_ = column_spec.sqla_type if column_spec else DateTime if not self.expression and not time_grain and not is_epoch: - sqla_col = column(self.column_name, type_=DateTime) + sqla_col = column(self.column_name, type_=type_) return self.table.make_sqla_column_compatible(sqla_col, label) if self.expression: - col = literal_column(self.expression) + col = literal_column(self.expression, type_=type_) else: - col = column(self.column_name) + col = column(self.column_name, type_=type_) time_expr = self.db_engine_spec.get_timestamp_expr( col, pdf, time_grain, self.type ) @@ -937,7 +943,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma columns: Optional[List[str]] = None, groupby: Optional[List[str]] = None, filter: Optional[ # pylint: disable=redefined-builtin - List[Dict[str, Any]] + List[QueryObjectFilterClause] ] = None, is_timeseries: bool = True, timeseries_limit: int = 15, @@ -1058,6 +1064,8 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma # filter out the pseudo column __timestamp from columns columns = columns or [] columns = [col for col in columns if col != utils.DTTM_ALIAS] + time_grain = extras.get("time_grain_sqla") + dttm_col = columns_by_name.get(granularity) if granularity else None if need_groupby: # dedup columns while preserving order @@ -1065,7 +1073,6 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma for selected in columns: # if groupby field/expr equals granularity field/expr if selected == granularity: - time_grain = extras.get("time_grain_sqla") sqla_col = columns_by_name[selected] outer = sqla_col.get_timestamp_expression(time_grain, selected) # if groupby field equals a selected column @@ -1089,15 +1096,13 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma groupby_exprs_with_timestamp = OrderedDict(groupby_exprs_sans_timestamp.items()) if granularity: - if granularity not in columns_by_name: + if granularity not in columns_by_name or not dttm_col: raise QueryObjectValidationError( _( 'Time column "%(col)s" does not exist in dataset', col=granularity, ) ) - dttm_col = columns_by_name[granularity] - time_grain = extras.get("time_grain_sqla") time_filters = [] if is_timeseries: @@ -1152,7 +1157,12 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma col = flt["col"] val = flt.get("val") op = flt["op"].upper() - col_obj = columns_by_name.get(col) + col_obj = ( + dttm_col + if col == utils.DTTM_ALIAS and is_timeseries and dttm_col + else columns_by_name.get(col) + ) + filter_grain = flt.get("grain") if is_feature_enabled("ENABLE_TEMPLATE_REMOVE_FILTERS"): if col in removed_filters: @@ -1160,6 +1170,10 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma continue if col_obj: + if filter_grain: + sqla_col = col_obj.get_timestamp_expression(filter_grain) + else: + sqla_col = col_obj.get_sqla_col() col_spec = db_engine_spec.get_column_spec(col_obj.type) is_list_target = op in ( utils.FilterOperator.IN.value, @@ -1182,24 +1196,24 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) if None in eq: eq = [x for x in eq if x is not None] - is_null_cond = col_obj.get_sqla_col().is_(None) + is_null_cond = sqla_col.is_(None) if eq: - cond = or_(is_null_cond, col_obj.get_sqla_col().in_(eq)) + cond = or_(is_null_cond, sqla_col.in_(eq)) else: cond = is_null_cond else: - cond = col_obj.get_sqla_col().in_(eq) + cond = sqla_col.in_(eq) if op == utils.FilterOperator.NOT_IN.value: cond = ~cond where_clause_and.append(cond) elif op == utils.FilterOperator.IS_NULL.value: - where_clause_and.append(col_obj.get_sqla_col().is_(None)) + where_clause_and.append(sqla_col.is_(None)) elif op == utils.FilterOperator.IS_NOT_NULL.value: - where_clause_and.append(col_obj.get_sqla_col().isnot(None)) + where_clause_and.append(sqla_col.isnot(None)) elif op == utils.FilterOperator.IS_TRUE.value: - where_clause_and.append(col_obj.get_sqla_col().is_(True)) + where_clause_and.append(sqla_col.is_(True)) elif op == utils.FilterOperator.IS_FALSE.value: - where_clause_and.append(col_obj.get_sqla_col().is_(False)) + where_clause_and.append(sqla_col.is_(False)) else: if eq is None: raise QueryObjectValidationError( @@ -1209,21 +1223,21 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) ) if op == utils.FilterOperator.EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() == eq) + where_clause_and.append(sqla_col == eq) elif op == utils.FilterOperator.NOT_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() != eq) + where_clause_and.append(sqla_col != eq) elif op == utils.FilterOperator.GREATER_THAN.value: - where_clause_and.append(col_obj.get_sqla_col() > eq) + where_clause_and.append(sqla_col > eq) elif op == utils.FilterOperator.LESS_THAN.value: - where_clause_and.append(col_obj.get_sqla_col() < eq) + where_clause_and.append(sqla_col < eq) elif op == utils.FilterOperator.GREATER_THAN_OR_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() >= eq) + where_clause_and.append(sqla_col >= eq) elif op == utils.FilterOperator.LESS_THAN_OR_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() <= eq) + where_clause_and.append(sqla_col <= eq) elif op == utils.FilterOperator.LIKE.value: - where_clause_and.append(col_obj.get_sqla_col().like(eq)) + where_clause_and.append(sqla_col.like(eq)) elif op == utils.FilterOperator.ILIKE.value: - where_clause_and.append(col_obj.get_sqla_col().ilike(eq)) + where_clause_and.append(sqla_col.ilike(eq)) else: raise QueryObjectValidationError( _("Invalid filter operation type: %(op)s", op=op) @@ -1283,6 +1297,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma and timeseries_limit and not time_groupby_inline and groupby_exprs_sans_timestamp + and dttm_col ): if db_engine_spec.allows_joins: # some sql dialects require for order by expressions diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 1ce082c4f66f9..261bedee94dab 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -44,7 +44,7 @@ from flask_babel import gettext as __, lazy_gettext as _ from marshmallow import fields, Schema from marshmallow.validate import Range -from sqlalchemy import column, DateTime, select, types +from sqlalchemy import column, select, types from sqlalchemy.engine.base import Engine from sqlalchemy.engine.interfaces import Compiled, Dialect from sqlalchemy.engine.reflection import Inspector @@ -381,7 +381,7 @@ def get_timestamp_expr( elif pdf == "epoch_ms": time_expr = time_expr.replace("{col}", cls.epoch_ms_to_dttm()) - return TimestampExpression(time_expr, col, type_=DateTime) + return TimestampExpression(time_expr, col, type_=col.type) @classmethod def get_time_grains(cls) -> Tuple[TimeGrain, ...]: diff --git a/superset/typing.py b/superset/typing.py index ed8ed0e0fe096..009c9d9460364 100644 --- a/superset/typing.py +++ b/superset/typing.py @@ -42,7 +42,7 @@ class AdhocMetric(TypedDict): ] DbapiDescription = Union[List[DbapiDescriptionRow], Tuple[DbapiDescriptionRow, ...]] DbapiResult = Sequence[Union[List[Any], Tuple[Any, ...]]] -FilterValue = Union[datetime, float, int, str] +FilterValue = Union[bool, datetime, float, int, str] FilterValues = Union[FilterValue, List[FilterValue], Tuple[FilterValue]] FormData = Dict[str, Any] Granularity = Union[str, Dict[str, Union[str, float]]] diff --git a/superset/utils/core.py b/superset/utils/core.py index 803bafc84e4e3..427ebfaa72bf2 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -96,7 +96,7 @@ SupersetException, SupersetTimeoutException, ) -from superset.typing import AdhocMetric, FlaskResponse, FormData, Metric +from superset.typing import AdhocMetric, FilterValues, FlaskResponse, FormData, Metric from superset.utils.dates import datetime_to_epoch, EPOCH from superset.utils.hashing import md5_sha_from_dict, md5_sha_from_str @@ -189,6 +189,25 @@ class DatasourceDict(TypedDict): id: int +class AdhocFilterClause(TypedDict, total=False): + clause: str + expressionType: str + filterOptionName: Optional[str] + comparator: Optional[FilterValues] + operator: str + subject: str + isExtra: Optional[bool] + sqlExpression: Optional[str] + + +class QueryObjectFilterClause(TypedDict, total=False): + col: str + op: str # pylint: disable=invalid-name + val: Optional[FilterValues] + grain: Optional[str] + isExtra: Optional[bool] + + class ExtraFiltersTimeColumnType(str, Enum): GRANULARITY = "__granularity" TIME_COL = "__time_col" @@ -1017,28 +1036,32 @@ def zlib_decompress(blob: bytes, decode: Optional[bool] = True) -> Union[bytes, return decompressed.decode("utf-8") if decode else decompressed -def to_adhoc( - filt: Dict[str, Any], expression_type: str = "SIMPLE", clause: str = "where" -) -> Dict[str, Any]: - result = { +def simple_filter_to_adhoc( + filter_clause: QueryObjectFilterClause, clause: str = "where", +) -> AdhocFilterClause: + result: AdhocFilterClause = { "clause": clause.upper(), - "expressionType": expression_type, - "isExtra": bool(filt.get("isExtra")), + "expressionType": "SIMPLE", + "comparator": filter_clause.get("val"), + "operator": filter_clause["op"], + "subject": filter_clause["col"], } + if filter_clause.get("isExtra"): + result["isExtra"] = True + result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) - if expression_type == "SIMPLE": - result.update( - { - "comparator": filt.get("val"), - "operator": filt.get("op"), - "subject": filt.get("col"), - } - ) - elif expression_type == "SQL": - result.update({"sqlExpression": filt.get(clause)}) + return result - deterministic_name = md5_sha_from_dict(result) - result["filterOptionName"] = deterministic_name + +def form_data_to_adhoc(form_data: Dict[str, Any], clause: str) -> AdhocFilterClause: + if clause not in ("where", "having"): + raise ValueError(__("Unsupported clause type: %(clause)s", clause=clause)) + result: AdhocFilterClause = { + "clause": clause.upper(), + "expressionType": "SQL", + "sqlExpression": form_data.get(clause), + } + result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) return result @@ -1050,7 +1073,7 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: """ filter_keys = ["filters", "adhoc_filters"] extra_form_data = form_data.pop("extra_form_data", {}) - append_filters = extra_form_data.get("filters", None) + append_filters: List[QueryObjectFilterClause] = extra_form_data.get("filters", None) # merge append extras for key in [key for key in EXTRA_FORM_DATA_APPEND_KEYS if key not in filter_keys]: @@ -1075,13 +1098,21 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: if extras: form_data["extras"] = extras - adhoc_filters = form_data.get("adhoc_filters", []) + adhoc_filters: List[AdhocFilterClause] = form_data.get("adhoc_filters", []) form_data["adhoc_filters"] = adhoc_filters - append_adhoc_filters = extra_form_data.get("adhoc_filters", []) - adhoc_filters.extend({"isExtra": True, **fltr} for fltr in append_adhoc_filters) + append_adhoc_filters: List[AdhocFilterClause] = extra_form_data.get( + "adhoc_filters", [] + ) + adhoc_filters.extend( + {"isExtra": True, **fltr} for fltr in append_adhoc_filters # type: ignore + ) if append_filters: adhoc_filters.extend( - to_adhoc({"isExtra": True, **fltr}) for fltr in append_filters if fltr + simple_filter_to_adhoc( + {"isExtra": True, **fltr} # type: ignore + ) + for fltr in append_filters + if fltr ) @@ -1148,16 +1179,16 @@ def get_filter_key(f: Dict[str, Any]) -> str: # Add filters for unequal lists # order doesn't matter if set(existing_filters[filter_key]) != set(filtr["val"]): - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: # Do not add filter if same value already exists if filtr["val"] != existing_filters[filter_key]: - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: # Filter not found, add it - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) # Remove extra filters from the form data since no longer needed del form_data["extra_filters"] @@ -1268,15 +1299,16 @@ def convert_legacy_filters_into_adhoc( # pylint: disable=invalid-name mapping = {"having": "having_filters", "where": "filters"} if not form_data.get("adhoc_filters"): - form_data["adhoc_filters"] = [] + adhoc_filters: List[AdhocFilterClause] = [] + form_data["adhoc_filters"] = adhoc_filters for clause, filters in mapping.items(): if clause in form_data and form_data[clause] != "": - form_data["adhoc_filters"].append(to_adhoc(form_data, "SQL", clause)) + adhoc_filters.append(form_data_to_adhoc(form_data, clause)) if filters in form_data: for filt in filter(lambda x: x is not None, form_data[filters]): - form_data["adhoc_filters"].append(to_adhoc(filt, "SIMPLE", clause)) + adhoc_filters.append(simple_filter_to_adhoc(filt, clause)) for key in ("filters", "having", "having_filters", "where"): if key in form_data: diff --git a/superset/viz.py b/superset/viz.py index 3dc799eae32bc..cd19807b11b19 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -74,7 +74,7 @@ JS_MAX_INTEGER, merge_extra_filters, QueryMode, - to_adhoc, + simple_filter_to_adhoc, ) from superset.utils.date_parser import get_since_until, parse_past_timedelta from superset.utils.dates import datetime_to_epoch @@ -2475,7 +2475,9 @@ def add_null_filters(self) -> None: spatial_columns.add(line_column) for column in sorted(spatial_columns): - filter_ = to_adhoc({"col": column, "op": "IS NOT NULL", "val": ""}) + filter_ = simple_filter_to_adhoc( + {"col": column, "op": "IS NOT NULL", "val": ""} + ) fd["adhoc_filters"].append(filter_) def query_obj(self) -> QueryObjectDict: diff --git a/tests/integration_tests/model_tests.py b/tests/integration_tests/model_tests.py index ee9b3cd215f06..deb78460b68a0 100644 --- a/tests/integration_tests/model_tests.py +++ b/tests/integration_tests/model_tests.py @@ -22,7 +22,6 @@ load_birth_names_dashboard_with_slices, ) -import pandas import pytest from sqlalchemy.engine.url import make_url @@ -339,12 +338,19 @@ def test_multi_statement(self): class TestSqlaTableModel(SupersetTestCase): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_get_timestamp_expression(self): + col_type = ( + "VARCHAR" + if get_example_database().backend == "presto" + else "TemporalWrapperType" + ) tbl = self.get_table(name="birth_names") ds_col = tbl.get_column("ds") sqla_literal = ds_col.get_timestamp_expression(None) self.assertEqual(str(sqla_literal.compile()), "ds") + assert type(sqla_literal.type).__name__ == col_type sqla_literal = ds_col.get_timestamp_expression("P1D") + assert type(sqla_literal.type).__name__ == col_type compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(ds)") @@ -352,6 +358,7 @@ def test_get_timestamp_expression(self): prev_ds_expr = ds_col.expression ds_col.expression = "DATE_ADD(ds, 1)" sqla_literal = ds_col.get_timestamp_expression("P1D") + assert type(sqla_literal.type).__name__ == col_type compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(DATE_ADD(ds, 1))") diff --git a/tests/integration_tests/utils/core_tests.py b/tests/integration_tests/utils/core_tests.py index 8699dd7ea7f65..3ba39032e4265 100644 --- a/tests/integration_tests/utils/core_tests.py +++ b/tests/integration_tests/utils/core_tests.py @@ -17,10 +17,10 @@ # pylint: disable=no-self-use import pytest -from superset.utils.core import to_adhoc +from superset.utils.core import form_data_to_adhoc, simple_filter_to_adhoc -def test_to_adhoc_generates_deterministic_values(): +def test_simple_filter_to_adhoc_generates_deterministic_values(): input_1 = { "op": "IS NOT NULL", "col": "LATITUDE", @@ -30,25 +30,56 @@ def test_to_adhoc_generates_deterministic_values(): input_2 = {**input_1, "col": "LONGITUDE"} # The result is the same when given the same input - assert to_adhoc(input_1) == to_adhoc(input_1) - assert to_adhoc(input_1) == { + assert simple_filter_to_adhoc(input_1) == simple_filter_to_adhoc(input_1) + assert simple_filter_to_adhoc(input_1) == { "clause": "WHERE", "expressionType": "SIMPLE", - "isExtra": False, "comparator": "", "operator": "IS NOT NULL", "subject": "LATITUDE", - "filterOptionName": "d0908f77d950131db7a69fdc820cb739", + "filterOptionName": "6ac89d498115da22396f80a765cffc70", } # The result is different when given different input - assert to_adhoc(input_1) != to_adhoc(input_2) - assert to_adhoc(input_2) == { + assert simple_filter_to_adhoc(input_1) != simple_filter_to_adhoc(input_2) + assert simple_filter_to_adhoc(input_2) == { "clause": "WHERE", "expressionType": "SIMPLE", - "isExtra": False, "comparator": "", "operator": "IS NOT NULL", "subject": "LONGITUDE", - "filterOptionName": "c5f283f727d4dfc6258b351d4a8663bc", + "filterOptionName": "9c984bd3714883ca859948354ce26ab9", } + + +def test_form_data_to_adhoc_generates_deterministic_values(): + form_data = {"where": "1 = 1", "having": "count(*) > 1"} + + # The result is the same when given the same input + assert form_data_to_adhoc(form_data, "where") == form_data_to_adhoc( + form_data, "where" + ) + assert form_data_to_adhoc(form_data, "where") == { + "clause": "WHERE", + "expressionType": "SQL", + "sqlExpression": "1 = 1", + "filterOptionName": "99fe79985afbddea4492626dc6a87b74", + } + + # The result is different when given different input + assert form_data_to_adhoc(form_data, "having") == form_data_to_adhoc( + form_data, "having" + ) + assert form_data_to_adhoc(form_data, "having") == { + "clause": "HAVING", + "expressionType": "SQL", + "sqlExpression": "count(*) > 1", + "filterOptionName": "1da11f6b709c3190daeabb84f77fc8c2", + } + + +def test_form_data_to_adhoc_incorrect_clause_type(): + form_data = {"where": "1 = 1", "having": "count(*) > 1"} + + with pytest.raises(ValueError): + form_data_to_adhoc(form_data, "foobar") diff --git a/tests/integration_tests/utils_tests.py b/tests/integration_tests/utils_tests.py index 2d668329d3ebf..07a444519ac63 100644 --- a/tests/integration_tests/utils_tests.py +++ b/tests/integration_tests/utils_tests.py @@ -85,19 +85,6 @@ from .fixtures.certificates import ssl_certificate -def mock_to_adhoc(filt, expressionType="SIMPLE", clause="where"): - result = {"clause": clause.upper(), "expressionType": expressionType} - - if expressionType == "SIMPLE": - result.update( - {"comparator": filt["val"], "operator": filt["op"], "subject": filt["col"]} - ) - elif expressionType == "SQL": - result.update({"sqlExpression": filt[clause]}) - - return result - - class TestUtils(SupersetTestCase): def test_json_int_dttm_ser(self): dttm = datetime(2020, 1, 1) @@ -137,7 +124,6 @@ def test_zlib_compression(self): got_str = zlib_decompress(blob) self.assertEqual(json_str, got_str) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters(self): # does nothing if no extra filters form_data = {"A": 1, "B": 2, "c": "test"} @@ -168,6 +154,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -175,6 +163,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": ["c1", "c2"], "expressionType": "SIMPLE", + "filterOptionName": "6c178d069965f1c02640661280415d96", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -212,6 +202,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -219,6 +211,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": ["c1", "c2"], "expressionType": "SIMPLE", + "filterOptionName": "6c178d069965f1c02640661280415d96", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -244,6 +238,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "hello", "expressionType": "SIMPLE", + "filterOptionName": "e3cbdd92a2ae23ca92c6d7fca42e36a6", + "isExtra": True, "operator": "like", "subject": "A", } @@ -264,7 +260,6 @@ def test_merge_extra_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_empty_filters(self): form_data = { "extra_filters": [ @@ -276,7 +271,6 @@ def test_merge_extra_filters_ignores_empty_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_nones(self): form_data = { "adhoc_filters": [ @@ -305,7 +299,6 @@ def test_merge_extra_filters_ignores_nones(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_equal_filters(self): form_data = { "extra_filters": [ @@ -366,7 +359,6 @@ def test_merge_extra_filters_ignores_equal_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_merges_different_val_types(self): form_data = { "extra_filters": [ @@ -410,6 +402,8 @@ def test_merge_extra_filters_merges_different_val_types(self): "clause": "WHERE", "comparator": ["g1", "g2"], "expressionType": "SIMPLE", + "filterOptionName": "c11969c994b40a83a4ae7d48ff1ea28e", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -460,6 +454,8 @@ def test_merge_extra_filters_merges_different_val_types(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -469,7 +465,6 @@ def test_merge_extra_filters_merges_different_val_types(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_adds_unequal_lists(self): form_data = { "extra_filters": [ @@ -513,6 +508,8 @@ def test_merge_extra_filters_adds_unequal_lists(self): "clause": "WHERE", "comparator": ["g1", "g2", "g3"], "expressionType": "SIMPLE", + "filterOptionName": "21cbb68af7b17e62b3b2f75e2190bfd7", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -520,6 +517,8 @@ def test_merge_extra_filters_adds_unequal_lists(self): "clause": "WHERE", "comparator": ["c1", "c2", "c3"], "expressionType": "SIMPLE", + "filterOptionName": "0a8dcb928f1f4bba97643c6e68d672f1", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -580,18 +579,21 @@ def test_validate_json(self): with self.assertRaises(SupersetException): validate_json(invalid) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_where(self): form_data = {"where": "a = 1"} expected = { "adhoc_filters": [ - {"clause": "WHERE", "expressionType": "SQL", "sqlExpression": "a = 1"} + { + "clause": "WHERE", + "expressionType": "SQL", + "filterOptionName": "46fb6d7891e23596e42ae38da94a57e0", + "sqlExpression": "a = 1", + } ] } convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_filters(self): form_data = {"filters": [{"col": "a", "op": "in", "val": "someval"}]} expected = { @@ -600,6 +602,7 @@ def test_convert_legacy_filters_into_adhoc_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "135c7ee246666b840a3d7a9c3a30cf38", "operator": "in", "subject": "a", } @@ -608,7 +611,6 @@ def test_convert_legacy_filters_into_adhoc_filters(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_having(self): form_data = {"having": "COUNT(1) = 1"} expected = { @@ -616,6 +618,7 @@ def test_convert_legacy_filters_into_adhoc_having(self): { "clause": "HAVING", "expressionType": "SQL", + "filterOptionName": "683f1c26466ab912f75a00842e0f2f7b", "sqlExpression": "COUNT(1) = 1", } ] @@ -623,7 +626,6 @@ def test_convert_legacy_filters_into_adhoc_having(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_having_filters(self): form_data = {"having_filters": [{"col": "COUNT(1)", "op": "==", "val": 1}]} expected = { @@ -632,6 +634,7 @@ def test_convert_legacy_filters_into_adhoc_having_filters(self): "clause": "HAVING", "comparator": 1, "expressionType": "SIMPLE", + "filterOptionName": "967d0fb409f6d9c7a6c03a46cf933c9c", "operator": "==", "subject": "COUNT(1)", } @@ -640,18 +643,21 @@ def test_convert_legacy_filters_into_adhoc_having_filters(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_present_and_empty(self): form_data = {"adhoc_filters": [], "where": "a = 1"} expected = { "adhoc_filters": [ - {"clause": "WHERE", "expressionType": "SQL", "sqlExpression": "a = 1"} + { + "clause": "WHERE", + "expressionType": "SQL", + "filterOptionName": "46fb6d7891e23596e42ae38da94a57e0", + "sqlExpression": "a = 1", + } ] } convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_present_and_nonempty(self): form_data = { "adhoc_filters": [ diff --git a/tests/integration_tests/viz_tests.py b/tests/integration_tests/viz_tests.py index c3370ab754fe2..aa4036734bb79 100644 --- a/tests/integration_tests/viz_tests.py +++ b/tests/integration_tests/viz_tests.py @@ -1196,42 +1196,38 @@ def test_filter_nulls(self): { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "bfa3a42a6f3de3c781b7d4f8e8d6613d", + "filterOptionName": "c7f171cf3204bcbf456acfeac5cd9afd", "comparator": "", "operator": "IS NOT NULL", "subject": "lat", - "isExtra": False, }, { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "2d35d87b57c6f1a5ae139f1a6b0cbd0a", + "filterOptionName": "52634073fbb8ae0a3aa59ad48abac55e", "comparator": "", "operator": "IS NOT NULL", "subject": "lon", - "isExtra": False, }, ], "delimited_key": [ { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "89cc0fafe39a4eabc5df2cd52e4d6514", + "filterOptionName": "cae5c925c140593743da08499e6fb207", "comparator": "", "operator": "IS NOT NULL", "subject": "lonlat", - "isExtra": False, } ], "geohash_key": [ { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "fa734d9a7bab254a53b41540d46cdb6c", + "filterOptionName": "d84f55222d8e414e888fa5f990b341d2", "comparator": "", "operator": "IS NOT NULL", "subject": "geo", - "isExtra": False, } ], }