This is an automated email from the ASF dual-hosted git repository. asoare pushed a commit to branch alexandrusoare/fix/column-dimension-suggestion in repository https://gitbox.apache.org/repos/asf/superset.git
commit d66297553a92bcdc0414772d2c1d3a46af0316aa Author: alexandrusoare <[email protected]> AuthorDate: Thu Feb 5 14:05:27 2026 +0200 fix(sql): fix sql suggestions --- .../ColumnSelectPopover.test.tsx | 71 ++++++++++++++++++++++ .../DndColumnSelectControl/ColumnSelectPopover.tsx | 4 +- .../AdhocFilterEditPopoverSqlTabContent/index.tsx | 4 +- 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx index f5a2d613ced..742b5d475fe 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx @@ -20,6 +20,27 @@ import { render, fireEvent } from 'spec/helpers/testing-library'; import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; + +// Mock SQLEditorWithValidation to capture props for testing +const mockSQLEditorProps = jest.fn(); +jest.mock('src/components/SQLEditorWithValidation', () => ({ + __esModule: true, + default: (mockProps: Record<string, unknown>) => { + mockSQLEditorProps(mockProps); + return ( + <textarea + data-testid="sql-editor" + value={mockProps.value as string} + onChange={mockEvent => + (mockProps.onChange as (mockValue: string) => void)( + (mockEvent.target as HTMLTextAreaElement).value, + ) + } + /> + ); + }, +})); + import ColumnSelectPopover, { ColumnSelectPopoverProps, } from 'src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover'; @@ -116,3 +137,53 @@ test('open with Custom SQL tab selected when there is a custom SQL selected', () expect(getByText('Simple')).toHaveAttribute('aria-selected', 'false'); expect(getByText('Custom SQL')).toHaveAttribute('aria-selected', 'true'); }); + +test('passes keywords as objects to SQLEditorWithValidation for autocomplete', () => { + // Reset mock to capture fresh calls + mockSQLEditorProps.mockClear(); + + const mockColumns = [ + { column_name: 'year', verbose_name: 'Year', type: 'INTEGER' }, + { column_name: 'revenue', verbose_name: null, type: 'DECIMAL' }, + ]; + + renderPopover({ + columns: mockColumns, + editedColumn: { + sqlExpression: 'year + 1', + label: 'test', + expressionType: 'SQL', + }, + getCurrentTab: jest.fn(), + onChange: jest.fn(), + }); + + // Verify SQLEditorWithValidation was called + expect(mockSQLEditorProps).toHaveBeenCalled(); + + // Get the keywords prop passed to SQLEditorWithValidation + const { keywords } = mockSQLEditorProps.mock.calls[0][0]; + + // Verify keywords exist and are not empty + expect(keywords).toBeDefined(); + expect(keywords.length).toBeGreaterThan(0); + + // Verify keywords are objects with required autocomplete properties + // This test will FAIL if someone adds .map(k => k.value) transformation + keywords.forEach((keyword: Record<string, unknown>) => { + expect(typeof keyword).toBe('object'); + expect(keyword).toHaveProperty('name'); + expect(keyword).toHaveProperty('value'); + expect(keyword).toHaveProperty('score'); + expect(keyword).toHaveProperty('meta'); + }); + + // Verify column keywords specifically have docHTML for rich tooltips + const columnKeywords = keywords.filter( + (k: Record<string, unknown>) => k.meta === 'column', + ); + expect(columnKeywords.length).toBe(2); // We passed 2 columns + columnKeywords.forEach((keyword: Record<string, unknown>) => { + expect(keyword).toHaveProperty('docHTML'); + }); +}); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx index 5eade7c64e0..dacc90d8ddd 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx @@ -584,9 +584,7 @@ const ColumnSelectPopover = ({ height={`${height - 120}px`} lineNumbers={false} wordWrap - keywords={keywords.map((k: any) => - typeof k === 'string' ? k : k.value || k.name || k, - )} + keywords={keywords} showValidation expressionType="column" datasourceId={datasource?.id} diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.tsx index 37d8fbfa270..d959f845de4 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.tsx @@ -126,9 +126,7 @@ export default function AdhocFilterEditPopoverSqlTabContent({ > <SQLEditorWithValidation ref={aceEditorRef} - keywords={keywords.map((k: any) => - typeof k === 'string' ? k : k.value || k.name || k, - )} + keywords={keywords} height={`${height - 130}px`} onChange={onSqlExpressionChange} width="100%"
