[Groonga-commit] groonga/grnxx at cb991ff [master] Add a test for Index::find_starts_with(). (#52)

Back to archive index

susumu.yata null+****@clear*****
Wed Sep 17 14:17:10 JST 2014


susumu.yata	2014-09-17 14:17:10 +0900 (Wed, 17 Sep 2014)

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

  Message:
    Add a test for Index::find_starts_with(). (#52)

  Modified files:
    test/test_index.cpp

  Modified: test/test_index.cpp (+119 -0)
===================================================================
--- test/test_index.cpp    2014-09-17 14:16:54 +0900 (01d0088)
+++ test/test_index.cpp    2014-09-17 14:17:10 +0900 (7a31d5c)
@@ -639,6 +639,123 @@ void test_text_range() {
   assert(count == records.size());
 }
 
+bool inclusive_starts_with(const grnxx::Text &arg1, const grnxx::Text &arg2) {
+  if (arg1.size() < arg2.size()) {
+    return false;
+  }
+  for (grnxx::Int i = 0; i < arg2.size(); ++i) {
+    if (arg1[i] != arg2[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool exclusive_starts_with(const grnxx::Text &arg1, const grnxx::Text &arg2) {
+  if (arg1.size() <= arg2.size()) {
+    return false;
+  }
+  for (grnxx::Int i = 0; i < arg2.size(); ++i) {
+    if (arg1[i] != arg2[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+void test_text_find_starts_with() {
+  constexpr grnxx::Int NUM_ROWS = 1 << 16;
+
+  grnxx::Error error;
+
+  // Create a database with the default options.
+  auto db = grnxx::open_db(&error, "");
+  assert(db);
+
+  // Create a table with the default options.
+  auto table = db->create_table(&error, "Table");
+  assert(table);
+
+  // Create a column.
+  auto column = table->create_column(&error, "Text", grnxx::TEXT_DATA);
+  assert(column);
+
+  // Create an index.
+  auto index = column->create_index(&error, "Index", grnxx::TREE_INDEX);
+  assert(index);
+
+  // Generate random values.
+  // Text: ["0", "99"].
+  grnxx::Array<grnxx::Text> values;
+  char bodies[100][3];
+  assert(values.resize(&error, NUM_ROWS + 1));
+  for (int i = 0; i < 100; ++i) {
+    std::sprintf(bodies[i], "%d", i);
+  }
+  for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+    values.set(i, bodies[mersenne_twister() % 100]);
+  }
+
+  // Store generated values into columns.
+  for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+    grnxx::Int row_id;
+    assert(table->insert_row(&error, grnxx::NULL_ROW_ID,
+                             grnxx::Datum(), &row_id));
+    assert(row_id == i);
+    assert(column->set(&error, row_id, values[i]));
+  }
+
+  // Test cursors for each value.
+  for (int int_value = 0; int_value < 100; ++int_value) {
+    grnxx::Text value = bodies[int_value];
+
+    grnxx::EndPoint prefix;
+    prefix.value = value;
+    prefix.type = grnxx::INCLUSIVE_END_POINT;
+    auto cursor = index->find_starts_with(&error, prefix);
+    assert(cursor);
+
+    grnxx::Array<grnxx::Record> records;
+    assert(cursor->read_all(&error, &records) != -1);
+    for (grnxx::Int i = 1; i < records.size(); ++i) {
+      assert(inclusive_starts_with(values[records.get_row_id(i)], value));
+    }
+
+    grnxx::Int count = 0;
+    for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+      if (inclusive_starts_with(values[i], value)) {
+        ++count;
+      }
+    }
+    assert(count == records.size());
+  }
+
+  // Test cursors for each value.
+  for (int int_value = 0; int_value < 100; ++int_value) {
+    grnxx::Text value = bodies[int_value];
+
+    grnxx::EndPoint prefix;
+    prefix.value = value;
+    prefix.type = grnxx::EXCLUSIVE_END_POINT;
+    auto cursor = index->find_starts_with(&error, prefix);
+    assert(cursor);
+
+    grnxx::Array<grnxx::Record> records;
+    assert(cursor->read_all(&error, &records) != -1);
+    for (grnxx::Int i = 1; i < records.size(); ++i) {
+      assert(exclusive_starts_with(values[records.get_row_id(i)], value));
+    }
+
+    grnxx::Int count = 0;
+    for (grnxx::Int i = 1; i <= NUM_ROWS; ++i) {
+      if (exclusive_starts_with(values[i], value)) {
+        ++count;
+      }
+    }
+    assert(count == records.size());
+  }
+}
+
 void test_reverse() {
   constexpr grnxx::Int NUM_ROWS = 1 << 16;
 
@@ -792,6 +909,8 @@ int main() {
   test_float_range();
   test_text_range();
 
+  test_text_find_starts_with();
+
   test_reverse();
   test_offset_and_limit();
 
-------------- next part --------------
HTML����������������������������...
Download 



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