diff --git a/.changeset/early-items-design.md b/.changeset/early-items-design.md new file mode 100644 index 000000000..86bf82478 --- /dev/null +++ b/.changeset/early-items-design.md @@ -0,0 +1,6 @@ +--- +"@hyperdx/common-utils": patch +"@hyperdx/app": patch +--- + +fix: json getKeyValues (useful for autocomplete) diff --git a/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx b/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx index 4c78e4f8c..539746c2e 100644 --- a/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx +++ b/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx @@ -4,7 +4,7 @@ import { renderHook } from '@testing-library/react'; import { LuceneLanguageFormatter } from '../../SearchInputV2'; import { useAutoCompleteOptions } from '../useAutoCompleteOptions'; -import { useAllFields, useGetKeyValues } from '../useMetadata'; +import { useAllFields, useGetKeyValues, useJsonColumns } from '../useMetadata'; if (!globalThis.structuredClone) { globalThis.structuredClone = (obj: any) => { @@ -17,6 +17,7 @@ jest.mock('../useMetadata', () => ({ ...jest.requireActual('../useMetadata.tsx'), useAllFields: jest.fn(), useGetKeyValues: jest.fn(), + useJsonColumns: jest.fn(), })); const luceneFormatter = new LuceneLanguageFormatter(); @@ -60,6 +61,10 @@ describe('useAutoCompleteOptions', () => { (useGetKeyValues as jest.Mock).mockReturnValue({ data: null, }); + + (useJsonColumns as jest.Mock).mockReturnValue({ + data: null, + }); }); it('should return field options with correct lucene formatting', () => { diff --git a/packages/app/src/hooks/useAutoCompleteOptions.tsx b/packages/app/src/hooks/useAutoCompleteOptions.tsx index b0a37a1a6..5a63a4ffb 100644 --- a/packages/app/src/hooks/useAutoCompleteOptions.tsx +++ b/packages/app/src/hooks/useAutoCompleteOptions.tsx @@ -6,8 +6,9 @@ import { deduplicate2dArray, useAllFields, useGetKeyValues, + useJsonColumns, } from '@/hooks/useMetadata'; -import { toArray } from '@/utils'; +import { mergePath, toArray } from '@/utils'; export interface ILanguageFormatter { formatFieldValue: (f: Field) => string; @@ -71,16 +72,21 @@ export function useAutoCompleteOptions( setSearchField(null); } }, [searchField, setSearchField, value, formatter]); + const { data: jsonColumns } = useJsonColumns( + Array.isArray(tableConnections) + ? tableConnections[0] + : (tableConnections ?? { + tableName: '', + databaseName: '', + connectionId: '', + }), + ); const searchKeys = useMemo( () => - searchField - ? [ - searchField.path.length > 1 - ? `${searchField.path[0]}['${searchField.path[1]}']` - : searchField.path[0], - ] + searchField && jsonColumns + ? [mergePath(searchField.path, jsonColumns)] : [], - [searchField], + [searchField, jsonColumns], ); // hooks to get key values diff --git a/packages/app/src/hooks/useMetadata.tsx b/packages/app/src/hooks/useMetadata.tsx index c398be295..f4134a8af 100644 --- a/packages/app/src/hooks/useMetadata.tsx +++ b/packages/app/src/hooks/useMetadata.tsx @@ -48,15 +48,7 @@ export function useColumns( } export function useJsonColumns( - { - databaseName, - tableName, - connectionId, - }: { - databaseName: string; - tableName: string; - connectionId: string; - }, + { databaseName, tableName, connectionId }: TableConnection, options?: Partial>, ) { return useQuery({ diff --git a/packages/common-utils/src/metadata.ts b/packages/common-utils/src/metadata.ts index 44e01e2b1..a0d6f3f90 100644 --- a/packages/common-utils/src/metadata.ts +++ b/packages/common-utils/src/metadata.ts @@ -357,10 +357,7 @@ export class Metadata { ); } keys.push({ - key: key - .split('.') - .map(v => `\`${v}\``) - .join('.'), + key: key, chType: typeArr[0], }); }