mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 17:35:10 +03:00
This commit is contained in:
1 parent
c3048a0ea7
commit
be3134b1ac
2 files changed
+47
-4
No files matched your search
+4
-4
@@ -93,7 +93,7 @@ export const revertSpreadsheet = (headers: string[], rows: any[]) => {
|
||||
return Papa.unparse(rows, { columns: headers })
|
||||
}
|
||||
|
||||
const inferColumnType = (column: string, rows: object[]) => {
|
||||
export const inferColumnType = (column: string, rows: object[]) => {
|
||||
// General strategy is to check the first row first, before checking across all the rows
|
||||
// to ensure uniformity in data type. Thinking we do this as an optimization instead of
|
||||
// checking all the rows up front.
|
||||
@@ -105,7 +105,7 @@ const inferColumnType = (column: string, rows: object[]) => {
|
||||
const columnDataAcrossRows = rows.map((row: object) => (row as any)[column])
|
||||
|
||||
// Unable to infer any type as there's no data, default to text
|
||||
if (!columnData) {
|
||||
if (columnData === undefined || columnData === null) {
|
||||
return 'text'
|
||||
}
|
||||
|
||||
@@ -121,9 +121,9 @@ const inferColumnType = (column: string, rows: object[]) => {
|
||||
}
|
||||
|
||||
// Infer boolean type
|
||||
if (includes(['true', 'false'], columnData.toLowerCase())) {
|
||||
if (includes(['true', 'false'], columnData.toString().toLowerCase())) {
|
||||
const isAllBoolean = columnDataAcrossRows.every((item: any) =>
|
||||
includes(['true', 'false'], item.toLowerCase())
|
||||
includes(['true', 'false'], item.toString().toLowerCase())
|
||||
)
|
||||
if (isAllBoolean) {
|
||||
return 'boolean'
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import { inferColumnType } from 'components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/SpreadsheetImport/SpreadsheetImport.utils'
|
||||
|
||||
describe('SpreadsheedImport.utils: inferColumnType', () => {
|
||||
test('should default column type to text if no rows to infer from', () => {
|
||||
const mockData = []
|
||||
const type = inferColumnType('id', mockData)
|
||||
expect(type).toBe('text')
|
||||
})
|
||||
test('should default column type to text if the first row has no data to infer from', () => {
|
||||
const mockData = [{ name: 'bob', age: '42' }]
|
||||
const type = inferColumnType('id', mockData)
|
||||
expect(type).toBe('text')
|
||||
})
|
||||
test('should default column type to text if the first row data value is null', () => {
|
||||
const mockData = [{ id: null, name: 'bob', age: '42' }]
|
||||
const type = inferColumnType('id', mockData)
|
||||
expect(type).toBe('text')
|
||||
})
|
||||
test('should infer integer types correctly', () => {
|
||||
const mockData = [{ name: 'bob', age: '42' }]
|
||||
const type = inferColumnType('age', mockData)
|
||||
expect(type).toBe('int8')
|
||||
})
|
||||
test('should infer float types correctly', () => {
|
||||
const mockData = [{ name: 'bob', height: '161.72' }]
|
||||
const type = inferColumnType('height', mockData)
|
||||
expect(type).toBe('float8')
|
||||
})
|
||||
test('should infer boolean types correctly', () => {
|
||||
const mockData1 = [{ name: 'bob', height: '161.72', isWorking: 'true' }]
|
||||
const type1 = inferColumnType('isWorking', mockData1)
|
||||
expect(type1).toBe('boolean')
|
||||
|
||||
const mockData2 = [{ name: 'bob', height: '161.72', isRetired: 'false' }]
|
||||
const type2 = inferColumnType('isRetired', mockData2)
|
||||
expect(type2).toBe('boolean')
|
||||
})
|
||||
test('should infer objects as jsonb types correctly', () => {
|
||||
const mockData = [{ name: 'bob', metadata: '{}' }]
|
||||
const type = inferColumnType('metadata', mockData)
|
||||
expect(type).toBe('jsonb')
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user