Serenity Operating System
at master 53 lines 1.2 kB view raw
1/* 2 * Copyright (c) 2022, Jan de Visser <jan@de-visser.net> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibSQL/ResultSet.h> 8 9namespace SQL { 10 11size_t ResultSet::binary_search(Tuple const& sort_key, size_t low, size_t high) 12{ 13 if (high <= low) { 14 auto compare = sort_key.compare(at(low).sort_key); 15 return (compare > 0) ? low + 1 : low; 16 } 17 18 auto mid = (low + high) / 2; 19 auto compare = sort_key.compare(at(mid).sort_key); 20 if (compare == 0) 21 return mid + 1; 22 23 if (compare > 0) 24 return binary_search(sort_key, mid + 1, high); 25 return binary_search(sort_key, low, mid); 26} 27 28void ResultSet::insert_row(Tuple const& row, Tuple const& sort_key) 29{ 30 if ((sort_key.size() == 0) || is_empty()) { 31 empend(row, sort_key); 32 return; 33 } 34 auto ix = binary_search(sort_key, 0, size() - 1); 35 insert(ix, ResultRow { row, sort_key }); 36} 37 38void ResultSet::limit(size_t offset, size_t limit) 39{ 40 if (offset > 0) { 41 if (offset > size()) { 42 clear(); 43 return; 44 } 45 46 remove(0, offset); 47 } 48 49 if (size() > limit) 50 remove(limit, size() - limit); 51} 52 53}