Skip to content

Commit 840ec57

Browse files
sjpotterleibale
andauthored
small refactor per discussion with leibele (#2801)
* small refactor per discussion with leibele * move true type to boolean type * fix geoshape to support NOINDEX & SORTABLE, clean code * fix for last commit --------- Co-authored-by: Leibale Eidelman <[email protected]>
1 parent 179b9e0 commit 840ec57

File tree

2 files changed

+76
-73
lines changed

2 files changed

+76
-73
lines changed

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

+36-30
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,36 +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-
MISSING_VALUES: {
452-
INDEXEMPTY: true
453-
}
454-
}
455-
}),
456-
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY']
457-
);
458-
});
459-
460-
it('with INDEXMISSING', () => {
461-
assert.deepEqual(
462-
transformArguments('index', {
463-
field: {
464-
type: SchemaFieldTypes.TEXT,
465-
MISSING_VALUES: {
466-
INDEXMISSING: true
467-
}
468-
}
469-
}),
470-
['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING']
471-
);
472-
});
473-
});
474480
});
475481

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

packages/search/lib/commands/index.ts

+40-43
Original file line numberDiff line numberDiff line change
@@ -188,46 +188,43 @@ 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,
213194
E = Record<PropertyKey, unknown>
214195
> = T | ({
215196
type: T;
216197
AS?: string;
217-
MISSING_VALUES?: MissingValues;
198+
INDEXMISSING?: boolean;
218199
} & E);
219200

201+
type CommonFieldArguments = {
202+
SORTABLE?: boolean | 'UNF';
203+
NOINDEX?: boolean;
204+
};
205+
220206
type CreateSchemaCommonField<
221207
T extends SchemaFieldTypes,
222208
E = Record<PropertyKey, unknown>
223209
> = CreateSchemaField<
224210
T,
225-
({
226-
SORTABLE?: true | 'UNF';
227-
NOINDEX?: true;
228-
} & E)
211+
(CommonFieldArguments & E)
229212
>;
230213

214+
function pushCommonFieldArguments(args: RedisCommandArguments, fieldOptions: CommonFieldArguments) {
215+
if (fieldOptions.SORTABLE) {
216+
args.push('SORTABLE');
217+
218+
if (fieldOptions.SORTABLE === 'UNF') {
219+
args.push('UNF');
220+
}
221+
}
222+
223+
if (fieldOptions.NOINDEX) {
224+
args.push('NOINDEX');
225+
}
226+
}
227+
231228
export enum SchemaTextFieldPhonetics {
232229
DM_EN = 'dm:en',
233230
DM_FR = 'dm:fr',
@@ -240,6 +237,7 @@ type CreateSchemaTextField = CreateSchemaCommonField<SchemaFieldTypes.TEXT, {
240237
WEIGHT?: number;
241238
PHONETIC?: SchemaTextFieldPhonetics;
242239
WITHSUFFIXTRIE?: boolean;
240+
INDEXEMPTY?: boolean;
243241
}>;
244242

245243
type CreateSchemaNumericField = CreateSchemaCommonField<SchemaFieldTypes.NUMERIC>;
@@ -250,6 +248,7 @@ type CreateSchemaTagField = CreateSchemaCommonField<SchemaFieldTypes.TAG, {
250248
SEPARATOR?: string;
251249
CASESENSITIVE?: true;
252250
WITHSUFFIXTRIE?: boolean;
251+
INDEXEMPTY?: boolean;
253252
}>;
254253

255254
export enum VectorAlgorithms {
@@ -297,7 +296,7 @@ export interface RediSearchSchema {
297296
CreateSchemaTagField |
298297
CreateSchemaFlatVectorField |
299298
CreateSchemaHNSWVectorField |
300-
CreateSchemaGeoShapeField
299+
CreateSchemaGeoShapeField;
301300
}
302301

303302
export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema) {
@@ -333,13 +332,17 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
333332
args.push('WITHSUFFIXTRIE');
334333
}
335334

336-
pushMissingValues(args, fieldOptions.MISSING_VALUES);
335+
pushCommonFieldArguments(args, fieldOptions);
336+
337+
if (fieldOptions.INDEXEMPTY) {
338+
args.push('INDEXEMPTY');
339+
}
337340

338341
break;
339342

340343
case SchemaFieldTypes.NUMERIC:
341344
case SchemaFieldTypes.GEO:
342-
pushMissingValues(args, fieldOptions.MISSING_VALUES);
345+
pushCommonFieldArguments(args, fieldOptions);
343346
break;
344347

345348
case SchemaFieldTypes.TAG:
@@ -355,7 +358,11 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
355358
args.push('WITHSUFFIXTRIE');
356359
}
357360

358-
pushMissingValues(args, fieldOptions.MISSING_VALUES);
361+
pushCommonFieldArguments(args, fieldOptions);
362+
363+
if (fieldOptions.INDEXEMPTY) {
364+
args.push('INDEXEMPTY');
365+
}
359366

360367
break;
361368

@@ -398,30 +405,20 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
398405
}
399406
});
400407

401-
pushMissingValues(args, fieldOptions.MISSING_VALUES);
402-
403-
continue; // vector fields do not contain SORTABLE and NOINDEX options
408+
break;
404409

405410
case SchemaFieldTypes.GEOSHAPE:
406411
if (fieldOptions.COORD_SYSTEM !== undefined) {
407412
args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM);
408413
}
409414

410-
pushMissingValues(args, fieldOptions.MISSING_VALUES);
411-
412-
continue; // geo shape fields do not contain SORTABLE and NOINDEX options
413-
}
414-
415-
if (fieldOptions.SORTABLE) {
416-
args.push('SORTABLE');
415+
pushCommonFieldArguments(args, fieldOptions);
417416

418-
if (fieldOptions.SORTABLE === 'UNF') {
419-
args.push('UNF');
420-
}
417+
break;
421418
}
422419

423-
if (fieldOptions.NOINDEX) {
424-
args.push('NOINDEX');
420+
if (fieldOptions.INDEXMISSING) {
421+
args.push('INDEXMISSING');
425422
}
426423
}
427424
}

0 commit comments

Comments
 (0)