[Groonga-commit] groonga/grnxx at bdd0576 [new_data_types] Enable additional tests for Expression.

Back to archive index

susumu.yata null+****@clear*****
Wed Nov 19 17:00:13 JST 2014


susumu.yata	2014-11-19 17:00:13 +0900 (Wed, 19 Nov 2014)

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

  Message:
    Enable additional tests for Expression.

  Modified files:
    test/test_expression.cpp

  Modified: test/test_expression.cpp (+173 -196)
===================================================================
--- test/test_expression.cpp    2014-11-19 16:42:43 +0900 (8cf78fd)
+++ test/test_expression.cpp    2014-11-19 17:00:13 +0900 (0719fc2)
@@ -2626,194 +2626,171 @@ void test_subexpression() {
   }
 }
 
-//void test_sequential_filter() {
-//  grnxx::Error error;
-
-//  // Create an object for building expressions.
-//  auto builder = grnxx::ExpressionBuilder::create(&error, test.table);
-//  assert(builder);
-
-//  // Test an expression ((Int + Int2) < 100).
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_column(&error, "Int2"));
-//  assert(builder->push_operator(&error, grnxx::PLUS_OPERATOR));
-//  assert(builder->push_constant(&error, grnxx::Int(100)));
-//  assert(builder->push_operator(&error, grnxx::LESS_OPERATOR));
-//  auto expression = builder->release(&error);
-//  assert(expression);
-
-//  auto cursor = test.table->create_cursor(&error);
-//  assert(cursor);
-
-//  // Read and filter records block by block.
-//  grnxx::Array<grnxx::Record> records;
-//  grnxx::Int offset = 0;
-//  for ( ; ; ) {
-//    auto result = cursor->read(&error, 1024, &records);
-//    assert(result.is_ok);
-//    assert((offset + result.count) == records.size());
-//    if (result.count == 0) {
-//      break;
-//    }
-//    assert(expression->filter(&error, &records, offset));
-//    offset = records.size();
-//  }
-
-//  grnxx::Int count = 0;
-//  for (grnxx::Int i = 1; i < test.bool_values.size(); ++i) {
-//    if ((test.int_values[i] + test.int2_values[i]) < 100) {
-//      assert(records.get_row_id(count) == i);
-//      ++count;
-//    }
-//  }
-//  assert(records.size() == count);
-//}
-
-//void test_sequential_adjust() {
-//  grnxx::Error error;
-
-//  // Create an object for building expressions.
-//  auto builder = grnxx::ExpressionBuilder::create(&error, test.table);
-//  assert(builder);
-
-//  // Test an expression (Float(Int) + Float).
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_operator(&error, grnxx::TO_FLOAT_OPERATOR));
-//  assert(builder->push_column(&error, "Float"));
-//  assert(builder->push_operator(&error, grnxx::PLUS_OPERATOR));
-//  auto expression = builder->release(&error);
-//  assert(expression);
-
-//  auto cursor = test.table->create_cursor(&error);
-//  assert(cursor);
-
-//  // Read and adjust records block by block.
-//  grnxx::Array<grnxx::Record> records;
-//  grnxx::Int offset = 0;
-//  for ( ; ; ) {
-//    auto result = cursor->read(&error, 1024, &records);
-//    assert(result.is_ok);
-//    assert((offset + result.count) == records.size());
-//    if (result.count == 0) {
-//      break;
-//    }
-//    assert(expression->adjust(&error, &records, offset));
-//    offset += result.count;
-//  }
-
-//  assert(records.size() == test.table->num_rows());
-//  for (grnxx::Int i = 0; i < records.size(); ++i) {
-//    grnxx::Int row_id = records.get_row_id(i);
-//    assert(records.get_score(i) ==
-//           (test.int_values[row_id] + test.float_values[row_id]));
-//  }
-//}
-
-//void test_sequential_evaluate() {
-//  grnxx::Error error;
-
-//  // Create an object for building expressions.
-//  auto builder = grnxx::ExpressionBuilder::create(&error, test.table);
-//  assert(builder);
-
-//  // Test an expression (Int + Int(Float * 100.0)).
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_column(&error, "Float"));
-//  assert(builder->push_constant(&error, 100.0));
-//  assert(builder->push_operator(&error, grnxx::MULTIPLICATION_OPERATOR));
-//  assert(builder->push_operator(&error, grnxx::TO_INT_OPERATOR));
-//  assert(builder->push_operator(&error, grnxx::PLUS_OPERATOR));
-//  auto expression = builder->release(&error);
-//  assert(expression);
-
-//  auto cursor = test.table->create_cursor(&error);
-//  assert(cursor);
-
-//  // Read and evaluate records block by block.
-//  grnxx::Array<grnxx::Record> records;
-//  grnxx::Array<grnxx::Int> results;
-//  grnxx::Int offset = 0;
-//  for ( ; ; ) {
-//    auto result = cursor->read(&error, 1024, &records);
-//    assert(result.is_ok);
-//    assert((offset + result.count) == records.size());
-//    if (result.count == 0) {
-//      break;
-//    }
-//    assert(results.resize(&error, offset + result.count));
-//    assert(expression->evaluate(&error, records.ref(offset),
-//                                results.ref(offset)));
-//    offset += result.count;
-//  }
-
-//  assert(records.size() == test.table->num_rows());
-//  for (grnxx::Int i = 0; i < records.size(); ++i) {
-//    grnxx::Int row_id = records.get_row_id(i);
-//    assert(results[i] ==
-//           (test.int_values[row_id] +
-//            static_cast<grnxx::Int>(test.float_values[row_id] * 100.0)));
-//  }
-//}
-
-//void test_partial_filter() {
-//  grnxx::Error error;
-
-//  // Create an object for building expressions.
-//  auto builder = grnxx::ExpressionBuilder::create(&error, test.table);
-//  assert(builder);
-
-//  // Test an expression ((Float * Float2) > 0.25).
-//  assert(builder->push_column(&error, "Float"));
-//  assert(builder->push_column(&error, "Float2"));
-//  assert(builder->push_operator(&error, grnxx::MULTIPLICATION_OPERATOR));
-//  assert(builder->push_constant(&error, grnxx::Float(0.25)));
-//  assert(builder->push_operator(&error, grnxx::GREATER_OPERATOR));
-//  auto expression = builder->release(&error);
-//  assert(expression);
-
-//  // Read all records.
-//  auto records = create_input_records();
-
-//  // Extract a part of true records.
-//  constexpr grnxx::Int OFFSET = 12345;
-//  constexpr grnxx::Int LIMIT = 5000;
-//  assert(expression->filter(&error, &records, 0, OFFSET, LIMIT));
-//  assert(records.size() == 5000);
-//  grnxx::Int count = 0;
-//  for (grnxx::Int i = 1; i < test.bool_values.size(); ++i) {
-//    if ((test.float_values[i] * test.float2_values[i]) > 0.25) {
-//      if ((count >= OFFSET) && (count < (OFFSET + LIMIT))) {
-//        assert(records.get_row_id(count - OFFSET) == i);
-//      }
-//      ++count;
-//    }
-//  }
-//}
-
-//void test_error() {
-//  grnxx::Error error;
-
-//  // Create an object for building expressions.
-//  auto builder = grnxx::ExpressionBuilder::create(&error, test.table);
-//  assert(builder);
-
-//  // Test an invalid expression (Int * Text).
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_column(&error, "Text"));
-//  assert(!builder->push_operator(&error, grnxx::MULTIPLICATION_OPERATOR));
-
-//  // Additional operations must fail.
-//  assert(!builder->push_constant(&error, grnxx::Text("ABC")));
-//  assert(!builder->push_column(&error, "Float"));
-
-//  // Clear the broken status.
-//  builder->clear();
-
-//  // Test a valid expression (Int + Int).
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_column(&error, "Int"));
-//  assert(builder->push_operator(&error, grnxx::PLUS_OPERATOR));
-//}
+void test_sequential_filter() {
+  // Create an object for building expressions.
+  auto builder = grnxx::ExpressionBuilder::create(test.table);
+
+  // Test an expression ((Int + Int2) < 100).
+  builder->push_column("Int");
+  builder->push_column("Int2");
+  builder->push_operator(grnxx::PLUS_OPERATOR);
+  builder->push_constant(grnxx::Int(100));
+  builder->push_operator(grnxx::LESS_OPERATOR);
+  auto expression = builder->release();
+
+  auto cursor = test.table->create_cursor();
+
+  // Read and filter records block by block.
+  grnxx::Array<grnxx::Record> records;
+  size_t offset = 0;
+  for ( ; ; ) {
+    size_t count = cursor->read(1024, &records);
+    assert((offset + count) == records.size());
+    if (count == 0) {
+      break;
+    }
+    expression->filter(&records, offset);
+    offset = records.size();
+  }
+
+  size_t count = 0;
+  for (size_t i = 0; i < test.bool_values.size(); ++i) {
+    grnxx::Int sum = test.int_values[i] + test.int2_values[i];
+    if ((sum < grnxx::Int(100)).is_true()) {
+      assert(records[count].row_id.match(grnxx::Int(i)));
+      ++count;
+    }
+  }
+  assert(records.size() == count);
+}
+
+void test_sequential_adjust() {
+  // Create an object for building expressions.
+  auto builder = grnxx::ExpressionBuilder::create(test.table);
+
+  // Test an expression (Float(Int) + Float).
+  builder->push_column("Int");
+  builder->push_operator(grnxx::TO_FLOAT_OPERATOR);
+  builder->push_column("Float");
+  builder->push_operator(grnxx::PLUS_OPERATOR);
+  auto expression = builder->release();
+
+  auto cursor = test.table->create_cursor();
+
+  // Read and adjust records block by block.
+  grnxx::Array<grnxx::Record> records;
+  size_t offset = 0;
+  for ( ; ; ) {
+    size_t count = cursor->read(1024, &records);
+    assert((offset + count) == records.size());
+    if (count == 0) {
+      break;
+    }
+    expression->adjust(&records, offset);
+    offset += count;
+  }
+
+  assert(records.size() == test.table->num_rows());
+  for (size_t i = 0; i < records.size(); ++i) {
+    size_t row_id = records[i].row_id.value();
+    assert(records[i].score.match(test.int_values[row_id].to_float() +
+                                  test.float_values[row_id]));
+  }
+}
+
+void test_sequential_evaluate() {
+  // Create an object for building expressions.
+  auto builder = grnxx::ExpressionBuilder::create(test.table);
+
+  // Test an expression (Int + Int(Float * 100.0)).
+  builder->push_column("Int");
+  builder->push_column("Float");
+  builder->push_constant(grnxx::Float(100.0));
+  builder->push_operator(grnxx::MULTIPLICATION_OPERATOR);
+  builder->push_operator(grnxx::TO_INT_OPERATOR);
+  builder->push_operator(grnxx::PLUS_OPERATOR);
+  auto expression = builder->release();
+
+  auto cursor = test.table->create_cursor();
+
+  // Read and evaluate records block by block.
+  grnxx::Array<grnxx::Record> records;
+  grnxx::Array<grnxx::Int> results;
+  size_t offset = 0;
+  for ( ; ; ) {
+    size_t count = cursor->read(1024, &records);
+    assert((offset + count) == records.size());
+    if (count == 0) {
+      break;
+    }
+    results.resize(offset + count);
+    expression->evaluate(records.cref(offset), results.ref(offset));
+    offset += count;
+  }
+
+  assert(records.size() == test.table->num_rows());
+  for (size_t i = 0; i < records.size(); ++i) {
+    size_t row_id = records[i].row_id.value();
+    assert(results[i].match(
+           (test.int_values[row_id] +
+            (test.float_values[row_id] * grnxx::Float(100.0)).to_int())));
+  }
+}
+
+void test_partial_filter() {
+  // Create an object for building expressions.
+  auto builder = grnxx::ExpressionBuilder::create(test.table);
+
+  // Test an expression ((Float * Float2) > 0.25).
+  builder->push_column("Float");
+  builder->push_column("Float2");
+  builder->push_operator(grnxx::MULTIPLICATION_OPERATOR);
+  builder->push_constant(grnxx::Float(0.25));
+  builder->push_operator(grnxx::GREATER_OPERATOR);
+  auto expression = builder->release();
+
+  // Read all records.
+  auto records = create_input_records();
+
+  // Extract a part of true records.
+  constexpr size_t OFFSET = 12345;
+  constexpr size_t LIMIT = 5000;
+  expression->filter(&records, 0, OFFSET, LIMIT);
+  assert(records.size() == 5000);
+  size_t count = 0;
+  for (size_t i = 1; i < test.bool_values.size(); ++i) {
+    grnxx::Float product = test.float_values[i] * test.float2_values[i];
+    if ((product > grnxx::Float(0.25)).is_true()) {
+      if ((count >= OFFSET) && (count < (OFFSET + LIMIT))) {
+        assert(records[count - OFFSET].row_id.match(grnxx::Int(i)));
+      }
+      ++count;
+    }
+  }
+}
+
+void test_error() {
+  // Create an object for building expressions.
+  auto builder = grnxx::ExpressionBuilder::create(test.table);
+
+  // Test an invalid expression (Int * Text).
+  try {
+    builder->push_column("Int");
+    builder->push_column("Text");
+    builder->push_operator(grnxx::MULTIPLICATION_OPERATOR);
+    assert(false);
+  } catch (...) {
+    // OK.
+  }
+
+  // Clear the broken builder.
+  builder->clear();
+
+  // Test a valid expression (Int + Int).
+  builder->push_column("Int");
+  builder->push_column("Int");
+  builder->push_operator(grnxx::PLUS_OPERATOR);
+}
 
 int main() {
   init_test();
@@ -2854,16 +2831,16 @@ int main() {
   // Subexpression.
   test_subexpression();
 
-//  // Test sequential operations.
-//  test_sequential_filter();
-//  test_sequential_adjust();
-//  test_sequential_evaluate();
+  // Test sequential operations.
+  test_sequential_filter();
+  test_sequential_adjust();
+  test_sequential_evaluate();
 
-//  // Test partial filtering.
-//  test_partial_filter();
+  // Test partial filtering.
+  test_partial_filter();
 
-//  // Test error.
-//  test_error();
+  // Test error.
+  test_error();
 
   return 0;
 }
-------------- next part --------------
HTML����������������������������...
下載 



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