diff --git a/.changeset/fuzzy-knives-bathe.md b/.changeset/fuzzy-knives-bathe.md new file mode 100644 index 0000000000..ab7e1b03e8 --- /dev/null +++ b/.changeset/fuzzy-knives-bathe.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/common-utils": patch +--- + +fix: Skip rendering empty aggConditions diff --git a/packages/common-utils/src/__tests__/queryParser.test.ts b/packages/common-utils/src/__tests__/queryParser.test.ts index a2afc2118f..b6b0594914 100644 --- a/packages/common-utils/src/__tests__/queryParser.test.ts +++ b/packages/common-utils/src/__tests__/queryParser.test.ts @@ -2121,6 +2121,66 @@ describe('CustomSchemaSQLSerializerV2 - Array and Nested Fields', () => { ); }); +describe('genEnglishExplanation', () => { + const metadata = getMetadata( + new ClickhouseClient({ host: 'http://localhost:8123' }), + ); + metadata.getColumn = jest.fn().mockImplementation(async () => undefined); + metadata.getMaterializedColumnsLookupTable = jest + .fn() + .mockImplementation(async () => new Map()); + + const databaseName = 'testName'; + const tableName = 'testTable'; + const connectionId = 'testId'; + const query = 'bar'; + + it('serializes to english when table, database, and connection are present', async () => { + const actual = await genEnglishExplanation({ + query, + tableConnection: { tableName, databaseName, connectionId }, + metadata, + }); + expect(actual).toBe('event has whole word bar'); + }); + + it('falls back to the raw message when tableName is missing', async () => { + const actual = await genEnglishExplanation({ + query, + tableConnection: { tableName: '', databaseName, connectionId }, + metadata, + }); + expect(actual).toBe(`Message containing ${query}`); + }); + + it('falls back to the raw message when databaseName is missing', async () => { + const actual = await genEnglishExplanation({ + query, + tableConnection: { tableName, databaseName: '', connectionId }, + metadata, + }); + expect(actual).toBe(`Message containing ${query}`); + }); + + it('falls back to the raw message when connectionId is missing', async () => { + const actual = await genEnglishExplanation({ + query, + tableConnection: { tableName, databaseName, connectionId: '' }, + metadata, + }); + expect(actual).toBe(`Message containing ${query}`); + }); + + it('falls back to the raw message when all table connection fields are missing', async () => { + const actual = await genEnglishExplanation({ + query, + tableConnection: { tableName: '', databaseName: '', connectionId: '' }, + metadata, + }); + expect(actual).toBe(`Message containing ${query}`); + }); +}); + describe('parseKvItemsExpression', () => { it('parses standard KV items expression', () => { expect( diff --git a/packages/common-utils/src/core/renderChartConfig.ts b/packages/common-utils/src/core/renderChartConfig.ts index c25e985890..fe432a0985 100644 --- a/packages/common-utils/src/core/renderChartConfig.ts +++ b/packages/common-utils/src/core/renderChartConfig.ts @@ -691,18 +691,20 @@ async function renderSelectList( const selectsSQL = await Promise.all( selectList.map(async select => { - const whereClause = await renderWhereExpression({ - condition: select.aggCondition ?? '', - from: chartConfig.from, - language: select.aggConditionLanguage ?? 'lucene', - implicitColumnExpression: chartConfig.implicitColumnExpression, - bodyExpression: chartConfig.bodyExpression, - useTextIndexForImplicitColumn: - chartConfig.useTextIndexForImplicitColumn, - metadata, - connectionId: chartConfig.connection, - with: chartConfig.with, - }); + const whereClause = isNonEmptyWhereExpr(select.aggCondition) + ? await renderWhereExpression({ + condition: select.aggCondition ?? '', + from: chartConfig.from, + language: select.aggConditionLanguage ?? 'lucene', + implicitColumnExpression: chartConfig.implicitColumnExpression, + bodyExpression: chartConfig.bodyExpression, + useTextIndexForImplicitColumn: + chartConfig.useTextIndexForImplicitColumn, + metadata, + connectionId: chartConfig.connection, + with: chartConfig.with, + }) + : chSql``; let expr: ChSql; if (select.aggFn == null) { diff --git a/packages/common-utils/src/queryParser.ts b/packages/common-utils/src/queryParser.ts index 2a500c6b1c..10b6c2c7e7 100644 --- a/packages/common-utils/src/queryParser.ts +++ b/packages/common-utils/src/queryParser.ts @@ -2022,7 +2022,7 @@ export async function genEnglishExplanation({ const { tableName, databaseName, connectionId } = tableConnection; const parsedQ = parse(query); - if (parsedQ) { + if (parsedQ && tableName && databaseName && connectionId) { const serializer = new EnglishSerializer({ metadata, tableName,