[Groonga-commit] groonga/grnxx at 4566c35 [master] Add a test for Sorter.

Back to archive index

susumu.yata null+****@clear*****
Wed Jul 30 13:09:48 JST 2014


susumu.yata	2014-07-30 13:09:48 +0900 (Wed, 30 Jul 2014)

  New Revision: 4566c35a70c2da6a527bfe2f96029193021ee054
  https://github.com/groonga/grnxx/commit/4566c35a70c2da6a527bfe2f96029193021ee054

  Message:
    Add a test for Sorter.

  Modified files:
    test/test_grnxx.cpp

  Modified: test/test_grnxx.cpp (+71 -0)
===================================================================
--- test/test_grnxx.cpp    2014-07-30 13:09:21 +0900 (f896304)
+++ test/test_grnxx.cpp    2014-07-30 13:09:48 +0900 (c9ef0c4)
@@ -17,6 +17,7 @@
 */
 #include <cassert>
 #include <iostream>
+#include <random>
 
 #include "grnxx/column.hpp"
 #include "grnxx/cursor.hpp"
@@ -24,7 +25,9 @@
 #include "grnxx/db.hpp"
 #include "grnxx/error.hpp"
 #include "grnxx/expression.hpp"
+#include "grnxx/order.hpp"
 #include "grnxx/record.hpp"
+#include "grnxx/sorter.hpp"
 #include "grnxx/table.hpp"
 
 namespace {
@@ -759,6 +762,73 @@ void test_expression() {
   assert(result_set[1] == 556);
 }
 
+void test_sorter() {
+  grnxx::Error error;
+
+  auto db = grnxx::open_db(&error, "");
+  assert(db);
+
+  auto table = db->create_table(&error, "Table");
+  assert(table);
+
+  auto int_column = table->create_column(&error, "IntColumn",
+                                         grnxx::INT_DATA);
+  assert(int_column);
+
+  std::vector<grnxx::Int> values(1024);
+  std::mt19937_64 mersenne_twister;
+  for (size_t i = 0; i < values.size(); ++i) {
+    grnxx::Int row_id;
+    assert(table->insert_row(&error, grnxx::NULL_ROW_ID,
+                             grnxx::Datum(), &row_id));
+    values[i] = mersenne_twister() % 64;
+    assert(int_column->set(&error, row_id, values[i]));
+  }
+
+  grnxx::RecordSet record_set;
+  auto cursor = table->create_cursor(&error);
+  assert(cursor);
+  assert(cursor->read_all(&error, &record_set) ==
+         static_cast<grnxx::Int>(values.size()));
+  assert(record_set.size() == static_cast<grnxx::Int>(values.size()));
+
+  auto order_set_builder =
+      grnxx::OrderSetBuilder::create(&error, table);
+  assert(order_set_builder);
+
+  auto expression_builder =
+      grnxx::ExpressionBuilder::create(&error, table);
+  assert(expression_builder->push_column(&error, "IntColumn"));
+  auto expression = expression_builder->release(&error);
+  assert(expression);
+  assert(order_set_builder->append(&error, std::move(expression)));
+
+  assert(expression_builder->push_column(&error, "_id"));
+  expression = expression_builder->release(&error);
+  assert(expression);
+  assert(order_set_builder->append(&error, std::move(expression)));
+
+  auto order_set = order_set_builder->release(&error);
+  assert(order_set);
+
+  auto sorter = grnxx::Sorter::create(&error, std::move(order_set));
+  assert(sorter);
+
+  assert(sorter->sort(&error, &record_set));
+  assert(record_set.size() == static_cast<grnxx::Int>(values.size()));
+
+  for (grnxx::Int i = 1; i < record_set.size(); ++i) {
+    grnxx::Int lhs_id = record_set.get_row_id(i - 1) - 1;
+    grnxx::Int rhs_id = record_set.get_row_id(i) - 1;
+    grnxx::Int lhs_value = values[lhs_id];
+    grnxx::Int rhs_value = values[rhs_id];
+    assert(lhs_value <= rhs_value);
+    if (lhs_value == rhs_value) {
+      assert(lhs_id < rhs_id);
+    }
+  }
+}
+
 }  // namespace
 
 int main() {
@@ -767,6 +837,7 @@ int main() {
   test_bitmap();
   test_column();
   test_expression();
+  test_sorter();
 
   return 0;
 }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index