susumu.yata
null+****@clear*****
Thu Dec 25 12:36:05 JST 2014
susumu.yata 2014-12-25 12:36:05 +0900 (Thu, 25 Dec 2014) New Revision: 898422f8a89d80ca8b0bf367d5eab8dd5415c753 https://github.com/groonga/grnxx/commit/898422f8a89d80ca8b0bf367d5eab8dd5415c753 Message: Fix bugs that Column<Int> cannot find N/A. (#135) Modified files: lib/grnxx/impl/column/scalar/int.cpp lib/grnxx/impl/column/scalar/int.hpp Modified: lib/grnxx/impl/column/scalar/int.cpp (+85 -148) =================================================================== --- lib/grnxx/impl/column/scalar/int.cpp 2014-12-24 18:22:23 +0900 (f95cb79) +++ lib/grnxx/impl/column/scalar/int.cpp 2014-12-25 12:36:05 +0900 (25cca09) @@ -102,80 +102,7 @@ bool Column<Int>::contains(const Datum &datum) const { if (!indexes_.is_empty()) { return indexes_[0]->contains(datum); } - Int value = parse_datum(datum); - size_t valid_size = get_valid_size(); - if (value.is_na()) { - switch (value_size_) { - case 8: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_8_[i] == na_value_8()) && table_->_test_row(i)) { - return true; - } - } - break; - } - case 16: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_16_[i] == na_value_16()) && table_->_test_row(i)) { - return true; - } - } - break; - } - case 32: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_32_[i] == na_value_32()) && table_->_test_row(i)) { - return true; - } - } - break; - } - default: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_64_[i].is_na() && table_->_test_row(i)) { - return true; - } - } - break; - } - } - } else { - switch (value_size_) { - case 8: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_8_[i] == value.raw()) { - return true; - } - } - break; - } - case 16: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_16_[i] == value.raw()) { - return true; - } - } - break; - } - case 32: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_32_[i] == value.raw()) { - return true; - } - } - break; - } - default: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_64_[i].match(value)) { - return true; - } - } - break; - } - } - } - return false; + return !scan(parse_datum(datum)).is_na(); } Int Column<Int>::find_one(const Datum &datum) const { @@ -183,80 +110,7 @@ Int Column<Int>::find_one(const Datum &datum) const { if (!indexes_.is_empty()) { return indexes_[0]->find_one(datum); } - Int value = parse_datum(datum); - size_t valid_size = get_valid_size(); - if (value.is_na()) { - switch (value_size_) { - case 8: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_8_[i] == na_value_8()) && table_->_test_row(i)) { - return Int(i); - } - } - break; - } - case 16: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_16_[i] == na_value_16()) && table_->_test_row(i)) { - return Int(i); - } - } - break; - } - case 32: { - for (size_t i = 0; i < valid_size; ++i) { - if ((values_32_[i] == na_value_32()) && table_->_test_row(i)) { - return Int(i); - } - } - break; - } - default: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_64_[i].is_na() && table_->_test_row(i)) { - return Int(i); - } - } - break; - } - } - } else { - switch (value_size_) { - case 8: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_8_[i] == value.raw()) { - return Int(i); - } - } - break; - } - case 16: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_16_[i] == value.raw()) { - return Int(i); - } - } - break; - } - case 32: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_32_[i] == value.raw()) { - return Int(i); - } - } - break; - } - default: { - for (size_t i = 0; i < valid_size; ++i) { - if (values_64_[i].match(value)) { - return Int(i); - } - } - break; - } - } - } - return Int::na(); + return scan(parse_datum(datum)); } void Column<Int>::set_key_attribute() { @@ -453,6 +307,89 @@ void Column<Int>::read(ArrayCRef<Record> records, ArrayRef<Int> values) const { // } //} +Int Column<Int>::scan(Int value) const { + if (table_->max_row_id().is_na()) { + return Int::na(); + } + size_t table_size = table_->max_row_id().raw() + 1; + size_t valid_size = (size_ < table_size) ? size_ : table_size; + if (value.is_na()) { + if (size_ < table_size) { + return table_->max_row_id(); + } + switch (value_size_) { + case 8: { + for (size_t i = 0; i < valid_size; ++i) { + if ((values_8_[i] == na_value_8()) && table_->_test_row(i)) { + return Int(i); + } + } + break; + } + case 16: { + for (size_t i = 0; i < valid_size; ++i) { + if ((values_16_[i] == na_value_16()) && table_->_test_row(i)) { + return Int(i); + } + } + break; + } + case 32: { + for (size_t i = 0; i < valid_size; ++i) { + if ((values_32_[i] == na_value_32()) && table_->_test_row(i)) { + return Int(i); + } + } + break; + } + default: { + for (size_t i = 0; i < valid_size; ++i) { + if (values_64_[i].is_na() && table_->_test_row(i)) { + return Int(i); + } + } + break; + } + } + } else { + switch (value_size_) { + case 8: { + for (size_t i = 0; i < valid_size; ++i) { + if (values_8_[i] == value.raw()) { + return Int(i); + } + } + break; + } + case 16: { + for (size_t i = 0; i < valid_size; ++i) { + if (values_16_[i] == value.raw()) { + return Int(i); + } + } + break; + } + case 32: { + for (size_t i = 0; i < valid_size; ++i) { + if (values_32_[i] == value.raw()) { + return Int(i); + } + } + break; + } + default: { + for (size_t i = 0; i < valid_size; ++i) { + if (values_64_[i].match(value)) { + return Int(i); + } + } + break; + } + } + } + return Int::na(); +} + size_t Column<Int>::get_valid_size() const { if (table_->max_row_id().is_na()) { return 0; Modified: lib/grnxx/impl/column/scalar/int.hpp (+6 -0) =================================================================== --- lib/grnxx/impl/column/scalar/int.hpp 2014-12-24 18:22:23 +0900 (a37be53) +++ lib/grnxx/impl/column/scalar/int.hpp 2014-12-25 12:36:05 +0900 (e021e78) @@ -82,6 +82,12 @@ class Column<Int> : public ColumnBase { } } + // Scan the column to find "value". + // + // If found, returns the row ID. + // If not found, returns N/A. + Int scan(Int value) const; + // Return the active column size. size_t get_valid_size() const; -------------- next part -------------- HTML����������������������������...Download