@carto/api-client 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/api/query.d.ts +1 -1
  3. package/build/api-client.cjs +1136 -984
  4. package/build/api-client.cjs.map +1 -1
  5. package/build/api-client.modern.js +1014 -869
  6. package/build/api-client.modern.js.map +1 -1
  7. package/build/index.d.ts +1 -1
  8. package/build/models/model.d.ts +7 -1
  9. package/build/sources/boundary-query-source.d.ts +2 -1
  10. package/build/sources/boundary-table-source.d.ts +2 -1
  11. package/build/sources/h3-query-source.d.ts +2 -1
  12. package/build/sources/h3-table-source.d.ts +2 -1
  13. package/build/sources/h3-tileset-source.d.ts +2 -1
  14. package/build/sources/index.d.ts +13 -14
  15. package/build/sources/quadbin-query-source.d.ts +2 -1
  16. package/build/sources/quadbin-table-source.d.ts +2 -1
  17. package/build/sources/quadbin-tileset-source.d.ts +2 -1
  18. package/build/sources/raster-source.d.ts +2 -1
  19. package/build/sources/types.d.ts +48 -37
  20. package/build/sources/vector-query-source.d.ts +2 -1
  21. package/build/sources/vector-table-source.d.ts +2 -1
  22. package/build/sources/vector-tileset-source.d.ts +2 -1
  23. package/build/spatial-index.d.ts +8 -0
  24. package/build/utils.d.ts +1 -1
  25. package/build/widget-sources/types.d.ts +9 -1
  26. package/build/widget-sources/widget-base-source.d.ts +3 -3
  27. package/package.json +1 -1
  28. package/src/api/query.ts +1 -2
  29. package/src/index.ts +1 -36
  30. package/src/models/model.ts +47 -24
  31. package/src/sources/boundary-query-source.ts +4 -2
  32. package/src/sources/boundary-table-source.ts +4 -2
  33. package/src/sources/h3-query-source.ts +10 -2
  34. package/src/sources/h3-table-source.ts +9 -2
  35. package/src/sources/h3-tileset-source.ts +4 -2
  36. package/src/sources/index.ts +54 -24
  37. package/src/sources/quadbin-query-source.ts +10 -2
  38. package/src/sources/quadbin-table-source.ts +10 -2
  39. package/src/sources/quadbin-tileset-source.ts +4 -2
  40. package/src/sources/raster-source.ts +4 -2
  41. package/src/sources/types.ts +54 -40
  42. package/src/sources/vector-query-source.ts +13 -2
  43. package/src/sources/vector-table-source.ts +14 -2
  44. package/src/sources/vector-tileset-source.ts +4 -2
  45. package/src/spatial-index.ts +111 -0
  46. package/src/utils.ts +1 -1
  47. package/src/widget-sources/types.ts +10 -1
  48. package/src/widget-sources/widget-base-source.ts +183 -23
package/build/index.d.ts CHANGED
@@ -2,9 +2,9 @@ export * from './client.js';
2
2
  export * from './constants.js';
3
3
  export * from './filters.js';
4
4
  export * from './geo.js';
5
+ export * from './sources/index.js';
5
6
  export * from './widget-sources/index.js';
6
7
  export * from './types.js';
7
8
  export { APIErrorContext, APIRequestType, CartoAPIError, QueryOptions, buildPublicMapUrl, // Internal, but required for fetchMap().
8
9
  buildStatsUrl, // Internal, but required for fetchMap().
9
10
  query, requestWithParameters, } from './api/index.js';
10
- export { BoundaryQuerySourceOptions, BoundaryTableSourceOptions, GeojsonResult, H3QuerySourceOptions, H3TableSourceOptions, H3TilesetSourceOptions, JsonResult, QuadbinQuerySourceOptions, QuadbinTableSourceOptions, QuadbinTilesetSourceOptions, QueryResult, QuerySourceOptions, RasterSourceOptions, SOURCE_DEFAULTS, SourceOptions, TableSourceOptions, TilejsonResult, TilesetSourceOptions, VectorQuerySourceOptions, VectorTableSourceOptions, VectorTilesetSourceOptions, boundaryQuerySource, boundaryTableSource, h3QuerySource, h3TableSource, h3TilesetSource, quadbinQuerySource, quadbinTableSource, quadbinTilesetSource, rasterSource, vectorQuerySource, vectorTableSource, vectorTilesetSource, } from './sources/index.js';
@@ -1,6 +1,7 @@
1
1
  import { Filter, FilterLogicalOperator, MapType, QueryParameters, SpatialFilter } from '../types.js';
2
2
  import { ModelRequestOptions } from './common.js';
3
3
  import { ApiVersion } from '../constants.js';
4
+ import { SpatialDataType, SpatialFilterPolyfillMode } from '../sources/types.js';
4
5
  /** @internalRemarks Source: @carto/react-api */
5
6
  declare const AVAILABLE_MODELS: readonly ["category", "histogram", "formula", "pick", "timeseries", "range", "scatterplot", "table"];
6
7
  export type Model = (typeof AVAILABLE_MODELS)[number];
@@ -14,9 +15,14 @@ export interface ModelSource {
14
15
  data: string;
15
16
  filters?: Record<string, Filter>;
16
17
  filtersLogicalOperator?: FilterLogicalOperator;
17
- geoColumn?: string;
18
18
  spatialFilter?: SpatialFilter;
19
19
  queryParameters?: QueryParameters;
20
+ spatialDataColumn?: string;
21
+ spatialDataType?: SpatialDataType;
22
+ spatialFiltersResolution?: number;
23
+ spatialFiltersMode?: SpatialFilterPolyfillMode;
24
+ /** original resolution of the spatial index data as stored in the DW */
25
+ dataResolution?: number;
20
26
  }
21
27
  /**
22
28
  * Execute a SQL model request.
@@ -6,4 +6,5 @@ export type BoundaryQuerySourceOptions = SourceOptions & FilterOptions & {
6
6
  propertiesSqlQuery: string;
7
7
  queryParameters?: QueryParameters;
8
8
  };
9
- export declare const boundaryQuerySource: (options: BoundaryQuerySourceOptions) => Promise<TilejsonResult>;
9
+ export type BoundaryQuerySourceResponse = TilejsonResult;
10
+ export declare const boundaryQuerySource: (options: BoundaryQuerySourceOptions) => Promise<BoundaryQuerySourceResponse>;
@@ -4,4 +4,5 @@ export type BoundaryTableSourceOptions = SourceOptions & FilterOptions & {
4
4
  columns?: string[];
5
5
  propertiesTableName: string;
6
6
  };
7
- export declare const boundaryTableSource: (options: BoundaryTableSourceOptions) => Promise<TilejsonResult>;
7
+ export type BoundaryTableSourceResponse = TilejsonResult;
8
+ export declare const boundaryTableSource: (options: BoundaryTableSourceOptions) => Promise<BoundaryTableSourceResponse>;
@@ -1,4 +1,5 @@
1
1
  import { WidgetQuerySourceResult } from '../widget-sources';
2
2
  import type { AggregationOptions, FilterOptions, QuerySourceOptions, SourceOptions, TilejsonResult } from './types';
3
3
  export type H3QuerySourceOptions = SourceOptions & QuerySourceOptions & AggregationOptions & FilterOptions;
4
- export declare const h3QuerySource: (options: H3QuerySourceOptions) => Promise<TilejsonResult & WidgetQuerySourceResult>;
4
+ export type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;
5
+ export declare const h3QuerySource: (options: H3QuerySourceOptions) => Promise<H3QuerySourceResponse>;
@@ -1,4 +1,5 @@
1
1
  import { WidgetTableSourceResult } from '../widget-sources';
2
2
  import type { AggregationOptions, FilterOptions, SourceOptions, TableSourceOptions, TilejsonResult } from './types';
3
3
  export type H3TableSourceOptions = SourceOptions & TableSourceOptions & AggregationOptions & FilterOptions;
4
- export declare const h3TableSource: (options: H3TableSourceOptions) => Promise<TilejsonResult & WidgetTableSourceResult>;
4
+ export type H3TableSourceResponse = TilejsonResult & WidgetTableSourceResult;
5
+ export declare const h3TableSource: (options: H3TableSourceOptions) => Promise<H3TableSourceResponse>;
@@ -1,3 +1,4 @@
1
1
  import type { SourceOptions, TilejsonResult, TilesetSourceOptions } from './types';
2
2
  export type H3TilesetSourceOptions = SourceOptions & TilesetSourceOptions;
3
- export declare const h3TilesetSource: (options: H3TilesetSourceOptions) => Promise<TilejsonResult>;
3
+ export type H3TilesetSourceResponse = TilejsonResult;
4
+ export declare const h3TilesetSource: (options: H3TilesetSourceOptions) => Promise<H3TilesetSourceResponse>;
@@ -1,27 +1,26 @@
1
1
  export { SOURCE_DEFAULTS } from './base-source';
2
- export type { VectorLayer, RasterMetadataBandStats, RasterBandColorinterp, RasterMetadataBand, RasterMetadata, TilejsonResult, GeojsonResult, JsonResult, QueryResult, } from './types';
2
+ export type { GeojsonResult, JsonResult, QueryResult, QuerySourceOptions, RasterBandColorinterp, RasterMetadata, RasterMetadataBand, RasterMetadataBandStats, SourceOptions, TableSourceOptions, TilejsonResult, TilesetSourceOptions, VectorLayer, } from './types';
3
3
  export { boundaryQuerySource } from './boundary-query-source';
4
- export type { BoundaryQuerySourceOptions } from './boundary-query-source';
4
+ export type { BoundaryQuerySourceOptions, BoundaryQuerySourceResponse, } from './boundary-query-source';
5
5
  export { boundaryTableSource } from './boundary-table-source';
6
- export type { BoundaryTableSourceOptions } from './boundary-table-source';
6
+ export type { BoundaryTableSourceOptions, BoundaryTableSourceResponse, } from './boundary-table-source';
7
7
  export { h3QuerySource } from './h3-query-source';
8
- export type { H3QuerySourceOptions } from './h3-query-source';
8
+ export type { H3QuerySourceOptions, H3QuerySourceResponse, } from './h3-query-source';
9
9
  export { h3TableSource } from './h3-table-source';
10
- export type { H3TableSourceOptions } from './h3-table-source';
10
+ export type { H3TableSourceOptions, H3TableSourceResponse, } from './h3-table-source';
11
11
  export { h3TilesetSource } from './h3-tileset-source';
12
- export type { H3TilesetSourceOptions } from './h3-tileset-source';
12
+ export type { H3TilesetSourceOptions, H3TilesetSourceResponse, } from './h3-tileset-source';
13
13
  export { rasterSource } from './raster-source';
14
- export type { RasterSourceOptions } from './raster-source';
14
+ export type { RasterSourceOptions, RasterSourceResponse } from './raster-source';
15
15
  export { quadbinQuerySource } from './quadbin-query-source';
16
- export type { QuadbinQuerySourceOptions } from './quadbin-query-source';
16
+ export type { QuadbinQuerySourceOptions, QuadbinQuerySourceResponse, } from './quadbin-query-source';
17
17
  export { quadbinTableSource } from './quadbin-table-source';
18
- export type { QuadbinTableSourceOptions } from './quadbin-table-source';
18
+ export type { QuadbinTableSourceOptions, QuadbinTableSourceResponse, } from './quadbin-table-source';
19
19
  export { quadbinTilesetSource } from './quadbin-tileset-source';
20
- export type { QuadbinTilesetSourceOptions } from './quadbin-tileset-source';
20
+ export type { QuadbinTilesetSourceOptions, QuadbinTilesetSourceResponse, } from './quadbin-tileset-source';
21
21
  export { vectorQuerySource } from './vector-query-source';
22
- export type { VectorQuerySourceOptions } from './vector-query-source';
22
+ export type { VectorQuerySourceOptions, VectorQuerySourceResponse, } from './vector-query-source';
23
23
  export { vectorTableSource } from './vector-table-source';
24
- export type { VectorTableSourceOptions } from './vector-table-source';
24
+ export type { VectorTableSourceOptions, VectorTableSourceResponse, } from './vector-table-source';
25
25
  export { vectorTilesetSource } from './vector-tileset-source';
26
- export type { VectorTilesetSourceOptions } from './vector-tileset-source';
27
- export type { SourceOptions, QuerySourceOptions, TableSourceOptions, TilesetSourceOptions, } from './types';
26
+ export type { VectorTilesetSourceOptions, VectorTilesetSourceResponse, } from './vector-tileset-source';
@@ -1,4 +1,5 @@
1
1
  import { WidgetQuerySourceResult } from '../widget-sources';
2
2
  import type { AggregationOptions, FilterOptions, QuerySourceOptions, SourceOptions, TilejsonResult } from './types';
3
3
  export type QuadbinQuerySourceOptions = SourceOptions & QuerySourceOptions & AggregationOptions & FilterOptions;
4
- export declare const quadbinQuerySource: (options: QuadbinQuerySourceOptions) => Promise<TilejsonResult & WidgetQuerySourceResult>;
4
+ export type QuadbinQuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;
5
+ export declare const quadbinQuerySource: (options: QuadbinQuerySourceOptions) => Promise<QuadbinQuerySourceResponse>;
@@ -1,4 +1,5 @@
1
1
  import { WidgetTableSourceResult } from '../widget-sources';
2
2
  import type { AggregationOptions, FilterOptions, SourceOptions, TableSourceOptions, TilejsonResult } from './types';
3
3
  export type QuadbinTableSourceOptions = SourceOptions & TableSourceOptions & AggregationOptions & FilterOptions;
4
- export declare const quadbinTableSource: (options: QuadbinTableSourceOptions) => Promise<TilejsonResult & WidgetTableSourceResult>;
4
+ export type QuadbinTableSourceResponse = TilejsonResult & WidgetTableSourceResult;
5
+ export declare const quadbinTableSource: (options: QuadbinTableSourceOptions) => Promise<QuadbinTableSourceResponse>;
@@ -1,3 +1,4 @@
1
1
  import type { SourceOptions, TilejsonResult, TilesetSourceOptions } from './types';
2
2
  export type QuadbinTilesetSourceOptions = SourceOptions & TilesetSourceOptions;
3
- export declare const quadbinTilesetSource: (options: QuadbinTilesetSourceOptions) => Promise<TilejsonResult>;
3
+ export type QuadbinTilesetSourceResponse = TilejsonResult;
4
+ export declare const quadbinTilesetSource: (options: QuadbinTilesetSourceOptions) => Promise<QuadbinTilesetSourceResponse>;
@@ -1,3 +1,4 @@
1
1
  import type { FilterOptions, SourceOptions, TilejsonResult, TilesetSourceOptions } from './types';
2
2
  export type RasterSourceOptions = SourceOptions & TilesetSourceOptions & FilterOptions;
3
- export declare const rasterSource: (options: RasterSourceOptions) => Promise<TilejsonResult>;
3
+ export type RasterSourceResponse = TilejsonResult;
4
+ export declare const rasterSource: (options: RasterSourceOptions) => Promise<RasterSourceResponse>;
@@ -38,6 +38,30 @@ export type SourceOptionalOptions = {
38
38
  * @default {@link DEFAULT_MAX_LENGTH_URL}
39
39
  */
40
40
  maxLengthURL?: number;
41
+ /**
42
+ * The column name and the type of geospatial support.
43
+ *
44
+ * If not present, defaults to `'geom'` for generic queries, `'quadbin'` for Quadbin sources and `'h3'` for H3 sources.
45
+ */
46
+ spatialDataColumn?: string;
47
+ /**
48
+ * The type of geospatial support. Defaults to `'geo'`.
49
+ */
50
+ spatialDataType?: SpatialDataType;
51
+ /**
52
+ * Relative resolution of a tile. Higher values increase density and data size. At `tileResolution = 1`, tile geometry is
53
+ * quantized to a 1024x1024 grid. Increasing or decreasing the resolution will increase or decrease the dimensions of
54
+ * the quantization grid proportionately.
55
+ *
56
+ * Supported `tileResolution` values, with corresponding grid sizes:
57
+ *
58
+ * - 0.25: 256x256
59
+ * - 0.5: 512x512
60
+ * - 1: 1024x1024
61
+ * - 2: 2048x2048
62
+ * - 4: 4096x4096
63
+ */
64
+ tileResolution?: TileResolution;
41
65
  /**
42
66
  * By default, local in-memory caching is enabled.
43
67
  */
@@ -73,6 +97,10 @@ export type AggregationOptions = {
73
97
  * @default 6 for quadbin and 4 for h3 sources
74
98
  */
75
99
  aggregationResLevel?: number;
100
+ /**
101
+ * Original resolution of the spatial index data as stored in the DW
102
+ */
103
+ dataResolution?: number;
76
104
  };
77
105
  export type FilterOptions = {
78
106
  /**
@@ -81,28 +109,8 @@ export type FilterOptions = {
81
109
  filters?: Filters;
82
110
  };
83
111
  export type QuerySourceOptions = {
84
- /**
85
- * The column name and the type of geospatial support.
86
- *
87
- * If not present, defaults to `'geom'` for generic queries, `'quadbin'` for Quadbin sources and `'h3'` for H3 sources.
88
- */
89
- spatialDataColumn?: string;
90
- /** SQL query. */
112
+ /** Full SQL query with query paremeter placeholders (if any). */
91
113
  sqlQuery: string;
92
- /**
93
- * Relative resolution of a tile. Higher values increase density and data size. At `tileResolution = 1`, tile geometry is
94
- * quantized to a 1024x1024 grid. Increasing or decreasing the resolution will increase or decrease the dimensions of
95
- * the quantization grid proportionately.
96
- *
97
- * Supported `tileResolution` values, with corresponding grid sizes:
98
- *
99
- * - 0.25: 256x256
100
- * - 0.5: 512x512
101
- * - 1: 1024x1024
102
- * - 2: 2048x2048
103
- * - 4: 4096x4096
104
- */
105
- tileResolution?: TileResolution;
106
114
  /**
107
115
  * Values for named or positional paramteres in the query.
108
116
  *
@@ -128,6 +136,14 @@ export type QuerySourceOptions = {
128
136
  * ```
129
137
  */
130
138
  queryParameters?: QueryParameters;
139
+ /**
140
+ * Comma-separated aggregation expressions. If assigned on a vector source, source is grouped by geometry and then aggregated.
141
+ *
142
+ * Example:
143
+ *
144
+ * 1 as value, avg(rev) as average_revenue
145
+ */
146
+ aggregationExp?: string;
131
147
  };
132
148
  export type TableSourceOptions = {
133
149
  /**
@@ -135,25 +151,13 @@ export type TableSourceOptions = {
135
151
  */
136
152
  tableName: string;
137
153
  /**
138
- * The column name and the type of geospatial support.
139
- *
140
- * If not present, defaults to `'geom'` for generic tables, `'quadbin'` for Quadbin sources and `'h3'` for H3 sources.
141
- */
142
- spatialDataColumn?: string;
143
- /**
144
- * Relative resolution of a tile. Higher values increase density and data size. At `tileResolution = 1`, tile geometry is
145
- * quantized to a 1024x1024 grid. Increasing or decreasing the resolution will increase or decrease the dimensions of
146
- * the quantization grid proportionately.
154
+ * Comma-separated aggregation expressions. If assigned on a vector source, source is grouped by geometry and then aggregated.
147
155
  *
148
- * Supported `tileResolution` values, with corresponding grid sizes:
156
+ * Example:
149
157
  *
150
- * - 0.25: 256x256
151
- * - 0.5: 512x512
152
- * - 1: 1024x1024
153
- * - 2: 2048x2048
154
- * - 4: 4096x4096
158
+ * 1 as value, avg(rev) as average_revenue
155
159
  */
156
- tileResolution?: TileResolution;
160
+ aggregationExp?: string;
157
161
  };
158
162
  export type TilesetSourceOptions = {
159
163
  /**
@@ -170,6 +174,13 @@ export type ColumnsOption = {
170
174
  columns?: string[];
171
175
  };
172
176
  export type SpatialDataType = 'geo' | 'h3' | 'quadbin';
177
+ /**
178
+ * Strategy used for covering spatial filter geometry with spatial indexes.
179
+ * See https://docs.carto.com/data-and-analysis/analytics-toolbox-for-bigquery/sql-reference/quadbin#quadbin_polyfill_mode
180
+ * or https://docs.carto.com/data-and-analysis/analytics-toolbox-for-bigquery/sql-reference/h3#h3_polyfill_mode for more information.
181
+ * @internalRemarks Source: cloud-native maps-api
182
+ * */
183
+ export type SpatialFilterPolyfillMode = 'center' | 'intersects' | 'contains';
173
184
  export type TilejsonMapInstantiation = MapInstantiation & {
174
185
  tilejson: {
175
186
  url: string[];
@@ -1,4 +1,5 @@
1
1
  import { WidgetQuerySourceResult } from '../widget-sources/index.js';
2
2
  import type { FilterOptions, SourceOptions, QuerySourceOptions, TilejsonResult, ColumnsOption } from './types';
3
3
  export type VectorQuerySourceOptions = SourceOptions & QuerySourceOptions & FilterOptions & ColumnsOption;
4
- export declare const vectorQuerySource: (options: VectorQuerySourceOptions) => Promise<TilejsonResult & WidgetQuerySourceResult>;
4
+ export type VectorQuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;
5
+ export declare const vectorQuerySource: (options: VectorQuerySourceOptions) => Promise<VectorQuerySourceResponse>;
@@ -1,4 +1,5 @@
1
1
  import { WidgetTableSourceResult } from '../widget-sources/index.js';
2
2
  import type { FilterOptions, ColumnsOption, SourceOptions, TableSourceOptions, TilejsonResult } from './types';
3
3
  export type VectorTableSourceOptions = SourceOptions & TableSourceOptions & FilterOptions & ColumnsOption;
4
- export declare const vectorTableSource: (options: VectorTableSourceOptions) => Promise<TilejsonResult & WidgetTableSourceResult>;
4
+ export type VectorTableSourceResponse = TilejsonResult & WidgetTableSourceResult;
5
+ export declare const vectorTableSource: (options: VectorTableSourceOptions) => Promise<VectorTableSourceResponse>;
@@ -1,3 +1,4 @@
1
1
  import type { SourceOptions, TilesetSourceOptions, TilejsonResult } from './types';
2
2
  export type VectorTilesetSourceOptions = SourceOptions & TilesetSourceOptions;
3
- export declare const vectorTilesetSource: (options: VectorTilesetSourceOptions) => Promise<TilejsonResult>;
3
+ export type VectorTilesetSourceResponse = TilejsonResult;
4
+ export declare const vectorTilesetSource: (options: VectorTilesetSourceOptions) => Promise<VectorTilesetSourceResponse>;
@@ -0,0 +1,8 @@
1
+ import type { ModelSource } from './models/model';
2
+ import type { AggregationOptions } from './sources/types';
3
+ import type { ViewState } from './widget-sources';
4
+ export declare function getSpatialFiltersResolution(source: Partial<ModelSource & AggregationOptions>, viewState: ViewState): number | undefined;
5
+ export declare function getHexagonResolution(viewport: {
6
+ zoom: number;
7
+ latitude: number;
8
+ }, tileSize: number): number;
package/build/utils.d.ts CHANGED
@@ -14,7 +14,7 @@ type Row<T> = Record<string, T> | Record<string, T>[] | T[] | T;
14
14
  */
15
15
  export declare function normalizeObjectKeys<T, R extends Row<T>>(el: R): R;
16
16
  /** @internalRemarks Source: @carto/react-core */
17
- export declare function assert(condition: unknown, message: string): void;
17
+ export declare function assert(condition: unknown, message: string): asserts condition;
18
18
  /**
19
19
  * @internalRemarks Source: @carto/react-core
20
20
  * @internal
@@ -1,11 +1,19 @@
1
- import { TileResolution } from '../sources/types';
1
+ import { SpatialFilterPolyfillMode, TileResolution } from '../sources/types';
2
2
  import { GroupDateType, SortColumnType, SortDirection, SpatialFilter } from '../types';
3
3
  /******************************************************************************
4
4
  * WIDGET API REQUESTS
5
5
  */
6
+ export interface ViewState {
7
+ zoom: number;
8
+ latitude: number;
9
+ longitude: number;
10
+ }
6
11
  /** Common options for {@link WidgetBaseSource} requests. */
7
12
  interface BaseRequestOptions {
8
13
  spatialFilter?: SpatialFilter;
14
+ spatialFiltersMode?: SpatialFilterPolyfillMode;
15
+ /** Required for table- and query-based spatial index sources (H3, Quadbin). */
16
+ spatialIndexReferenceViewState?: ViewState;
9
17
  abortController?: AbortController;
10
18
  filterOwner?: string;
11
19
  }
@@ -1,11 +1,10 @@
1
- import { CategoryRequestOptions, CategoryResponse, FeaturesRequestOptions, FeaturesResponse, FormulaRequestOptions, FormulaResponse, HistogramRequestOptions, HistogramResponse, RangeRequestOptions, RangeResponse, ScatterRequestOptions, ScatterResponse, TableRequestOptions, TableResponse, TimeSeriesRequestOptions, TimeSeriesResponse } from './types.js';
2
- import { FilterLogicalOperator, Filter } from '../types.js';
1
+ import { CategoryRequestOptions, CategoryResponse, FeaturesRequestOptions, FeaturesResponse, FormulaRequestOptions, FormulaResponse, HistogramRequestOptions, HistogramResponse, RangeRequestOptions, RangeResponse, ScatterRequestOptions, ScatterResponse, TableRequestOptions, TableResponse, TimeSeriesRequestOptions, TimeSeriesResponse, ViewState } from './types.js';
2
+ import { FilterLogicalOperator, Filter, SpatialFilter } from '../types.js';
3
3
  import { ModelSource } from '../models/model.js';
4
4
  import { SourceOptions } from '../sources/index.js';
5
5
  import { ApiVersion } from '../constants.js';
6
6
  export interface WidgetBaseSourceProps extends Omit<SourceOptions, 'filters'> {
7
7
  apiVersion?: ApiVersion;
8
- geoColumn?: string;
9
8
  filters?: Record<string, Filter>;
10
9
  filtersLogicalOperator?: FilterLogicalOperator;
11
10
  }
@@ -27,6 +26,7 @@ export declare abstract class WidgetBaseSource<Props extends WidgetBaseSourcePro
27
26
  */
28
27
  protected abstract getModelSource(owner: string | undefined): ModelSource;
29
28
  protected _getModelSource(owner?: string): Omit<ModelSource, 'type' | 'data'>;
29
+ protected _getSpatialFiltersResolution(source: Omit<ModelSource, 'type' | 'data'>, spatialFilter?: SpatialFilter, referenceViewState?: ViewState): number | undefined;
30
30
  /****************************************************************************
31
31
  * CATEGORIES
32
32
  */
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "repository": "github:CartoDB/carto-api-client",
5
5
  "author": "Don McCurdy <donmccurdy@carto.com>",
6
6
  "packageManager": "yarn@4.3.1",
7
- "version": "0.4.2",
7
+ "version": "0.4.4",
8
8
  "license": "MIT",
9
9
  "publishConfig": {
10
10
  "access": "public",
package/src/api/query.ts CHANGED
@@ -12,8 +12,7 @@ import {buildQueryUrl} from './endpoints';
12
12
  import {requestWithParameters} from './request-with-parameters';
13
13
  import {APIErrorContext} from './carto-api-error';
14
14
 
15
- export type QueryOptions = SourceOptions &
16
- Omit<QuerySourceOptions, 'spatialDataColumn'>;
15
+ export type QueryOptions = SourceOptions & QuerySourceOptions;
17
16
  type UrlParameters = {q: string; queryParameters?: string};
18
17
 
19
18
  export const query = async function (
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './client.js';
2
2
  export * from './constants.js';
3
3
  export * from './filters.js';
4
4
  export * from './geo.js';
5
+ export * from './sources/index.js';
5
6
  export * from './widget-sources/index.js';
6
7
  export * from './types.js';
7
8
 
@@ -15,39 +16,3 @@ export {
15
16
  query,
16
17
  requestWithParameters,
17
18
  } from './api/index.js';
18
-
19
- export {
20
- BoundaryQuerySourceOptions,
21
- BoundaryTableSourceOptions,
22
- GeojsonResult,
23
- H3QuerySourceOptions,
24
- H3TableSourceOptions,
25
- H3TilesetSourceOptions,
26
- JsonResult,
27
- QuadbinQuerySourceOptions,
28
- QuadbinTableSourceOptions,
29
- QuadbinTilesetSourceOptions,
30
- QueryResult,
31
- QuerySourceOptions,
32
- RasterSourceOptions,
33
- SOURCE_DEFAULTS,
34
- SourceOptions,
35
- TableSourceOptions,
36
- TilejsonResult,
37
- TilesetSourceOptions,
38
- VectorQuerySourceOptions,
39
- VectorTableSourceOptions,
40
- VectorTilesetSourceOptions,
41
- boundaryQuerySource,
42
- boundaryTableSource,
43
- h3QuerySource,
44
- h3TableSource,
45
- h3TilesetSource,
46
- quadbinQuerySource,
47
- quadbinTableSource,
48
- quadbinTilesetSource,
49
- rasterSource,
50
- vectorQuerySource,
51
- vectorTableSource,
52
- vectorTilesetSource,
53
- } from './sources/index.js';
@@ -7,9 +7,10 @@ import {
7
7
  SpatialFilter,
8
8
  } from '../types.js';
9
9
  import {$TODO} from '../types-internal.js';
10
- import {assert} from '../utils.js';
10
+ import {assert, isPureObject} from '../utils.js';
11
11
  import {ModelRequestOptions, makeCall} from './common.js';
12
12
  import {ApiVersion} from '../constants.js';
13
+ import {SpatialDataType, SpatialFilterPolyfillMode} from '../sources/types.js';
13
14
 
14
15
  /** @internalRemarks Source: @carto/react-api */
15
16
  const AVAILABLE_MODELS = [
@@ -35,9 +36,14 @@ export interface ModelSource {
35
36
  data: string;
36
37
  filters?: Record<string, Filter>;
37
38
  filtersLogicalOperator?: FilterLogicalOperator;
38
- geoColumn?: string;
39
39
  spatialFilter?: SpatialFilter;
40
40
  queryParameters?: QueryParameters;
41
+ spatialDataColumn?: string;
42
+ spatialDataType?: SpatialDataType;
43
+ spatialFiltersResolution?: number;
44
+ spatialFiltersMode?: SpatialFilterPolyfillMode;
45
+ /** original resolution of the spatial index data as stored in the DW */
46
+ dataResolution?: number;
41
47
  }
42
48
 
43
49
  const {V3} = ApiVersion;
@@ -79,50 +85,51 @@ export function executeModel(props: {
79
85
  data,
80
86
  filters,
81
87
  filtersLogicalOperator = 'and',
82
- geoColumn = DEFAULT_GEO_COLUMN,
88
+ spatialDataType = 'geo',
89
+ spatialFiltersMode = 'intersects',
90
+ spatialFiltersResolution = 0,
83
91
  } = source;
84
92
 
85
- const queryParameters = source.queryParameters
86
- ? JSON.stringify(source.queryParameters)
87
- : '';
88
-
89
- const queryParams: Record<string, string> = {
93
+ const queryParams: Record<string, unknown> = {
90
94
  type,
91
95
  client: clientId,
92
96
  source: data,
93
- params: JSON.stringify(params),
94
- queryParameters,
95
- filters: JSON.stringify(filters),
97
+ params,
98
+ queryParameters: source.queryParameters || '',
99
+ filters,
96
100
  filtersLogicalOperator,
97
101
  };
98
102
 
103
+ const spatialDataColumn = source.spatialDataColumn || DEFAULT_GEO_COLUMN;
104
+
99
105
  // Picking Model API requires 'spatialDataColumn'.
100
106
  if (model === 'pick') {
101
- queryParams.spatialDataColumn = geoColumn;
107
+ queryParams.spatialDataColumn = spatialDataColumn;
102
108
  }
103
109
 
104
- // API supports multiple filters, we apply it only to geoColumn
110
+ // API supports multiple filters, we apply it only to spatialDataColumn
105
111
  const spatialFilters = source.spatialFilter
106
- ? {[geoColumn]: source.spatialFilter}
112
+ ? {[spatialDataColumn]: source.spatialFilter}
107
113
  : undefined;
108
114
 
109
115
  if (spatialFilters) {
110
- queryParams.spatialFilters = JSON.stringify(spatialFilters);
116
+ queryParams.spatialFilters = spatialFilters;
117
+ queryParams.spatialDataColumn = spatialDataColumn;
118
+ queryParams.spatialDataType = spatialDataType;
119
+ }
120
+
121
+ if (spatialDataType !== 'geo') {
122
+ if (spatialFiltersResolution > 0) {
123
+ queryParams.spatialFiltersResolution = spatialFiltersResolution;
124
+ }
125
+ queryParams.spatialFiltersMode = spatialFiltersMode;
111
126
  }
112
127
 
113
128
  const urlWithSearchParams =
114
- url + '?' + new URLSearchParams(queryParams).toString();
129
+ url + '?' + objectToURLSearchParams(queryParams).toString();
115
130
  const isGet = urlWithSearchParams.length <= REQUEST_GET_MAX_URL_LENGTH;
116
131
  if (isGet) {
117
132
  url = urlWithSearchParams;
118
- } else {
119
- // undo the JSON.stringify, @TODO find a better pattern
120
- queryParams.params = params as $TODO;
121
- queryParams.filters = filters as $TODO;
122
- queryParams.queryParameters = source.queryParameters as $TODO;
123
- if (spatialFilters) {
124
- queryParams.spatialFilters = spatialFilters as $TODO;
125
- }
126
133
  }
127
134
  return makeCall({
128
135
  url,
@@ -134,3 +141,19 @@ export function executeModel(props: {
134
141
  },
135
142
  });
136
143
  }
144
+
145
+ function objectToURLSearchParams(object: Record<string, unknown>) {
146
+ const params = new URLSearchParams();
147
+ for (const key in object) {
148
+ if (isPureObject(object[key])) {
149
+ params.append(key, JSON.stringify(object[key]));
150
+ } else if (Array.isArray(object[key])) {
151
+ params.append(key, JSON.stringify(object[key]));
152
+ } else if (object[key] === null) {
153
+ params.append(key, 'null');
154
+ } else if (object[key] !== undefined) {
155
+ params.append(key, String(object[key]));
156
+ }
157
+ }
158
+ return params;
159
+ }
@@ -21,9 +21,11 @@ type UrlParameters = {
21
21
  queryParameters?: Record<string, unknown> | unknown[];
22
22
  };
23
23
 
24
+ export type BoundaryQuerySourceResponse = TilejsonResult;
25
+
24
26
  export const boundaryQuerySource = async function (
25
27
  options: BoundaryQuerySourceOptions
26
- ): Promise<TilejsonResult> {
28
+ ): Promise<BoundaryQuerySourceResponse> {
27
29
  const {
28
30
  columns,
29
31
  filters,
@@ -49,5 +51,5 @@ export const boundaryQuerySource = async function (
49
51
  'boundary',
50
52
  options,
51
53
  urlParameters
52
- ) as Promise<TilejsonResult>;
54
+ ) as Promise<BoundaryQuerySourceResponse>;
53
55
  };
@@ -18,9 +18,11 @@ type UrlParameters = {
18
18
  propertiesTableName: string;
19
19
  };
20
20
 
21
+ export type BoundaryTableSourceResponse = TilejsonResult;
22
+
21
23
  export const boundaryTableSource = async function (
22
24
  options: BoundaryTableSourceOptions
23
- ): Promise<TilejsonResult> {
25
+ ): Promise<BoundaryTableSourceResponse> {
24
26
  const {filters, tilesetTableName, columns, propertiesTableName} = options;
25
27
  const urlParameters: UrlParameters = {
26
28
  tilesetTableName,
@@ -37,5 +39,5 @@ export const boundaryTableSource = async function (
37
39
  'boundary',
38
40
  options,
39
41
  urlParameters
40
- ) as Promise<TilejsonResult>;
42
+ ) as Promise<BoundaryTableSourceResponse>;
41
43
  };
@@ -19,6 +19,7 @@ export type H3QuerySourceOptions = SourceOptions &
19
19
  QuerySourceOptions &
20
20
  AggregationOptions &
21
21
  FilterOptions;
22
+
22
23
  type UrlParameters = {
23
24
  aggregationExp: string;
24
25
  aggregationResLevel?: string;
@@ -29,9 +30,11 @@ type UrlParameters = {
29
30
  filters?: Record<string, unknown>;
30
31
  };
31
32
 
33
+ export type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;
34
+
32
35
  export const h3QuerySource = async function (
33
36
  options: H3QuerySourceOptions
34
- ): Promise<TilejsonResult & WidgetQuerySourceResult> {
37
+ ): Promise<H3QuerySourceResponse> {
35
38
  const {
36
39
  aggregationExp,
37
40
  aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,
@@ -59,7 +62,12 @@ export const h3QuerySource = async function (
59
62
  return baseSource<UrlParameters>('query', options, urlParameters).then(
60
63
  (result) => ({
61
64
  ...(result as TilejsonResult),
62
- widgetSource: new WidgetQuerySource(options),
65
+ widgetSource: new WidgetQuerySource({
66
+ ...options,
67
+ // NOTE: passing redundant spatialDataColumn here to apply the default value 'h3'
68
+ spatialDataColumn,
69
+ spatialDataType: 'h3',
70
+ }),
63
71
  })
64
72
  );
65
73
  };