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