From 3fa54fef584852d481eec7f788492b500283ea59 Mon Sep 17 00:00:00 2001 From: Leibale Date: Mon, 18 Sep 2023 12:40:12 -0400 Subject: [PATCH] fix #2614 - add support for RediSearch GEOSHAPE fields --- packages/search/lib/commands/CREATE.spec.ts | 36 +++++++++++++++++++++ packages/search/lib/commands/CREATE.ts | 24 ++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index 37aa06011b..0c0b3e89a2 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -194,6 +194,42 @@ describe('FT.CREATE', () => { ); }); }); + + describe('GEOSHAPE', () => { + describe('without options', () => { + it('SCHEMA_FIELD_TYPE.GEOSHAPE', () => { + assert.deepEqual( + CREATE.transformArguments('index', { + field: SCHEMA_FIELD_TYPE.GEOSHAPE + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE'] + ); + }); + + it('{ type: SCHEMA_FIELD_TYPE.GEOSHAPE }', () => { + assert.deepEqual( + CREATE.transformArguments('index', { + field: { + type: SCHEMA_FIELD_TYPE.GEOSHAPE + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE'] + ); + }); + }); + + it('with COORD_SYSTEM', () => { + assert.deepEqual( + CREATE.transformArguments('index', { + field: { + type: SCHEMA_FIELD_TYPE.GEOSHAPE, + COORD_SYSTEM: 'SPHERICAL' + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE', 'COORD_SYSTEM', 'SPHERICAL'] + ); + }); + }); it('with AS', () => { assert.deepEqual( diff --git a/packages/search/lib/commands/CREATE.ts b/packages/search/lib/commands/CREATE.ts index 98a616f04e..ea63873be4 100644 --- a/packages/search/lib/commands/CREATE.ts +++ b/packages/search/lib/commands/CREATE.ts @@ -7,7 +7,8 @@ export const SCHEMA_FIELD_TYPE = { NUMERIC: 'NUMERIC', GEO: 'GEO', TAG: 'TAG', - VECTOR: 'VECTOR' + VECTOR: 'VECTOR', + GEOSHAPE: 'GEOSHAPE' } as const; export type SchemaFieldType = typeof SCHEMA_FIELD_TYPE[keyof typeof SCHEMA_FIELD_TYPE]; @@ -85,6 +86,17 @@ type SchemaHNSWVectorField = SchemaVectorField; +export const SCHEMA_GEO_SHAPE_COORD_SYSTEM = { + SPHERICAL: 'SPHERICAL', + FLAT: 'FLAT' +} as const; + +export type SchemaGeoShapeFieldCoordSystem = typeof SCHEMA_GEO_SHAPE_COORD_SYSTEM[keyof typeof SCHEMA_GEO_SHAPE_COORD_SYSTEM]; + +type SchemaGeoShapeField = SchemaField; + export interface RediSearchSchema { [field: string]:( SchemaTextField | @@ -92,7 +104,8 @@ export interface RediSearchSchema { SchemaGeoField | SchemaTagField | SchemaFlatVectorField | - SchemaHNSWVectorField + SchemaHNSWVectorField | + SchemaGeoShapeField ); } @@ -191,6 +204,13 @@ export function pushSchema(args: CommandArguments, schema: RediSearchSchema) { args[lengthIndex] = (args.length - lengthIndex - 1).toString(); continue; // vector fields do not contain SORTABLE and NOINDEX options + + case SCHEMA_FIELD_TYPE.GEOSHAPE: + if (fieldOptions.COORD_SYSTEM !== undefined) { + args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM); + } + + continue; // geo shape fields do not contain SORTABLE and NOINDEX options } if (fieldOptions.SORTABLE) {