From dcd3710ab5d52733ee359b34f0b22c2a487bf6ee Mon Sep 17 00:00:00 2001 From: Don McCurdy Date: Fri, 14 Mar 2025 11:00:07 -0400 Subject: [PATCH 1/4] feat(widgets): Remove spatialFiltersResolution --- packages/react-api/src/api/model.js | 3 - packages/react-api/src/types.d.ts | 1 - packages/react-redux/src/slices/cartoSlice.js | 3 - .../__tests__/models/utils.test.js | 6 +- .../react-widgets/src/hooks/useWidgetFetch.js | 30 +------ packages/react-widgets/src/index.d.ts | 3 +- packages/react-widgets/src/index.js | 1 - .../src/models/spatialFiltersResolution.js | 87 ------------------- packages/react-widgets/src/models/utils.d.ts | 6 -- packages/react-widgets/src/models/utils.js | 8 +- 10 files changed, 4 insertions(+), 144 deletions(-) delete mode 100644 packages/react-widgets/src/models/spatialFiltersResolution.js diff --git a/packages/react-api/src/api/model.js b/packages/react-api/src/api/model.js index f007382b6..4ce3ad701 100644 --- a/packages/react-api/src/api/model.js +++ b/packages/react-api/src/api/model.js @@ -110,9 +110,6 @@ export function executeModel(props) { if (spatialDataColumn) queryParams.spatialDataColumn = spatialDataColumn; if (spatialDataType !== 'geo') { - if (source.spatialFiltersResolution !== undefined) { - queryParams.spatialFiltersResolution = source.spatialFiltersResolution; - } queryParams.spatialFiltersMode = source.spatialFiltersMode || 'intersects'; } } diff --git a/packages/react-api/src/types.d.ts b/packages/react-api/src/types.d.ts index 1c56959aa..4fc0b3e13 100644 --- a/packages/react-api/src/types.d.ts +++ b/packages/react-api/src/types.d.ts @@ -46,7 +46,6 @@ export type SourceProps = { dataResolution?: number; spatialDataType?: string; spatialDataColumn?: string; - spatialFiltersResolution?: number; aggregationExp?: string; aggregationResLevel?: number; credentials?: Credentials; diff --git a/packages/react-redux/src/slices/cartoSlice.js b/packages/react-redux/src/slices/cartoSlice.js index a1bb50837..f28dd360a 100644 --- a/packages/react-redux/src/slices/cartoSlice.js +++ b/packages/react-redux/src/slices/cartoSlice.js @@ -205,7 +205,6 @@ export const createCartoSlice = (initialState) => { * @param {import('@deck.gl/carto').QueryParameters} data.queryParameters - SQL query parameters. * @param {string=} data.geoColumn - (optional) name of column containing geometries or spatial index data. * @param {number=} data.dataResolution - data resolution for spatial index data. - * @param {number=} data.spatialFiltersResolution - spatial filters resolution for spatial index data. * @param {string=} data.aggregationExp - (optional) for spatial index data. * @param {number=} data.aggregationResLevel - (optional) for spatial index data. * @param {string=} data.provider - (optional) type of the data warehouse. @@ -223,7 +222,6 @@ export const addSource = ({ spatialDataType, spatialDataColumn, dataResolution, - spatialFiltersResolution, aggregationExp, aggregationResLevel, provider @@ -243,7 +241,6 @@ export const addSource = ({ aggregationResLevel, spatialDataType, spatialDataColumn, - spatialFiltersResolution, aggregationExp, provider } diff --git a/packages/react-widgets/__tests__/models/utils.test.js b/packages/react-widgets/__tests__/models/utils.test.js index 61d114751..777a38a0f 100644 --- a/packages/react-widgets/__tests__/models/utils.test.js +++ b/packages/react-widgets/__tests__/models/utils.test.js @@ -65,11 +65,7 @@ describe('utils', () => { { ...V3_SOURCE, geoColumn: 'quadbin:geom', spatialDataType: 'geo' }, true ], - [ - 'v3/quadbin/with dataResolution', - { ...V3_SOURCE, geoColumn: 'quadbin:abc', spatialFiltersResolution: 5 }, - true - ] + ['v3/quadbin/with dataResolution', { ...V3_SOURCE, geoColumn: 'quadbin:abc' }, true] ])('works correctly for %s', (_, source, expected) => { expect(isRemoteCalculationSupported({ source })).toEqual(expected); }); diff --git a/packages/react-widgets/src/hooks/useWidgetFetch.js b/packages/react-widgets/src/hooks/useWidgetFetch.js index 81762dc46..899054bb8 100644 --- a/packages/react-widgets/src/hooks/useWidgetFetch.js +++ b/packages/react-widgets/src/hooks/useWidgetFetch.js @@ -16,7 +16,6 @@ import { DEFAULT_INVALID_COLUMN_ERR } from '../widgets/utils/constants'; import useCustomCompareEffect from './useCustomCompareEffect'; import useWidgetSource from './useWidgetSource'; import { isRemoteCalculationSupported } from '../models/utils'; -import { getSpatialFiltersResolution } from '../models/spatialFiltersResolution'; export const WidgetStateType = { Loading: 'loading', @@ -86,7 +85,6 @@ export default function useWidgetFetch( ); const viewport = useSelector(selectViewport); - const viewState = useSelector((state) => state.carto.viewState); const spatialFilter = useSelector((state) => selectValidSpatialFilter(state, dataSource) ); @@ -95,31 +93,6 @@ export default function useWidgetFetch( [global, viewport, spatialFilter] ); - const enrichedSource = useMemo(() => { - if ( - !source || - !geometryToIntersect || - source.spatialDataType === 'geo' || - source.spatialFiltersResolution !== undefined || - !source.dataResolution - ) { - return source; - } - - if (source.spatialDataType === 'h3' || source.spatialDataType === 'quadbin') { - const spatialFiltersResolution = getSpatialFiltersResolution({ - source, - viewState, - spatialDataType: source.spatialDataType - }); - return { - ...source, - spatialFiltersResolution - }; - } - return source; - }, [geometryToIntersect, source, viewState.zoom, viewState.latitude]); - useCustomCompareEffect( () => { let outdated = false; @@ -133,7 +106,7 @@ export default function useWidgetFetch( onStateChange?.({ state: WidgetStateType.Loading }); modelFn({ - source: enrichedSource, + source, ...params, global, remoteCalculation, @@ -168,7 +141,6 @@ export default function useWidgetFetch( }, [ params, - enrichedSource, onError, isSourceReady, global, diff --git a/packages/react-widgets/src/index.d.ts b/packages/react-widgets/src/index.d.ts index 4bc0c4dd3..0c92d93e8 100644 --- a/packages/react-widgets/src/index.d.ts +++ b/packages/react-widgets/src/index.d.ts @@ -33,6 +33,5 @@ export { WidgetState, WidgetStateType } from './types'; export { isRemoteCalculationSupported as _isRemoteCalculationSupported, sourceAndFiltersToSQL as _sourceAndFiltersToSQL, - getSqlEscapedSource as _getSqlEscapedSource, - getSpatialFiltersResolution as _getSpatialFiltersResolution + getSqlEscapedSource as _getSqlEscapedSource } from './models/utils'; diff --git a/packages/react-widgets/src/index.js b/packages/react-widgets/src/index.js index 8e89f30d8..bf79ddc23 100644 --- a/packages/react-widgets/src/index.js +++ b/packages/react-widgets/src/index.js @@ -31,4 +31,3 @@ export { sourceAndFiltersToSQL as _sourceAndFiltersToSQL, getSqlEscapedSource as _getSqlEscapedSource } from './models/utils'; -export { getSpatialFiltersResolution as _getSpatialFiltersResolution } from './models/spatialFiltersResolution'; diff --git a/packages/react-widgets/src/models/spatialFiltersResolution.js b/packages/react-widgets/src/models/spatialFiltersResolution.js deleted file mode 100644 index 660591221..000000000 --- a/packages/react-widgets/src/models/spatialFiltersResolution.js +++ /dev/null @@ -1,87 +0,0 @@ -// stolen from deck.gl/modules/carto/src/layers/h3-tileset-2d.ts -const BIAS = 2; -function getHexagonResolution(viewport, tileSize) { - // Difference in given tile size compared to deck's internal 512px tile size, - // expressed as an offset to the viewport zoom. - const zoomOffset = Math.log2(tileSize / 512); - const hexagonScaleFactor = (2 / 3) * (viewport.zoom - zoomOffset); - const latitudeScaleFactor = Math.log(1 / Math.cos((Math.PI * viewport.latitude) / 180)); - - // Clip and bias - return Math.max(0, Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)); -} - -const maxH3SpatialFiltersResolutions = [ - [20, 14], - [19, 13], - [18, 12], - [17, 11], - [16, 10], - [15, 9], - [14, 8], - [13, 7], - [12, 7], - [11, 7], - [10, 6], - [9, 6], - [8, 5], - [7, 4], - [6, 4], - [5, 3], - [4, 2], - [3, 1], - [2, 1], - [1, 0] -]; - -const quadBinZoomMaxOffset = 4; - -const DEFAULT_TILE_SIZE = 512; -const DEFAULT_AGGREGATION_RES_LEVEL_H3 = 4; -const DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN = 6; - -export function getSpatialFiltersResolution({ source, spatialDataType, viewState }) { - if (spatialDataType === 'geo') return undefined; - - const currentZoom = viewState.zoom ?? 1; - - const dataResolution = source.dataResolution ?? Number.MAX_VALUE; - - const aggregationResLevel = - source.aggregationResLevel ?? - (spatialDataType === 'h3' - ? DEFAULT_AGGREGATION_RES_LEVEL_H3 - : DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN); - - const aggregationResLevelOffset = Math.max(0, Math.floor(aggregationResLevel)); - - const currentZoomInt = Math.ceil(currentZoom); - if (spatialDataType === 'h3') { - const tileSize = DEFAULT_TILE_SIZE; - const maxResolutionForZoom = - maxH3SpatialFiltersResolutions.find(([zoom]) => zoom === currentZoomInt)?.[1] ?? - Math.max(0, currentZoomInt - 3); - - const maxSpatialFiltersResolution = maxResolutionForZoom - ? Math.min(dataResolution, maxResolutionForZoom) - : dataResolution; - - const hexagonResolution = - getHexagonResolution( - { zoom: currentZoom, latitude: viewState.latitude }, - tileSize - ) + aggregationResLevelOffset; - - return Math.min(hexagonResolution, maxSpatialFiltersResolution); - } - - if (spatialDataType === 'quadbin') { - const maxResolutionForZoom = currentZoomInt + quadBinZoomMaxOffset; - const maxSpatialFiltersResolution = Math.min(dataResolution, maxResolutionForZoom); - - const quadsResolution = Math.floor(viewState.zoom) + aggregationResLevelOffset; - return Math.min(quadsResolution, maxSpatialFiltersResolution); - } - - return undefined; -} diff --git a/packages/react-widgets/src/models/utils.d.ts b/packages/react-widgets/src/models/utils.d.ts index ca3be1459..e0b6ad692 100644 --- a/packages/react-widgets/src/models/utils.d.ts +++ b/packages/react-widgets/src/models/utils.d.ts @@ -13,9 +13,3 @@ export function sourceAndFiltersToSQL(props: { }): string; export function getSqlEscapedSource(table: string, provider: Provider): string; - -export function getSpatialFiltersResolution(props: { - source: SourceProps; - spatialDataType: string; - viewState: ViewState; -}): number; diff --git a/packages/react-widgets/src/models/utils.js b/packages/react-widgets/src/models/utils.js index a0b12b421..e7d05d38a 100644 --- a/packages/react-widgets/src/models/utils.js +++ b/packages/react-widgets/src/models/utils.js @@ -1,13 +1,7 @@ -import { - AggregationTypes, - _filtersToSQL, - Provider -} from '@carto/react-core'; +import { AggregationTypes, _filtersToSQL, Provider } from '@carto/react-core'; import { FullyQualifiedName } from './fqn'; import { MAP_TYPES, API_VERSIONS } from '@carto/react-api'; -export { getSpatialFiltersResolution } from './spatialFiltersResolution'; - export function isRemoteCalculationSupported(props) { const { source } = props; From 6d83b4c245b47513cf40072b82b02b7ee047f872 Mon Sep 17 00:00:00 2001 From: Don McCurdy Date: Fri, 14 Mar 2025 11:03:28 -0400 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19dc5cec6..6f29e78f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Not released - GeocoderWidget: Fix detection of lat,lng coordinates with whitespace +- Remove 'spatialFiltersResolution' parameter from widgets [#930](https://github.com/CartoDB/carto-react/pull/930) ## 3.1.0 From 5b8a87a36d1268b3329c9d61c33bf5e960d01d16 Mon Sep 17 00:00:00 2001 From: Don McCurdy Date: Mon, 17 Mar 2025 15:13:13 -0400 Subject: [PATCH 3/4] clean up dataResolution references --- packages/react-api/src/types.d.ts | 1 - packages/react-redux/src/slices/cartoSlice.js | 3 --- .../react-widgets/__tests__/models/utils.test.js | 15 +++++---------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/packages/react-api/src/types.d.ts b/packages/react-api/src/types.d.ts index 4fc0b3e13..358022e32 100644 --- a/packages/react-api/src/types.d.ts +++ b/packages/react-api/src/types.d.ts @@ -43,7 +43,6 @@ export type SourceProps = { type: MapTypesType['QUERY'] | MapTypesType['TABLE'] | MapTypesType['TILESET']; connection: string; geoColumn?: string; - dataResolution?: number; spatialDataType?: string; spatialDataColumn?: string; aggregationExp?: string; diff --git a/packages/react-redux/src/slices/cartoSlice.js b/packages/react-redux/src/slices/cartoSlice.js index f28dd360a..a44aa625d 100644 --- a/packages/react-redux/src/slices/cartoSlice.js +++ b/packages/react-redux/src/slices/cartoSlice.js @@ -204,7 +204,6 @@ export const createCartoSlice = (initialState) => { * @param {FiltersLogicalOperators=} data.filtersLogicalOperator - logical operator that defines how filters for different columns are joined together. * @param {import('@deck.gl/carto').QueryParameters} data.queryParameters - SQL query parameters. * @param {string=} data.geoColumn - (optional) name of column containing geometries or spatial index data. - * @param {number=} data.dataResolution - data resolution for spatial index data. * @param {string=} data.aggregationExp - (optional) for spatial index data. * @param {number=} data.aggregationResLevel - (optional) for spatial index data. * @param {string=} data.provider - (optional) type of the data warehouse. @@ -221,7 +220,6 @@ export const addSource = ({ geoColumn, spatialDataType, spatialDataColumn, - dataResolution, aggregationExp, aggregationResLevel, provider @@ -237,7 +235,6 @@ export const addSource = ({ filtersLogicalOperator, queryParameters, geoColumn, - dataResolution, aggregationResLevel, spatialDataType, spatialDataColumn, diff --git a/packages/react-widgets/__tests__/models/utils.test.js b/packages/react-widgets/__tests__/models/utils.test.js index 777a38a0f..4b0730d9c 100644 --- a/packages/react-widgets/__tests__/models/utils.test.js +++ b/packages/react-widgets/__tests__/models/utils.test.js @@ -49,23 +49,18 @@ describe('utils', () => { ['v3', { ...V3_SOURCE, type: 'tileset' }, false], ['v3/databricks', { ...V3_SOURCE, provider: 'databricks' }, false], ['v3/databricksRest', { ...V3_SOURCE, provider: 'databricksRest' }, true], - + ['v3/h3', { ...V3_SOURCE, geoColumn: 'h3' }, true], [ - 'v3/h3/with dataResolution', - { ...V3_SOURCE, geoColumn: 'h3', dataResolution: 5 }, - true - ], - [ - 'v3/h3-frompoint/without dataResolution', + 'v3/h3-frompoint', { ...V3_SOURCE, geoColumn: 'h3:geom', spatialDataType: 'geo' }, true ], + ['v3/quadbin', { ...V3_SOURCE, geoColumn: 'quadbin:abc' }, true], [ - 'v3/quadbin-frompoint/without dataResolution', + 'v3/quadbin-frompoint', { ...V3_SOURCE, geoColumn: 'quadbin:geom', spatialDataType: 'geo' }, true - ], - ['v3/quadbin/with dataResolution', { ...V3_SOURCE, geoColumn: 'quadbin:abc' }, true] + ] ])('works correctly for %s', (_, source, expected) => { expect(isRemoteCalculationSupported({ source })).toEqual(expected); }); From 1c88d3958a964ad037d4bbd5b6217854ecadc7cd Mon Sep 17 00:00:00 2001 From: Don McCurdy Date: Mon, 17 Mar 2025 16:18:51 -0400 Subject: [PATCH 4/4] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f29e78f2..c5afcea6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Not released - GeocoderWidget: Fix detection of lat,lng coordinates with whitespace -- Remove 'spatialFiltersResolution' parameter from widgets [#930](https://github.com/CartoDB/carto-react/pull/930) +- Remove 'spatialFiltersResolution' and 'dataResolution' parameters from widgets [#930](https://github.com/CartoDB/carto-react/pull/930) ## 3.1.0