[Groonga-commit] groonga/grnxx at d3cc9c2 [master] Add tests for Vector<Text>.

Back to archive index

susumu.yata null+****@clear*****
Tue Sep 2 17:49:13 JST 2014


susumu.yata	2014-09-02 17:49:13 +0900 (Tue, 02 Sep 2014)

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

  Message:
    Add tests for Vector<Text>.

  Modified files:
    test/test_column.cpp
    test/test_expression.cpp

  Modified: test/test_column.cpp (+23 -0)
===================================================================
--- test/test_column.cpp    2014-09-02 17:49:01 +0900 (d49b619)
+++ test/test_column.cpp    2014-09-02 17:49:13 +0900 (0b31091)
@@ -140,6 +140,17 @@ void test_column() {
   assert(!geo_point_vector_column->has_key_attribute());
   assert(geo_point_vector_column->num_indexes() == 0);
 
+  // Create a column named "TextVectorColumn".
+  // The column stores Text values.
+  auto text_vector_column = table->create_column(&error, "TextVectorColumn",
+                                                 grnxx::TEXT_VECTOR_DATA);
+  assert(text_vector_column);
+  assert(text_vector_column->table() == table);
+  assert(text_vector_column->name() == "TextVectorColumn");
+  assert(text_vector_column->data_type() == grnxx::TEXT_VECTOR_DATA);
+  assert(!text_vector_column->has_key_attribute());
+  assert(text_vector_column->num_indexes() == 0);
+
   grnxx::Datum datum;
 
   // Check that the default values are stored.
@@ -179,6 +190,10 @@ void test_column() {
   assert(datum.type() == grnxx::GEO_POINT_VECTOR_DATA);
   assert(datum.force_geo_point_vector() == grnxx::GeoPointVector(nullptr, 0));
 
+  assert(text_vector_column->get(&error, 1, &datum));
+  assert(datum.type() == grnxx::TEXT_VECTOR_DATA);
+  assert(datum.force_text_vector() == grnxx::TextVector(nullptr, 0));
+
   // Set and get values.
   assert(bool_column->set(&error, 1, grnxx::Bool(true)));
   assert(int_column->set(&error, 1, grnxx::Int(123)));
@@ -198,6 +213,9 @@ void test_column() {
   };
   assert(geo_point_vector_column->set(
       &error, 1, grnxx::GeoPointVector(geo_point_vector_value, 3)));
+  grnxx::Text text_vector_value[] = { "abc", "DEF", "ghi" };
+  assert(text_vector_column->set(&error, 1,
+                                 grnxx::TextVector(text_vector_value, 3)));
 
   assert(bool_column->get(&error, 1, &datum));
   assert(datum.type() == grnxx::BOOL_DATA);
@@ -238,6 +256,11 @@ void test_column() {
   assert(datum.type() == grnxx::GEO_POINT_VECTOR_DATA);
   assert(datum.force_geo_point_vector() ==
          grnxx::GeoPointVector(geo_point_vector_value, 3));
+
+  assert(text_vector_column->get(&error, 1, &datum));
+  assert(datum.type() == grnxx::TEXT_VECTOR_DATA);
+  assert(datum.force_text_vector() ==
+         grnxx::TextVector(text_vector_value, 3));
 }
 
 int main() {

  Modified: test/test_expression.cpp (+174 -14)
===================================================================
--- test/test_expression.cpp    2014-09-02 17:49:01 +0900 (54ee4c9)
+++ test/test_expression.cpp    2014-09-02 17:49:13 +0900 (d281a2f)
@@ -27,6 +27,8 @@
 #include "grnxx/expression.hpp"
 #include "grnxx/table.hpp"
 
+std::mt19937_64 mersenne_twister;
+
 struct {
   grnxx::unique_ptr<grnxx::DB> db;
   grnxx::Table *table;
@@ -56,8 +58,21 @@ struct {
   grnxx::Array<grnxx::GeoPointVector> geo_point_vector2_values;
   grnxx::Array<grnxx::Array<grnxx::GeoPoint>> geo_point_vector_bodies;
   grnxx::Array<grnxx::Array<grnxx::GeoPoint>> geo_point_vector2_bodies;
+  grnxx::Array<grnxx::TextVector> text_vector_values;
+  grnxx::Array<grnxx::TextVector> text_vector2_values;
+  grnxx::Array<grnxx::Array<grnxx::Text>> text_vector_bodies;
+  grnxx::Array<grnxx::Array<grnxx::Text>> text_vector2_bodies;
 } test;
 
+void generate_text(grnxx::Int min_size, grnxx::Int max_size,
+                   std::string *str) {
+  grnxx::Int size = (mersenne_twister() % (max_size - min_size + 1)) + min_size;
+  str->resize(size);
+  for (grnxx::Int i = 0; i < size; ++i) {
+    (*str)[i] = '0' + (mersenne_twister() % 10);
+  }
+}
+
 void init_test() {
   grnxx::Error error;
 
@@ -134,6 +149,14 @@ void init_test() {
   assert(geo_point_vector_column);
   assert(geo_point_vector2_column);
 
+  data_type = grnxx::TEXT_VECTOR_DATA;
+  auto text_vector_column =
+      test.table->create_column(&error, "TextVector", data_type);
+  auto text_vector2_column =
+      test.table->create_column(&error, "TextVector2", data_type);
+  assert(text_vector_column);
+  assert(text_vector2_column);
+
   // Generate random values.
   // Bool: true or false.
   // Int: [0, 100).
@@ -144,11 +167,11 @@ void init_test() {
   // IntVector: value = [0, 100), size = [0, 4].
   // FloatVector: value = [0.0, 1.0), size = [0, 4].
   // GeoPointVector: value = { [0, 100), [0, 100) }, size = [0, 4].
+  // TextVector: byte = ['0', '9'], length = [1, 4], size = [0, 4].
   constexpr grnxx::Int NUM_ROWS = 1 << 16;
   constexpr grnxx::Int MIN_LENGTH = 1;
   constexpr grnxx::Int MAX_LENGTH = 4;
   constexpr grnxx::Int MAX_SIZE = 4;
-  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.int_values.resize(&error, NUM_ROWS + 1));
@@ -175,6 +198,10 @@ void init_test() {
   assert(test.geo_point_vector2_values.resize(&error, NUM_ROWS + 1));
   assert(test.geo_point_vector_bodies.resize(&error, NUM_ROWS + 1));
   assert(test.geo_point_vector2_bodies.resize(&error, NUM_ROWS + 1));
+  assert(test.text_vector_values.resize(&error, NUM_ROWS + 1));
+  assert(test.text_vector2_values.resize(&error, NUM_ROWS + 1));
+  assert(test.text_vector_bodies.resize(&error, NUM_ROWS + 1));
+  assert(test.text_vector2_bodies.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);
@@ -191,20 +218,13 @@ void init_test() {
     test.geo_point2_values.set(
         i, grnxx::GeoPoint(mersenne_twister() % 100, mersenne_twister() % 100));
 
-    grnxx::Int length =
-        (mersenne_twister() % (MAX_LENGTH - MIN_LENGTH)) + MIN_LENGTH;
-    test.text_bodies[i].resize(length);
-    for (grnxx::Int j = 0; j < length; ++j) {
-      test.text_bodies[i][j] = '0' + (mersenne_twister() % 10);
-    }
-    test.text_values.set(i, grnxx::Text(test.text_bodies[i].data(), length));
+    std::string *text_body = &test.text_bodies[i];
+    generate_text(MIN_LENGTH, MAX_LENGTH, text_body);
+    test.text_values.set(i, grnxx::Text(text_body->data(), text_body->length()));
 
-    length = (mersenne_twister() % (MAX_LENGTH - MIN_LENGTH)) + MIN_LENGTH;
-    test.text2_bodies[i].resize(length);
-    for (grnxx::Int j = 0; j < length; ++j) {
-      test.text2_bodies[i][j] = '0' + (mersenne_twister() % 10);
-    }
-    test.text2_values.set(i, grnxx::Text(test.text2_bodies[i].data(), length));
+    text_body = &test.text2_bodies[i];
+    generate_text(MIN_LENGTH, MAX_LENGTH, text_body);
+    test.text2_values.set(i, grnxx::Text(text_body->data(), text_body->length()));
 
     grnxx::uint64_t bits = mersenne_twister();
     grnxx::Int size = mersenne_twister() % 59;
@@ -259,6 +279,23 @@ void init_test() {
     }
     test.geo_point_vector2_values.set(
         i, grnxx::GeoPointVector(test.geo_point_vector2_bodies[i].data(), size));
+
+    size = mersenne_twister() % (MAX_SIZE + 1);
+    assert(test.text_vector_bodies[i].resize(&error, size));
+    for (grnxx::Int j = 0; j < size; ++j) {
+      test.text_vector_bodies[i][j] =
+          test.text_values[1 + (mersenne_twister() % NUM_ROWS)];
+    }
+    test.text_vector_values.set(
+        i, grnxx::TextVector(test.text_vector_bodies[i].data(), size));
+    size = mersenne_twister() % (MAX_SIZE + 1);
+    assert(test.text_vector2_bodies[i].resize(&error, size));
+    for (grnxx::Int j = 0; j < size; ++j) {
+      test.text_vector2_bodies[i][j] =
+          test.text_values[1 + (mersenne_twister() % NUM_ROWS)];
+    }
+    test.text_vector2_values.set(
+        i, grnxx::TextVector(test.text_vector2_bodies[i].data(), size));
   }
 
   // Store generated values into columns.
@@ -292,6 +329,10 @@ void init_test() {
                                         test.geo_point_vector_values[i]));
     assert(geo_point_vector2_column->set(&error, row_id,
                                          test.geo_point_vector2_values[i]));
+    assert(text_vector_column->set(&error, row_id,
+                                   test.text_vector_values[i]));
+    assert(text_vector2_column->set(&error, row_id,
+                                    test.text_vector2_values[i]));
   }
 }
 
@@ -451,6 +492,19 @@ void test_constant() {
     assert(geo_point_vector_results[i] ==
            grnxx::GeoPointVector(geo_point_values, 3));
   }
+
+  // Test an expression ({ "abc", "DEF", "ghi" }).
+  grnxx::Text text_values[] = { "abc", "DEF", "ghi" };
+  assert(builder->push_datum(&error, grnxx::TextVector(text_values, 3)));
+  expression = builder->release(&error);
+  assert(expression);
+
+  grnxx::Array<grnxx::TextVector> text_vector_results;
+  assert(expression->evaluate(&error, records, &text_vector_results));
+  assert(text_vector_results.size() == test.table->num_rows());
+  for (grnxx::Int i = 0; i < text_vector_results.size(); ++i) {
+    assert(text_vector_results[i] == grnxx::TextVector(text_values, 3));
+  }
 }
 
 void test_column() {
@@ -629,6 +683,24 @@ void test_column() {
     assert(geo_point_vector_results[i] == test.geo_point_vector_values[row_id]);
   }
 
+  // Test an expression (TextVector).
+  assert(builder->push_column(&error, "TextVector"));
+  expression = builder->release(&error);
+  assert(expression);
+
+  records.clear();
+  cursor = test.table->create_cursor(&error);
+  assert(cursor);
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+
+  grnxx::Array<grnxx::TextVector> text_vector_results;
+  assert(expression->evaluate(&error, records, &text_vector_results));
+  assert(text_vector_results.size() == test.table->num_rows());
+  for (grnxx::Int i = 0; i < text_vector_results.size(); ++i) {
+    grnxx::Int row_id = records.get_row_id(i);
+    assert(text_vector_results[i] == test.text_vector_values[row_id]);
+  }
+
   // Test and expression (_id).
   assert(builder->push_column(&error, "_id"));
   expression = builder->release(&error);
@@ -1286,6 +1358,37 @@ void test_equal() {
     }
   }
   assert(records.size() == count);
+
+  // Test an expression (TextVector == TextVector2).
+  assert(builder->push_column(&error, "TextVector"));
+  assert(builder->push_column(&error, "TextVector2"));
+  assert(builder->push_operator(&error, grnxx::EQUAL_OPERATOR));
+  expression = builder->release(&error);
+  assert(expression);
+
+  records.clear();
+  cursor = test.table->create_cursor(&error);
+  assert(cursor);
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+
+  results.clear();
+  assert(expression->evaluate(&error, records, &results));
+  assert(results.size() == test.table->num_rows());
+  for (grnxx::Int i = 0; i < results.size(); ++i) {
+    grnxx::Int row_id = records.get_row_id(i);
+    assert(results[i] == (test.text_vector_values[row_id] ==
+                          test.text_vector2_values[row_id]));
+  }
+
+  assert(expression->filter(&error, &records));
+  count = 0;
+  for (grnxx::Int i = 1; i < test.text_vector_values.size(); ++i) {
+    if (test.text_vector_values[i] == test.text_vector2_values[i]) {
+      assert(records.get_row_id(count) == i);
+      ++count;
+    }
+  }
+  assert(records.size() == count);
 }
 
 void test_not_equal() {
@@ -1573,6 +1676,37 @@ void test_not_equal() {
     }
   }
   assert(records.size() == count);
+
+  // Test an expression (TextVector != TextVector2).
+  assert(builder->push_column(&error, "TextVector"));
+  assert(builder->push_column(&error, "TextVector2"));
+  assert(builder->push_operator(&error, grnxx::NOT_EQUAL_OPERATOR));
+  expression = builder->release(&error);
+  assert(expression);
+
+  records.clear();
+  cursor = test.table->create_cursor(&error);
+  assert(cursor);
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+
+  results.clear();
+  assert(expression->evaluate(&error, records, &results));
+  assert(results.size() == test.table->num_rows());
+  for (grnxx::Int i = 0; i < results.size(); ++i) {
+    grnxx::Int row_id = records.get_row_id(i);
+    assert(results[i] == (test.text_vector_values[row_id] !=
+                          test.text_vector2_values[row_id]));
+  }
+
+  assert(expression->filter(&error, &records));
+  count = 0;
+  for (grnxx::Int i = 1; i < test.text_vector_values.size(); ++i) {
+    if (test.text_vector_values[i] != test.text_vector2_values[i]) {
+      assert(records.get_row_id(count) == i);
+      ++count;
+    }
+  }
+  assert(records.size() == count);
 }
 
 void test_less() {
@@ -2655,6 +2789,32 @@ void test_subscript() {
       assert(geo_point_results[i] == grnxx::GeoPoint(0, 0));
     }
   }
+
+  // Test an expression (TextVector[Int]).
+  assert(builder->push_column(&error, "TextVector"));
+  assert(builder->push_column(&error, "Int"));
+  assert(builder->push_operator(&error, grnxx::SUBSCRIPT_OPERATOR));
+  expression = builder->release(&error);
+  assert(expression);
+
+  records.clear();
+  cursor = test.table->create_cursor(&error);
+  assert(cursor);
+  assert(cursor->read_all(&error, &records) == test.table->num_rows());
+
+  grnxx::Array<grnxx::Text> text_results;
+  assert(expression->evaluate(&error, records, &text_results));
+  assert(text_results.size() == test.table->num_rows());
+  for (grnxx::Int i = 0; i < text_results.size(); ++i) {
+    grnxx::Int row_id = records.get_row_id(i);
+    const auto int_value = test.int_values[row_id];
+    const auto &text_vector_value = test.text_vector_values[row_id];
+    if (int_value < text_vector_value.size()) {
+      assert(text_results[i] == text_vector_value[int_value]);
+    } else {
+      assert(text_results[i] == 0);
+    }
+  }
 }
 
 void test_sequential_filter() {
-------------- next part --------------
HTML����������������������������...
下載 



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