[Groonga-commit] groonga/grnxx at b78f235 [new_data_types] Add a test for sortings records in score order. (#119)

アーカイブの一覧に戻る

susumu.yata null+****@clear*****
Wed Nov 26 18:40:04 JST 2014


susumu.yata	2014-11-26 18:40:04 +0900 (Wed, 26 Nov 2014)

  New Revision: b78f23595bb9dad45b35acdd965781f5dac09ca5
  https://github.com/groonga/grnxx/commit/b78f23595bb9dad45b35acdd965781f5dac09ca5

  Message:
    Add a test for sortings records in score order. (#119)

  Modified files:
    test/test_sorter.cpp

  Modified: test/test_sorter.cpp (+93 -0)
===================================================================
--- test/test_sorter.cpp    2014-11-26 18:39:40 +0900 (c5cd515)
+++ test/test_sorter.cpp    2014-11-26 18:40:04 +0900 (a185367)
@@ -127,6 +127,98 @@ grnxx::Array<grnxx::Record> create_input_records() {
   return records;
 }
 
+void test_score() {
+  // Create a cursor which reads all the records.
+  auto records = create_input_records();
+
+  // Create an object for building expressions.
+  auto expression_builder = grnxx::ExpressionBuilder::create(test.table);
+
+  expression_builder->push_column("Float");
+  auto expression = expression_builder->release();
+  expression->adjust(&records);
+
+  // Create a regular sorter.
+  grnxx::Array<grnxx::SorterOrder> orders;
+  orders.resize(1);
+  expression_builder->push_score();
+  expression = expression_builder->release();
+  orders[0].expression = std::move(expression);
+  orders[0].type = grnxx::SORTER_REGULAR_ORDER;
+  auto sorter = grnxx::Sorter::create(std::move(orders));
+
+  sorter->sort(&records);
+  for (size_t i = 0; i < records.size(); ++i) {
+    size_t row_id = records[i].row_id.raw();
+    grnxx::Float value = test.float_values[row_id];
+    assert(records[i].score.match(value));
+  }
+  for (size_t i = 1; i < records.size(); ++i) {
+    grnxx::Float lhs_score = records[i - 1].score;
+    grnxx::Float rhs_score = records[i].score;
+    if (lhs_score.is_na()) {
+      assert(rhs_score.is_na());
+    } else {
+      assert(rhs_score.is_na() || (lhs_score <= rhs_score).is_true());
+    }
+  }
+
+  // Create a reverse sorter.
+  orders.resize(1);
+  expression_builder->push_score();
+  expression = expression_builder->release();
+  orders[0].expression = std::move(expression);
+  orders[0].type = grnxx::SORTER_REVERSE_ORDER;
+  sorter = grnxx::Sorter::create(std::move(orders));
+
+  sorter->sort(&records);
+  for (size_t i = 0; i < records.size(); ++i) {
+    size_t row_id = records[i].row_id.raw();
+    grnxx::Float value = test.float_values[row_id];
+    assert(records[i].score.match(value));
+  }
+  for (size_t i = 1; i < records.size(); ++i) {
+    grnxx::Float lhs_score = records[i - 1].score;
+    grnxx::Float rhs_score = records[i].score;
+    if (lhs_score.is_na()) {
+      assert(rhs_score.is_na());
+    } else {
+      assert(rhs_score.is_na() || (lhs_score >= rhs_score).is_true());
+    }
+  }
+
+  // Create a multiple order sorter.
+  orders.resize(2);
+  expression_builder->push_score();
+  expression = expression_builder->release();
+  orders[0].expression = std::move(expression);
+  orders[0].type = grnxx::SORTER_REGULAR_ORDER;
+  expression_builder->push_row_id();
+  expression = expression_builder->release();
+  orders[1].expression = std::move(expression);
+  orders[1].type = grnxx::SORTER_REGULAR_ORDER;
+  sorter = grnxx::Sorter::create(std::move(orders));
+
+  sorter->sort(&records);
+  for (size_t i = 0; i < records.size(); ++i) {
+    size_t row_id = records[i].row_id.raw();
+    grnxx::Float value = test.float_values[row_id];
+    assert(records[i].score.match(value));
+  }
+  for (size_t i = 1; i < records.size(); ++i) {
+    grnxx::Float lhs_score = records[i - 1].score;
+    grnxx::Float rhs_score = records[i].score;
+    if (lhs_score.is_na()) {
+      assert(rhs_score.is_na());
+    } else {
+      assert(rhs_score.is_na() || (lhs_score <= rhs_score).is_true());
+    }
+    if (lhs_score.match(rhs_score)) {
+      assert(records[i - 1].row_id.raw() < records[i].row_id.raw());
+    }
+  }
+}
+
 void test_bool() {
   // Create a cursor which reads all the records.
   auto records = create_input_records();
@@ -502,6 +594,7 @@ void test_composite() {
 
 int main() {
   init_test();
+  test_score();
   test_bool();
   test_int();
   test_float();
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る