From 7eb93329cabc9f6b7732c1bc34405da89ec9c47d Mon Sep 17 00:00:00 2001 From: Shaya Potter Date: Wed, 10 Jul 2024 19:46:23 +0300 Subject: [PATCH 1/3] add missing fields support to schemea --- packages/search/lib/commands/CREATE.spec.ts | 30 ++++++++++++++++++ packages/search/lib/commands/index.ts | 35 +++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index 31eaf02dbba..c7dcfa93ceb 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -441,6 +441,36 @@ describe('CREATE', () => { ); }); }); + + describe('Missing Values', () => { + it('with ISNULL', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + MISSING_VALUES: { + IS_NULL: true + } + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'ISNULL'] + ); + }); + + it('with ISMISSING', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + MISSING_VALUES: { + IS_MISSING: true + } + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'ISMISSING'] + ); + }); + }); }); testUtils.testWithClient('client.ft.create', async client => { diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index 053e2fab38f..5452ca2b092 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -189,12 +189,32 @@ export enum SchemaFieldTypes { GEOSHAPE = 'GEOSHAPE' } +export interface MissingValues { + IS_NULL?: boolean; + IS_MISSING?: boolean; +} + +function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingValues) { + if (!missingValues) { + return; + } + + if (missingValues.IS_MISSING) { + args.push("ISMISSING"); + } + + if (missingValues.IS_NULL) { + args.push("ISNULL"); + } +} + type CreateSchemaField< T extends SchemaFieldTypes, E = Record > = T | ({ type: T; AS?: string; + MISSING_VALUES?: MissingValues; } & E); type CreateSchemaCommonField< @@ -313,11 +333,14 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema args.push('WITHSUFFIXTRIE'); } + pushMissingValues(args, fieldOptions.MISSING_VALUES); + break; - // case SchemaFieldTypes.NUMERIC: - // case SchemaFieldTypes.GEO: - // break; + case SchemaFieldTypes.NUMERIC: + case SchemaFieldTypes.GEO: + pushMissingValues(args, fieldOptions.MISSING_VALUES); + break; case SchemaFieldTypes.TAG: if (fieldOptions.SEPARATOR) { @@ -332,6 +355,8 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema args.push('WITHSUFFIXTRIE'); } + pushMissingValues(args, fieldOptions.MISSING_VALUES); + break; case SchemaFieldTypes.VECTOR: @@ -373,6 +398,8 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema } }); + pushMissingValues(args, fieldOptions.MISSING_VALUES); + continue; // vector fields do not contain SORTABLE and NOINDEX options case SchemaFieldTypes.GEOSHAPE: @@ -380,6 +407,8 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema args.push('COORD_SYSTEM', fieldOptions.COORD_SYSTEM); } + pushMissingValues(args, fieldOptions.MISSING_VALUES); + continue; // geo shape fields do not contain SORTABLE and NOINDEX options } From dd3929438738a9fb7f12901b17ee1aacfb170b0c Mon Sep 17 00:00:00 2001 From: Shaya Potter Date: Thu, 11 Jul 2024 11:21:36 +0300 Subject: [PATCH 2/3] update to final design doc --- packages/search/lib/commands/CREATE.spec.ts | 10 +++++----- packages/search/lib/commands/index.ts | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index c7dcfa93ceb..ef3ac180f80 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -443,17 +443,17 @@ describe('CREATE', () => { }); describe('Missing Values', () => { - it('with ISNULL', () => { + it('with INDEX_EMPTY', () => { assert.deepEqual( transformArguments('index', { field: { type: SchemaFieldTypes.TEXT, MISSING_VALUES: { - IS_NULL: true + INDEX_EMPTY: true } } }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'ISNULL'] + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXEMPTY'] ); }); @@ -463,11 +463,11 @@ describe('CREATE', () => { field: { type: SchemaFieldTypes.TEXT, MISSING_VALUES: { - IS_MISSING: true + INDEX_MISSING: true } } }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'ISMISSING'] + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'INDEXMISSING'] ); }); }); diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index 5452ca2b092..88ab3b6e9c2 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -190,21 +190,21 @@ export enum SchemaFieldTypes { } export interface MissingValues { - IS_NULL?: boolean; - IS_MISSING?: boolean; + INDEX_EMPTY?: boolean; + INDEX_MISSING?: boolean; } function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingValues) { if (!missingValues) { return; } - - if (missingValues.IS_MISSING) { - args.push("ISMISSING"); + + if (missingValues.INDEX_EMPTY) { + args.push("INDEXEMPTY"); } - if (missingValues.IS_NULL) { - args.push("ISNULL"); + if (missingValues.INDEX_MISSING) { + args.push("INDEXMISSING"); } } From 6b73e9e49bf10c378b936a9d3640b06b8c283757 Mon Sep 17 00:00:00 2001 From: Shaya Potter Date: Thu, 11 Jul 2024 12:49:47 +0300 Subject: [PATCH 3/3] fix naming --- packages/search/lib/commands/CREATE.spec.ts | 8 ++++---- packages/search/lib/commands/index.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index ef3ac180f80..094ba4529f0 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -443,13 +443,13 @@ describe('CREATE', () => { }); describe('Missing Values', () => { - it('with INDEX_EMPTY', () => { + it('with INDEXEMPTY', () => { assert.deepEqual( transformArguments('index', { field: { type: SchemaFieldTypes.TEXT, MISSING_VALUES: { - INDEX_EMPTY: true + INDEXEMPTY: true } } }), @@ -457,13 +457,13 @@ describe('CREATE', () => { ); }); - it('with ISMISSING', () => { + it('with INDEXMISSING', () => { assert.deepEqual( transformArguments('index', { field: { type: SchemaFieldTypes.TEXT, MISSING_VALUES: { - INDEX_MISSING: true + INDEXMISSING: true } } }), diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index 88ab3b6e9c2..29dbd2480ce 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -190,8 +190,8 @@ export enum SchemaFieldTypes { } export interface MissingValues { - INDEX_EMPTY?: boolean; - INDEX_MISSING?: boolean; + INDEXEMPTY?: boolean; + INDEXMISSING?: boolean; } function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingValues) { @@ -199,11 +199,11 @@ function pushMissingValues(args: RedisCommandArguments, missingValues?: MissingV return; } - if (missingValues.INDEX_EMPTY) { + if (missingValues.INDEXEMPTY) { args.push("INDEXEMPTY"); } - if (missingValues.INDEX_MISSING) { + if (missingValues.INDEXMISSING) { args.push("INDEXMISSING"); } }