From 7ceccc130a8edfbff9a7dd489d8db05507b13898 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Thu, 19 Jan 2023 18:32:13 +0530 Subject: [PATCH] fix(api): set sort order of nulls re #4881 Signed-off-by: Pranav C --- .../lib/db/sql-data-mapper/lib/sql/sortV2.ts | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/sortV2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/sortV2.ts index 0e3e33a40d..1e2e5e27ce 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/sortV2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/sortV2.ts @@ -29,6 +29,9 @@ export default async function sortV2( const column = await sort.getColumn(); if (!column) continue; const model = await column.getModel(); + + const nulls = sort.direction === 'desc' ? 'LAST' : 'FIRST'; + switch (column.uidt) { case UITypes.Rollup: { @@ -39,7 +42,7 @@ export default async function sortV2( }) ).builder; - qb.orderBy(builder, sort.direction || 'asc'); + qb.orderBy(builder, sort.direction || 'asc', nulls); } break; case UITypes.Formula: @@ -55,7 +58,7 @@ export default async function sortV2( column ) ).builder; - qb.orderBy(builder, sort.direction || 'asc'); + qb.orderBy(builder, sort.direction || 'asc', nulls); } break; case UITypes.Lookup: @@ -178,7 +181,7 @@ export default async function sortV2( break; } - qb.orderBy(selectQb, sort.direction || 'asc'); + qb.orderBy(selectQb, sort.direction || 'asc', nulls); } } break; @@ -206,7 +209,7 @@ export default async function sortV2( ]) ); - qb.orderBy(selectQb, sort.direction || 'asc'); + qb.orderBy(selectQb, sort.direction || 'asc', nulls); } break; case UITypes.SingleSelect: { @@ -214,17 +217,23 @@ export default async function sortV2( if (clientType === 'mysql' || clientType === 'mysql2') { qb.orderBy( sanitize(knex.raw('CONCAT(??)', [column.column_name])), - sort.direction || 'asc' + sort.direction || 'asc', + nulls ); } else if (clientType === 'mssql') { qb.orderBy( sanitize( knex.raw('CAST(?? AS VARCHAR(MAX))', [column.column_name]) ), - sort.direction || 'asc' + sort.direction || 'asc', + nulls ); } else { - qb.orderBy(sanitize(column.column_name), sort.direction || 'asc'); + qb.orderBy( + sanitize(column.column_name), + sort.direction || 'asc', + nulls + ); } break; } @@ -233,22 +242,32 @@ export default async function sortV2( if (clientType === 'mysql' || clientType === 'mysql2') { qb.orderBy( sanitize(knex.raw('CONCAT(??)', [column.column_name])), - sort.direction || 'asc' + sort.direction || 'asc', + nulls ); } else if (clientType === 'mssql') { qb.orderBy( sanitize( knex.raw('CAST(?? AS VARCHAR(MAX))', [column.column_name]) ), - sort.direction || 'asc' + sort.direction || 'asc', + nulls ); } else { - qb.orderBy(sanitize(column.column_name), sort.direction || 'asc'); + qb.orderBy( + sanitize(column.column_name), + sort.direction || 'asc', + nulls + ); } break; } default: - qb.orderBy(sanitize(column.column_name), sort.direction || 'asc'); + qb.orderBy( + sanitize(column.column_name), + sort.direction || 'asc', + nulls + ); break; } }