Skip to content

Commit a1bee1c

Browse files
authored
add geoshape support (#2788)
copied from what leibele did for v5
1 parent 7d43a97 commit a1bee1c

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

packages/search/lib/commands/CREATE.spec.ts

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { strict as assert } from 'assert';
22
import testUtils, { GLOBAL } from '../test-utils';
33
import { transformArguments } from './CREATE';
4-
import { SchemaFieldTypes, SchemaTextFieldPhonetics, RedisSearchLanguages, VectorAlgorithms } from '.';
4+
import { SchemaFieldTypes, SchemaTextFieldPhonetics, RedisSearchLanguages, VectorAlgorithms, SCHEMA_GEO_SHAPE_COORD_SYSTEM } from '.';
55

66
describe('CREATE', () => {
77
describe('transformArguments', () => {
@@ -196,6 +196,42 @@ describe('CREATE', () => {
196196
});
197197
});
198198

199+
describe('GEOSHAPE', () => {
200+
describe('without options', () => {
201+
it('SCHEMA_FIELD_TYPE.GEOSHAPE', () => {
202+
assert.deepEqual(
203+
transformArguments('index', {
204+
field: SchemaFieldTypes.GEOSHAPE
205+
}),
206+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE']
207+
);
208+
});
209+
210+
it('{ type: SCHEMA_FIELD_TYPE.GEOSHAPE }', () => {
211+
assert.deepEqual(
212+
transformArguments('index', {
213+
field: {
214+
type: SchemaFieldTypes.GEOSHAPE
215+
}
216+
}),
217+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE']
218+
);
219+
});
220+
});
221+
222+
it('with COORD_SYSTEM', () => {
223+
assert.deepEqual(
224+
transformArguments('index', {
225+
field: {
226+
type: SchemaFieldTypes.GEOSHAPE,
227+
COORD_SYSTEM: SCHEMA_GEO_SHAPE_COORD_SYSTEM.SPHERICAL
228+
}
229+
}),
230+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEOSHAPE', 'COORD_SYSTEM', 'SPHERICAL']
231+
);
232+
});
233+
});
234+
199235
describe('with generic options', () => {
200236
it('with AS', () => {
201237
assert.deepEqual(

packages/search/lib/commands/index.ts

+22-2
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ export enum SchemaFieldTypes {
185185
NUMERIC = 'NUMERIC',
186186
GEO = 'GEO',
187187
TAG = 'TAG',
188-
VECTOR = 'VECTOR'
188+
VECTOR = 'VECTOR',
189+
GEOSHAPE = 'GEOSHAPE'
189190
}
190191

191192
type CreateSchemaField<
@@ -257,14 +258,26 @@ type CreateSchemaHNSWVectorField = CreateSchemaVectorField<VectorAlgorithms.HNSW
257258
EF_RUNTIME?: number;
258259
}>;
259260

261+
export const SCHEMA_GEO_SHAPE_COORD_SYSTEM = {
262+
SPHERICAL: 'SPHERICAL',
263+
FLAT: 'FLAT'
264+
} as const;
265+
266+
export type SchemaGeoShapeFieldCoordSystem = typeof SCHEMA_GEO_SHAPE_COORD_SYSTEM[keyof typeof SCHEMA_GEO_SHAPE_COORD_SYSTEM];
267+
268+
type CreateSchemaGeoShapeField = CreateSchemaCommonField<SchemaFieldTypes.GEOSHAPE, {
269+
COORD_SYSTEM?: SchemaGeoShapeFieldCoordSystem;
270+
}>;
271+
260272
export interface RediSearchSchema {
261273
[field: string]:
262274
CreateSchemaTextField |
263275
CreateSchemaNumericField |
264276
CreateSchemaGeoField |
265277
CreateSchemaTagField |
266278
CreateSchemaFlatVectorField |
267-
CreateSchemaHNSWVectorField;
279+
CreateSchemaHNSWVectorField |
280+
CreateSchemaGeoShapeField
268281
}
269282

270283
export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema) {
@@ -361,6 +374,13 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
361374
});
362375

363376
continue; // vector fields do not contain SORTABLE and NOINDEX options
377+
378+
case SchemaFieldTypes.GEOSHAPE:
379+
if (fieldOptions.COORD_SYSTEM !== undefined) {
380+
args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM);
381+
}
382+
383+
continue; // geo shape fields do not contain SORTABLE and NOINDEX options
364384
}
365385

366386
if (fieldOptions.SORTABLE) {

0 commit comments

Comments
 (0)