[Groonga-commit] groonga/grnxx at 5d9a7be [master] Add tests for AndMerger. (#67)

Back to archive index

susumu.yata null+****@clear*****
Mon Sep 22 16:23:54 JST 2014


susumu.yata	2014-09-22 16:23:54 +0900 (Mon, 22 Sep 2014)

  New Revision: 5d9a7be274f330e57b1fedfaf97da377b0c3ed14
  https://github.com/groonga/grnxx/commit/5d9a7be274f330e57b1fedfaf97da377b0c3ed14

  Message:
    Add tests for AndMerger. (#67)
    
    AND_MERGER and PLUS_MERGER_OPERATOR.

  Added files:
    test/test_merger.cpp
  Modified files:
    .gitignore
    test/Makefile.am

  Modified: .gitignore (+1 -0)
===================================================================
--- .gitignore    2014-09-22 16:07:22 +0900 (b9a24d4)
+++ .gitignore    2014-09-22 16:23:54 +0900 (4d601d6)
@@ -38,6 +38,7 @@ test/test_table
 test/test_column
 test/test_index
 test/test_expression
+test/test_merger
 test/test_sorter
 test/test_pipeline
 test/test_issue_62

  Modified: test/Makefile.am (+4 -0)
===================================================================
--- test/Makefile.am    2014-09-22 16:07:22 +0900 (7961c86)
+++ test/Makefile.am    2014-09-22 16:23:54 +0900 (6eeac8a)
@@ -5,6 +5,7 @@ TESTS =				\
 	test_column		\
 	test_index		\
 	test_expression		\
+	test_merger		\
 	test_sorter		\
 	test_pipeline		\
 	test_issue_62
@@ -29,6 +30,9 @@ test_index_LDADD = $(top_srcdir)/lib/grnxx/libgrnxx.la
 test_expression_SOURCES = test_expression.cpp
 test_expression_LDADD = $(top_srcdir)/lib/grnxx/libgrnxx.la
 
+test_merger_SOURCES = test_merger.cpp
+test_merger_LDADD = $(top_srcdir)/lib/grnxx/libgrnxx.la
+
 test_sorter_SOURCES = test_sorter.cpp
 test_sorter_LDADD = $(top_srcdir)/lib/grnxx/libgrnxx.la
 

  Added: test/test_merger.cpp (+217 -0) 100644
===================================================================
--- /dev/null
+++ test/test_merger.cpp    2014-09-22 16:23:54 +0900 (7772683)
@@ -0,0 +1,217 @@
+/*
+  Copyright (C) 2012-2014  Brazil, Inc.
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+#include <cassert>
+#include <iostream>
+#include <random>
+
+#include "grnxx/column.hpp"
+#include "grnxx/cursor.hpp"
+#include "grnxx/db.hpp"
+#include "grnxx/expression.hpp"
+#include "grnxx/table.hpp"
+#include "grnxx/merger.hpp"
+
+struct {
+  grnxx::unique_ptr<grnxx::DB> db;
+  grnxx::Table *table;
+  grnxx::Array<grnxx::Bool> bool_values;
+  grnxx::Array<grnxx::Bool> bool2_values;
+  grnxx::Array<grnxx::Float> float_values;
+  grnxx::Array<grnxx::Float> float2_values;
+} test;
+
+void init_test() {
+  grnxx::Error error;
+
+  // Create a database with the default options.
+  test.db = grnxx::open_db(&error, "");
+  assert(test.db);
+
+  // Create a table with the default options.
+  test.table = test.db->create_table(&error, "Table");
+  assert(test.table);
+
+  // Create columns for Bool and Float values.
+  grnxx::DataType data_type = grnxx::BOOL_DATA;
+  auto bool_column = test.table->create_column(&error, "Bool", data_type);
+  assert(bool_column);
+  auto bool2_column = test.table->create_column(&error, "Bool2", data_type);
+  assert(bool2_column);
+
+  data_type = grnxx::FLOAT_DATA;
+  auto float_column = test.table->create_column(&error, "Float", data_type);
+  assert(float_column);
+  auto float2_column = test.table->create_column(&error, "Float2", data_type);
+  assert(float2_column);
+
+  // Generate random values.
+  // Bool: true or false.
+  constexpr grnxx::Int NUM_ROWS = 1 << 16;
+  std::mt19937_64 mersenne_twister;
+  assert(test.bool_values.resize(&error, NUM_ROWS + 1));
+  assert(test.bool2_values.resize(&error, NUM_ROWS + 1));
+  assert(test.float_values.resize(&error, NUM_ROWS + 1));
+  assert(test.float2_values.resize(&error, NUM_ROWS + 1));
+  for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+    test.bool_values.set(i, (mersenne_twister() & 1) != 0);
+    test.bool2_values.set(i, (mersenne_twister() & 1) != 0);
+    grnxx::Float float_value =
+        1.0 * mersenne_twister() / mersenne_twister.max();
+    test.float_values.set(i, float_value);
+    float_value = 1.0 * mersenne_twister() / mersenne_twister.max();
+    test.float2_values.set(i, float_value);
+  }
+
+  // Store generated values into columns.
+  for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+    grnxx::Int row_id;
+    assert(test.table->insert_row(&error, grnxx::NULL_ROW_ID,
+                                  grnxx::Datum(), &row_id));
+    assert(bool_column->set(&error, row_id, test.bool_values[i]));
+    assert(bool2_column->set(&error, row_id, test.bool2_values[i]));
+    assert(float_column->set(&error, row_id, test.float_values[i]));
+    assert(float2_column->set(&error, row_id, test.float2_values[i]));
+  }
+}
+
+void test_and() {
+  grnxx::Error error;
+
+  // Create cursors to read all the records.
+  auto cursor = test.table->create_cursor(&error);
+  assert(cursor);
+  auto cursor2 = test.table->create_cursor(&error);
+  assert(cursor2);
+
+  // Create expressions to read values.
+  auto expression_builder =
+      grnxx::ExpressionBuilder::create(&error, test.table);
+  assert(expression_builder);
+  assert(expression_builder->push_column(&error, "Bool"));
+  auto expression = expression_builder->release(&error);
+  assert(expression);
+  assert(expression_builder->push_column(&error, "Bool2"));
+  auto expression2 = expression_builder->release(&error);
+  assert(expression2);
+
+  // Create input records.
+  grnxx::Array<grnxx::Record> records;
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+  assert(expression->filter(&error, &records));
+  grnxx::Array<grnxx::Record> records2;
+  assert(cursor2->read_all(&error, &records2) == test.table->num_rows());
+  assert(expression2->filter(&error, &records2));
+
+  // Merge records.
+  auto merger = grnxx::Merger::create(&error);
+  assert(merger);
+  grnxx::Array<grnxx::Record> result_records;
+  assert(merger->merge(&error, &records, &records2, &result_records));
+
+  for (grnxx::Int i = 0; i < result_records.size(); ++i) {
+    grnxx::Int row_id = result_records.get_row_id(i);
+    assert(test.bool_values[row_id] && test.bool2_values[row_id]);
+  }
+
+  grnxx::Int count = 0;
+  for (grnxx::Int i = 1; i <= test.table->max_row_id(); ++i) {
+    if (test.bool_values[i] && test.bool2_values[i]) {
+      assert(result_records.get_row_id(count) == i);
+      ++count;
+    }
+  }
+  assert(count == result_records.size());
+}
+
+void test_plus() {
+  grnxx::Error error;
+
+  // Create the first input records.
+  auto cursor = test.table->create_cursor(&error);
+  assert(cursor);
+
+  auto expression_builder =
+      grnxx::ExpressionBuilder::create(&error, test.table);
+  assert(expression_builder);
+  assert(expression_builder->push_column(&error, "Bool"));
+  auto expression = expression_builder->release(&error);
+  assert(expression);
+
+  grnxx::Array<grnxx::Record> records;
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+  assert(expression->filter(&error, &records));
+
+  assert(expression_builder->push_column(&error, "Float"));
+  expression = expression_builder->release(&error);
+  assert(expression);
+
+  assert(expression->adjust(&error, &records));
+
+  // Create the second input records.
+  cursor = test.table->create_cursor(&error);
+  assert(cursor);
+
+  assert(expression_builder->push_column(&error, "Bool2"));
+  expression = expression_builder->release(&error);
+  assert(expression);
+
+  grnxx::Array<grnxx::Record> records2;
+  assert(cursor->read_all(&error, &records2) == test.table->num_rows());
+  assert(expression->filter(&error, &records2));
+
+  assert(expression_builder->push_column(&error, "Float2"));
+  expression = expression_builder->release(&error);
+  assert(expression);
+
+  assert(expression->adjust(&error, &records2));
+
+  // Merge records.
+  grnxx::MergerOptions options;
+  options.type = grnxx::AND_MERGER;
+  options.operator_type = grnxx::PLUS_MERGER_OPERATOR;
+  auto merger = grnxx::Merger::create(&error);
+  assert(merger);
+  grnxx::Array<grnxx::Record> result_records;
+  assert(merger->merge(&error, &records, &records2, &result_records));
+
+  for (grnxx::Int i = 0; i < result_records.size(); ++i) {
+    grnxx::Int row_id = result_records.get_row_id(i);
+    grnxx::Float score = result_records.get_score(i);
+    assert(test.bool_values[row_id] && test.bool2_values[row_id]);
+    assert(score == (test.float_values[row_id] + test.float2_values[row_id]));
+  }
+
+  grnxx::Int count = 0;
+  for (grnxx::Int i = 1; i <= test.table->max_row_id(); ++i) {
+    if (test.bool_values[i] && test.bool2_values[i]) {
+      assert(result_records.get_row_id(count) == i);
+      ++count;
+    }
+  }
+  assert(count == result_records.size());
+}
+
+int main() {
+  init_test();
+
+  test_and();
+
+  test_plus();
+
+  return 0;
+}
-------------- next part --------------
HTML����������������������������...
다운로드 



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