diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index 094ba4529f0..50c5c011c89 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -70,6 +70,18 @@ describe('CREATE', () => { ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'WITHSUFFIXTRIE'] ); }); + + it('with INDEXEMPTY', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + INDEXEMPTY: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY'] + ); + }); }); it('NUMERIC', () => { @@ -148,6 +160,18 @@ describe('CREATE', () => { ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'WITHSUFFIXTRIE'] ); }); + + it('with INDEXEMPTY', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TAG, + INDEXEMPTY: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'INDEXEMPTY'] + ); + }); }); describe('VECTOR', () => { @@ -282,6 +306,18 @@ describe('CREATE', () => { ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'NOINDEX'] ); }); + + it('with INDEXMISSING', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + INDEXMISSING: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING'] + ); + }); }); }); @@ -441,36 +477,6 @@ describe('CREATE', () => { ); }); }); - - describe('Missing Values', () => { - it('with INDEXEMPTY', () => { - assert.deepEqual( - transformArguments('index', { - field: { - type: SchemaFieldTypes.TEXT, - MISSING_VALUES: { - INDEXEMPTY: true - } - } - }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY'] - ); - }); - - it('with INDEXMISSING', () => { - assert.deepEqual( - transformArguments('index', { - field: { - type: SchemaFieldTypes.TEXT, - MISSING_VALUES: { - INDEXMISSING: true - } - } - }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING'] - ); - }); - }); }); testUtils.testWithClient('client.ft.create', async client => { diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index 29dbd2480ce..f907e1999e6 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -188,25 +188,6 @@ export enum SchemaFieldTypes { VECTOR = 'VECTOR', GEOSHAPE = 'GEOSHAPE' } - -export interface MissingValues { - INDEXEMPTY?: boolean; - INDEXMISSING?: boolean; -} - -function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingValues) { - if (!missingValues) { - return; - } - - if (missingValues.INDEXEMPTY) { - args.push("INDEXEMPTY"); - } - - if (missingValues.INDEXMISSING) { - args.push("INDEXMISSING"); - } -} type CreateSchemaField< T extends SchemaFieldTypes, @@ -214,20 +195,36 @@ type CreateSchemaField< > = T | ({ type: T; AS?: string; - MISSING_VALUES?: MissingValues; + INDEXMISSING?: boolean; } & E); +type CommonFieldArguments = { + SORTABLE?: boolean | 'UNF'; + NOINDEX?: boolean; +}; + type CreateSchemaCommonField< T extends SchemaFieldTypes, E = Record > = CreateSchemaField< T, - ({ - SORTABLE?: true | 'UNF'; - NOINDEX?: true; - } & E) + (CommonFieldArguments & E) >; +function pushCommonFieldArguments(args: RedisCommandArguments, fieldOptions: CommonFieldArguments) { + if (fieldOptions.SORTABLE) { + args.push('SORTABLE'); + + if (fieldOptions.SORTABLE === 'UNF') { + args.push('UNF'); + } + } + + if (fieldOptions.NOINDEX) { + args.push('NOINDEX'); + } +} + export enum SchemaTextFieldPhonetics { DM_EN = 'dm:en', DM_FR = 'dm:fr', @@ -240,6 +237,7 @@ type CreateSchemaTextField = CreateSchemaCommonField; type CreateSchemaNumericField = CreateSchemaCommonField; @@ -250,6 +248,7 @@ type CreateSchemaTagField = CreateSchemaCommonField; export enum VectorAlgorithms { @@ -297,7 +296,7 @@ export interface RediSearchSchema { CreateSchemaTagField | CreateSchemaFlatVectorField | CreateSchemaHNSWVectorField | - CreateSchemaGeoShapeField + CreateSchemaGeoShapeField; } export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema) { @@ -333,13 +332,17 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema args.push('WITHSUFFIXTRIE'); } - pushMissingValues(args, fieldOptions.MISSING_VALUES); + pushCommonFieldArguments(args, fieldOptions); + + if (fieldOptions.INDEXEMPTY) { + args.push('INDEXEMPTY'); + } break; case SchemaFieldTypes.NUMERIC: case SchemaFieldTypes.GEO: - pushMissingValues(args, fieldOptions.MISSING_VALUES); + pushCommonFieldArguments(args, fieldOptions); break; case SchemaFieldTypes.TAG: @@ -355,7 +358,11 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema args.push('WITHSUFFIXTRIE'); } - pushMissingValues(args, fieldOptions.MISSING_VALUES); + pushCommonFieldArguments(args, fieldOptions); + + if (fieldOptions.INDEXEMPTY) { + args.push('INDEXEMPTY'); + } break; @@ -398,30 +405,20 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema } }); - pushMissingValues(args, fieldOptions.MISSING_VALUES); - - continue; // vector fields do not contain SORTABLE and NOINDEX options + break; case SchemaFieldTypes.GEOSHAPE: if (fieldOptions.COORD_SYSTEM !== undefined) { args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM); } - pushMissingValues(args, fieldOptions.MISSING_VALUES); - - continue; // geo shape fields do not contain SORTABLE and NOINDEX options - } - - if (fieldOptions.SORTABLE) { - args.push('SORTABLE'); + pushCommonFieldArguments(args, fieldOptions); - if (fieldOptions.SORTABLE === 'UNF') { - args.push('UNF'); - } + break; } - if (fieldOptions.NOINDEX) { - args.push('NOINDEX'); + if (fieldOptions.INDEXMISSING) { + args.push('INDEXMISSING'); } } }