Lua stable multi-key sorter with nil last
Lua
local function sort_records(rows, keys)
local deco = {}
for i, row in ipairs(rows) do deco[i] = { row = row, pos = i } end
local function cmp(a, b)
for _, key in ipairs(keys) do
local va, vb = a.row[key], b.row[key] -- nil sorts last
if va == nil and vb ~= nil then return false end
if vb == nil and va ~= nil then return true end
if va ~= vb then return va < vb end
end
return a.pos < b.pos
end
table.sort(deco, cmp)
for i, d in ipairs(deco) do rows[i] = d.row end
return rows
end
return sort_records