ResultSet.cpp 1.1 KB

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