Skip to content

Commit 0e7e2e6

Browse files
authored
add missing fields support to schema (v4) (#2789)
1 parent 64fca37 commit 0e7e2e6

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

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

+30
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,36 @@ describe('CREATE', () => {
441441
);
442442
});
443443
});
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+
});
444474
});
445475

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

packages/search/lib/commands/index.ts

+32-3
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,32 @@ export enum SchemaFieldTypes {
189189
GEOSHAPE = 'GEOSHAPE'
190190
}
191191

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+
}
210+
192211
type CreateSchemaField<
193212
T extends SchemaFieldTypes,
194213
E = Record<PropertyKey, unknown>
195214
> = T | ({
196215
type: T;
197216
AS?: string;
217+
MISSING_VALUES?: MissingValues;
198218
} & E);
199219

200220
type CreateSchemaCommonField<
@@ -313,11 +333,14 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
313333
args.push('WITHSUFFIXTRIE');
314334
}
315335

336+
pushMissingValues(args, fieldOptions.MISSING_VALUES);
337+
316338
break;
317339

318-
// case SchemaFieldTypes.NUMERIC:
319-
// case SchemaFieldTypes.GEO:
320-
// break;
340+
case SchemaFieldTypes.NUMERIC:
341+
case SchemaFieldTypes.GEO:
342+
pushMissingValues(args, fieldOptions.MISSING_VALUES);
343+
break;
321344

322345
case SchemaFieldTypes.TAG:
323346
if (fieldOptions.SEPARATOR) {
@@ -332,6 +355,8 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
332355
args.push('WITHSUFFIXTRIE');
333356
}
334357

358+
pushMissingValues(args, fieldOptions.MISSING_VALUES);
359+
335360
break;
336361

337362
case SchemaFieldTypes.VECTOR:
@@ -373,13 +398,17 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema
373398
}
374399
});
375400

401+
pushMissingValues(args, fieldOptions.MISSING_VALUES);
402+
376403
continue; // vector fields do not contain SORTABLE and NOINDEX options
377404

378405
case SchemaFieldTypes.GEOSHAPE:
379406
if (fieldOptions.COORD_SYSTEM !== undefined) {
380407
args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM);
381408
}
382409

410+
pushMissingValues(args, fieldOptions.MISSING_VALUES);
411+
383412
continue; // geo shape fields do not contain SORTABLE and NOINDEX options
384413
}
385414

0 commit comments

Comments
 (0)