Skip to content

Commit 15580a3

Browse files
authored
fix geoshape to support NOINDEX & SORTABLE, clean code
1 parent 576bda2 commit 15580a3

File tree

2 files changed

+67
-77
lines changed

2 files changed

+67
-77
lines changed

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

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ describe('CREATE', () => {
7070
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'WITHSUFFIXTRIE']
7171
);
7272
});
73+
74+
it('with INDEXEMPTY', () => {
75+
assert.deepEqual(
76+
transformArguments('index', {
77+
field: {
78+
type: SchemaFieldTypes.TEXT,
79+
INDEXEMPTY: true
80+
}
81+
}),
82+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY']
83+
);
84+
});
7385
});
7486

7587
it('NUMERIC', () => {
@@ -148,6 +160,18 @@ describe('CREATE', () => {
148160
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'WITHSUFFIXTRIE']
149161
);
150162
});
163+
164+
it('with INDEXEMPTY', () => {
165+
assert.deepEqual(
166+
transformArguments('index', {
167+
field: {
168+
type: SchemaFieldTypes.TAG,
169+
INDEXEMPTY: true
170+
}
171+
}),
172+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'INDEXEMPTY']
173+
);
174+
});
151175
});
152176

153177
describe('VECTOR', () => {
@@ -282,6 +306,18 @@ describe('CREATE', () => {
282306
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'NOINDEX']
283307
);
284308
});
309+
310+
it('with INDEXMISSING', () => {
311+
assert.deepEqual(
312+
transformArguments('index', {
313+
field: {
314+
type: SchemaFieldTypes.TEXT,
315+
INDEXMISSING: true
316+
}
317+
}),
318+
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING']
319+
);
320+
});
285321
});
286322
});
287323

@@ -441,45 +477,6 @@ describe('CREATE', () => {
441477
);
442478
});
443479
});
444-
445-
describe('Missing Values', () => {
446-
it('with INDEXEMPTY', () => {
447-
assert.deepEqual(
448-
transformArguments('index', {
449-
field: {
450-
type: SchemaFieldTypes.TEXT,
451-
INDEXEMPTY: true
452-
}
453-
}),
454-
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY']
455-
);
456-
});
457-
458-
it('with INDEXMISSING', () => {
459-
assert.deepEqual(
460-
transformArguments('index', {
461-
field: {
462-
type: SchemaFieldTypes.TEXT,
463-
INDEXMISSING: true
464-
}
465-
}),
466-
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING']
467-
);
468-
});
469-
470-
it('with INDEXEMPTY and INDEXMISSING', () => {
471-
assert.deepEqual(
472-
transformArguments('index', {
473-
field: {
474-
type: SchemaFieldTypes.TEXT,
475-
INDEXEMPTY: true,
476-
INDEXMISSING: true
477-
}
478-
}),
479-
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY', 'INDEXMISSING']
480-
);
481-
});
482-
});
483480
});
484481

485482
testUtils.testWithClient('client.ft.create', async client => {

packages/search/lib/commands/index.ts

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -188,25 +188,6 @@ export enum SchemaFieldTypes {
188188
VECTOR = 'VECTOR',
189189
GEOSHAPE = 'GEOSHAPE'
190190
}
191-
192-
export interface MissingValues {
193-
INDEXEMPTY?: boolean;
194-
INDEXMISSING?: boolean;
195-
}
196-
197-
function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingValues) {
198-
if (!missingValues) {
199-
return;
200-
}
201-
202-
if (missingValues.INDEXEMPTY) {
203-
args.push("INDEXEMPTY");
204-
}
205-
206-
if (missingValues.INDEXMISSING) {
207-
args.push("INDEXMISSING");
208-
}
209-
}
210191

211192
type CreateSchemaField<
212193
T extends SchemaFieldTypes,
@@ -228,6 +209,20 @@ type CreateSchemaCommonField<
228209
} & E)
229210
>;
230211

212+
function pushCommonFieldArguments(args: RedisCommandArguments, fieldOptions: CreateSchemaCommonField<SchemaFieldTypes>) {
213+
if (fieldOptions.SORTABLE) {
214+
args.push('SORTABLE');
215+
216+
if (fieldOptions.SORTABLE === 'UNF') {
217+
args.push('UNF');
218+
}
219+
}
220+
221+
if (fieldOptions.NOINDEX) {
222+
args.push('NOINDEX');
223+
}
224+
}
225+
231226
export enum SchemaTextFieldPhonetics {
232227
DM_EN = 'dm:en',
233228
DM_FR = 'dm:fr',
@@ -299,7 +294,7 @@ export interface RediSearchSchema {
299294
CreateSchemaTagField |
300295
CreateSchemaFlatVectorField |
301296
CreateSchemaHNSWVectorField |
302-
CreateSchemaGeoShapeField
297+
CreateSchemaGeoShapeField;
303298
}
304299

305300
export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema) {
@@ -335,13 +330,17 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
335330
args.push('WITHSUFFIXTRIE');
336331
}
337332

338-
pushMissingValues(args, fieldOptions);
333+
pushCommonFieldArguments(args, fieldOptions);
334+
335+
if (fieldOptions.INDEXEMPTY) {
336+
args.push('INDEXEMPTY');
337+
}
339338

340339
break;
341340

342341
case SchemaFieldTypes.NUMERIC:
343342
case SchemaFieldTypes.GEO:
344-
pushMissingValues(args, fieldOptions);
343+
pushCommonFieldArguments(args, fieldOptions);
345344
break;
346345

347346
case SchemaFieldTypes.TAG:
@@ -357,7 +356,11 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
357356
args.push('WITHSUFFIXTRIE');
358357
}
359358

360-
pushMissingValues(args, fieldOptions);
359+
pushCommonFieldArguments(args, fieldOptions);
360+
361+
if (fieldOptions.INDEXEMPTY) {
362+
args.push('INDEXEMPTY');
363+
}
361364

362365
break;
363366

@@ -400,30 +403,20 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
400403
}
401404
});
402405

403-
pushMissingValues(args, fieldOptions);
404-
405-
continue; // vector fields do not contain SORTABLE and NOINDEX options
406+
break;
406407

407408
case SchemaFieldTypes.GEOSHAPE:
408409
if (fieldOptions.COORD_SYSTEM !== undefined) {
409410
args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM);
410411
}
411412

412-
pushMissingValues(args, fieldOptions);
413-
414-
continue; // geo shape fields do not contain SORTABLE and NOINDEX options
415-
}
413+
pushCommonFieldArguments(args, fieldOptions);
416414

417-
if (fieldOptions.SORTABLE) {
418-
args.push('SORTABLE');
419-
420-
if (fieldOptions.SORTABLE === 'UNF') {
421-
args.push('UNF');
422-
}
415+
break;
423416
}
424417

425-
if (fieldOptions.NOINDEX) {
426-
args.push('NOINDEX');
418+
if (fieldOptions.INDEXMISSING) {
419+
args.push('INDEXMISSING');
427420
}
428421
}
429422
}

0 commit comments

Comments
 (0)