susumu.yata
null+****@clear*****
Tue Dec 16 10:44:41 JST 2014
susumu.yata 2014-11-25 11:01:27 +0900 (Tue, 25 Nov 2014) New Revision: def38459189a15d273f8d5f1448e53a21770e0e3 https://github.com/groonga/grnxx/commit/def38459189a15d273f8d5f1448e53a21770e0e3 Message: Add get_valid_size() to Column. Modified files: lib/grnxx/impl/column/scalar/bool.cpp lib/grnxx/impl/column/scalar/bool.hpp lib/grnxx/impl/column/scalar/float.cpp lib/grnxx/impl/column/scalar/float.hpp lib/grnxx/impl/column/scalar/geo_point.cpp lib/grnxx/impl/column/scalar/geo_point.hpp lib/grnxx/impl/column/scalar/int.cpp lib/grnxx/impl/column/scalar/int.hpp lib/grnxx/impl/column/scalar/text.cpp lib/grnxx/impl/column/scalar/text.hpp lib/grnxx/impl/column/vector/bool.cpp lib/grnxx/impl/column/vector/bool.hpp lib/grnxx/impl/column/vector/float.cpp lib/grnxx/impl/column/vector/float.hpp lib/grnxx/impl/column/vector/geo_point.cpp lib/grnxx/impl/column/vector/geo_point.hpp lib/grnxx/impl/column/vector/int.cpp lib/grnxx/impl/column/vector/int.hpp lib/grnxx/impl/column/vector/text.cpp lib/grnxx/impl/column/vector/text.hpp Modified: lib/grnxx/impl/column/scalar/bool.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/scalar/bool.cpp 2014-11-25 10:47:34 +0900 (bc4b4ff) +++ lib/grnxx/impl/column/scalar/bool.cpp 2014-11-25 11:01:27 +0900 (ca3a1ef) @@ -60,14 +60,15 @@ void Column<Bool>::get(Int row_id, Datum *datum) const { bool Column<Bool>::contains(const Datum &datum) const { // TODO: Use an index if exists. Bool value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return true; } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return true; } @@ -79,14 +80,15 @@ bool Column<Bool>::contains(const Datum &datum) const { Int Column<Bool>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Bool value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return Int(i); } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return Int(i); } @@ -113,6 +115,17 @@ void Column<Bool>::read(ArrayCRef<Record> records, } } +size_t Column<Bool>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < values_.size()) { + return table_size; + } + return values_.size(); +} + Bool Column<Bool>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/scalar/bool.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/scalar/bool.hpp 2014-11-25 10:47:34 +0900 (14dcd0a) +++ lib/grnxx/impl/column/scalar/bool.hpp 2014-11-25 11:01:27 +0900 (3dbf710) @@ -48,6 +48,9 @@ class Column<Bool> : public ColumnBase { protected: Array<Bool> values_; + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Bool. // // On success, returns the result. Modified: lib/grnxx/impl/column/scalar/float.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/scalar/float.cpp 2014-11-25 10:47:34 +0900 (1ffa493) +++ lib/grnxx/impl/column/scalar/float.cpp 2014-11-25 11:01:27 +0900 (ae8ea8c) @@ -61,14 +61,15 @@ void Column<Float>::get(Int row_id, Datum *datum) const { bool Column<Float>::contains(const Datum &datum) const { // TODO: Use an index if exists. Float value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return true; } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return true; } @@ -80,14 +81,15 @@ bool Column<Float>::contains(const Datum &datum) const { Int Column<Float>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Float value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return Int(i); } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return Int(i); } @@ -117,6 +119,17 @@ void Column<Float>::read(ArrayCRef<Record> records, } } +size_t Column<Float>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < values_.size()) { + return table_size; + } + return values_.size(); +} + Float Column<Float>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/scalar/float.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/scalar/float.hpp 2014-11-25 10:47:34 +0900 (554af32) +++ lib/grnxx/impl/column/scalar/float.hpp 2014-11-25 11:01:27 +0900 (d0e699b) @@ -48,6 +48,9 @@ class Column<Float> : public ColumnBase { protected: Array<Float> values_; + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Float. // // On success, returns the result. Modified: lib/grnxx/impl/column/scalar/geo_point.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/scalar/geo_point.cpp 2014-11-25 10:47:34 +0900 (6297e5d) +++ lib/grnxx/impl/column/scalar/geo_point.cpp 2014-11-25 11:01:27 +0900 (adaf0ad) @@ -61,14 +61,15 @@ void Column<GeoPoint>::get(Int row_id, Datum *datum) const { bool Column<GeoPoint>::contains(const Datum &datum) const { // TODO: Use an index if exists. GeoPoint value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return true; } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return true; } @@ -80,14 +81,15 @@ bool Column<GeoPoint>::contains(const Datum &datum) const { Int Column<GeoPoint>::find_one(const Datum &datum) const { // TODO: Use an index if exists. GeoPoint value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && table_->_test_row(i)) { return Int(i); } } } else { - for (size_t i = 0; i < values_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return Int(i); } @@ -117,6 +119,17 @@ void Column<GeoPoint>::read(ArrayCRef<Record> records, } } +size_t Column<GeoPoint>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < values_.size()) { + return table_size; + } + return values_.size(); +} + GeoPoint Column<GeoPoint>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/scalar/geo_point.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/scalar/geo_point.hpp 2014-11-25 10:47:34 +0900 (fa883f1) +++ lib/grnxx/impl/column/scalar/geo_point.hpp 2014-11-25 11:01:27 +0900 (d0ed806) @@ -48,6 +48,9 @@ class Column<GeoPoint> : public ColumnBase { protected: Array<GeoPoint> values_; + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as GeoPoint. // // On success, returns the result. Modified: lib/grnxx/impl/column/scalar/int.cpp (+11 -0) =================================================================== --- lib/grnxx/impl/column/scalar/int.cpp 2014-11-25 10:47:34 +0900 (caa864c) +++ lib/grnxx/impl/column/scalar/int.cpp 2014-11-25 11:01:27 +0900 (65c1292) @@ -279,6 +279,17 @@ void Column<Int>::read(ArrayCRef<Record> records, ArrayRef<Int> values) const { // } //} +size_t Column<Int>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < values_.size()) { + return table_size; + } + return values_.size(); +} + Int Column<Int>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/scalar/int.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/scalar/int.hpp 2014-11-25 10:47:34 +0900 (8f9b4ba) +++ lib/grnxx/impl/column/scalar/int.hpp 2014-11-25 11:01:27 +0900 (f049237) @@ -52,6 +52,9 @@ class Column<Int> : public ColumnBase { private: Array<Int> values_; + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Int. // // On success, returns the result. Modified: lib/grnxx/impl/column/scalar/text.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/scalar/text.cpp 2014-11-25 10:47:34 +0900 (29281a8) +++ lib/grnxx/impl/column/scalar/text.cpp 2014-11-25 11:01:27 +0900 (a2a5c30) @@ -145,14 +145,15 @@ void Column<Text>::get(Int row_id, Datum *datum) const { bool Column<Text>::contains(const Datum &datum) const { // TODO: Use an index if exists. Text value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this (get() checks the range of its argument). if (get(Int(i)).match(value)) { return true; @@ -165,14 +166,15 @@ bool Column<Text>::contains(const Datum &datum) const { Int Column<Text>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Text value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this (get() checks the range of its argument). if (get(Int(i)).match(value)) { return Int(i); @@ -408,6 +410,17 @@ void Column<Text>::read(ArrayCRef<Record> records, } } +size_t Column<Text>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + Text Column<Text>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/scalar/text.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/scalar/text.hpp 2014-11-25 10:47:34 +0900 (1740d0e) +++ lib/grnxx/impl/column/scalar/text.hpp 2014-11-25 11:01:27 +0900 (c044f60) @@ -75,6 +75,9 @@ class Column<Text> : public ColumnBase { return std::numeric_limits<uint64_t>::max(); } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Text. // // On success, returns the result. Modified: lib/grnxx/impl/column/vector/bool.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/vector/bool.cpp 2014-11-25 10:47:34 +0900 (a4da396) +++ lib/grnxx/impl/column/vector/bool.cpp 2014-11-25 11:01:27 +0900 (34d8e8c) @@ -84,14 +84,15 @@ void Column<Vector<Bool>>::get(Int row_id, Datum *datum) const { bool Column<Vector<Bool>>::contains(const Datum &datum) const { // TODO: Use an index if exists. Vector<Bool> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return true; @@ -104,14 +105,15 @@ bool Column<Vector<Bool>>::contains(const Datum &datum) const { Int Column<Vector<Bool>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Vector<Bool> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return Int(i); @@ -132,6 +134,17 @@ void Column<Vector<Bool>>::unset(Int row_id) { } } +size_t Column<Vector<Bool>>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + void Column<Vector<Bool>>::read(ArrayCRef<Record> records, ArrayRef<Vector<Bool>> values) const { if (records.size() != values.size()) { Modified: lib/grnxx/impl/column/vector/bool.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/vector/bool.hpp 2014-11-25 10:47:34 +0900 (97ae887) +++ lib/grnxx/impl/column/vector/bool.hpp 2014-11-25 11:01:27 +0900 (c2ae939) @@ -71,6 +71,9 @@ class Column<Vector<Bool>> : public ColumnBase { return std::numeric_limits<uint64_t>::max(); } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Vector<Bool>. // // On success, returns the result. Modified: lib/grnxx/impl/column/vector/float.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/vector/float.cpp 2014-11-25 10:47:34 +0900 (a75c78f) +++ lib/grnxx/impl/column/vector/float.cpp 2014-11-25 11:01:27 +0900 (8d3b186) @@ -85,14 +85,15 @@ void Column<Vector<Float>>::get(Int row_id, Datum *datum) const { bool Column<Vector<Float>>::contains(const Datum &datum) const { // TODO: Use an index if exists. Vector<Float> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return true; @@ -105,14 +106,15 @@ bool Column<Vector<Float>>::contains(const Datum &datum) const { Int Column<Vector<Float>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Vector<Float> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return Int(i); @@ -143,6 +145,17 @@ void Column<Vector<Float>>::read(ArrayCRef<Record> records, } } +size_t Column<Vector<Float>>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + Vector<Float> Column<Vector<Float>>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/vector/float.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/vector/float.hpp 2014-11-25 10:47:34 +0900 (35f91f6) +++ lib/grnxx/impl/column/vector/float.hpp 2014-11-25 11:01:27 +0900 (6cf41c8) @@ -71,6 +71,9 @@ class Column<Vector<Float>> : public ColumnBase { return std::numeric_limits<uint64_t>::max(); } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Vector<Float>. // // On success, returns the result. Modified: lib/grnxx/impl/column/vector/geo_point.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/vector/geo_point.cpp 2014-11-25 10:47:34 +0900 (c32420c) +++ lib/grnxx/impl/column/vector/geo_point.cpp 2014-11-25 11:01:27 +0900 (f124521) @@ -85,14 +85,15 @@ void Column<Vector<GeoPoint>>::get(Int row_id, Datum *datum) const { bool Column<Vector<GeoPoint>>::contains(const Datum &datum) const { // TODO: Use an index if exists. Vector<GeoPoint> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return true; @@ -105,14 +106,15 @@ bool Column<Vector<GeoPoint>>::contains(const Datum &datum) const { Int Column<Vector<GeoPoint>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Vector<GeoPoint> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return Int(i); @@ -143,6 +145,17 @@ void Column<Vector<GeoPoint>>::read(ArrayCRef<Record> records, } } +size_t Column<Vector<GeoPoint>>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + Vector<GeoPoint> Column<Vector<GeoPoint>>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/vector/geo_point.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/vector/geo_point.hpp 2014-11-25 10:47:34 +0900 (1648243) +++ lib/grnxx/impl/column/vector/geo_point.hpp 2014-11-25 11:01:27 +0900 (722af35) @@ -72,6 +72,9 @@ class Column<Vector<GeoPoint>> : public ColumnBase { return std::numeric_limits<uint64_t>::max(); } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Vector<GeoPoint>. // // On success, returns the result. Modified: lib/grnxx/impl/column/vector/int.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/vector/int.cpp 2014-11-25 10:47:34 +0900 (6201de5) +++ lib/grnxx/impl/column/vector/int.cpp 2014-11-25 11:01:27 +0900 (870b7d1) @@ -100,14 +100,15 @@ void Column<Vector<Int>>::get(Int row_id, Datum *datum) const { bool Column<Vector<Int>>::contains(const Datum &datum) const { // TODO: Use an index if exists. Vector<Int> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return true; @@ -120,14 +121,15 @@ bool Column<Vector<Int>>::contains(const Datum &datum) const { Int Column<Vector<Int>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Vector<Int> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i] == na_header()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return Int(i); @@ -158,6 +160,17 @@ void Column<Vector<Int>>::read(ArrayCRef<Record> records, } } +size_t Column<Vector<Int>>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + Vector<Int> Column<Vector<Int>>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/vector/int.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/vector/int.hpp 2014-11-25 10:47:34 +0900 (ed42864) +++ lib/grnxx/impl/column/vector/int.hpp 2014-11-25 11:01:27 +0900 (f29649b) @@ -71,6 +71,9 @@ class Column<Vector<Int>> : public ColumnBase { return std::numeric_limits<uint64_t>::max(); } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Vector<Int>. // // On success, returns the result. Modified: lib/grnxx/impl/column/vector/text.cpp (+17 -4) =================================================================== --- lib/grnxx/impl/column/vector/text.cpp 2014-11-25 10:47:34 +0900 (b60929f) +++ lib/grnxx/impl/column/vector/text.cpp 2014-11-25 11:01:27 +0900 (a80b659) @@ -87,14 +87,15 @@ void Column<Vector<Text>>::get(Int row_id, Datum *datum) const { bool Column<Vector<Text>>::contains(const Datum &datum) const { // TODO: Use an index if exists. Vector<Text> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i].size.is_na()) { return true; } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return true; @@ -107,14 +108,15 @@ bool Column<Vector<Text>>::contains(const Datum &datum) const { Int Column<Vector<Text>>::find_one(const Datum &datum) const { // TODO: Use an index if exists. Vector<Text> value = parse_datum(datum); + size_t valid_size = get_valid_size(); if (value.is_na()) { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { if (headers_[i].size.is_na()) { return Int(i); } } } else { - for (size_t i = 0; i < headers_.size(); ++i) { + for (size_t i = 0; i < valid_size; ++i) { // TODO: Improve this. if (get(Int(i)).match(value)) { return Int(i); @@ -145,6 +147,17 @@ void Column<Vector<Text>>::read(ArrayCRef<Record> records, } } +size_t Column<Vector<Text>>::get_valid_size() const { + if (table_->max_row_id().is_na()) { + return 0; + } + size_t table_size = table_->max_row_id().value() + 1; + if (table_size < headers_.size()) { + return table_size; + } + return headers_.size(); +} + Vector<Text> Column<Vector<Text>>::parse_datum(const Datum &datum) { switch (datum.type()) { case NA_DATA: { Modified: lib/grnxx/impl/column/vector/text.hpp (+3 -0) =================================================================== --- lib/grnxx/impl/column/vector/text.hpp 2014-11-25 10:47:34 +0900 (42f4700) +++ lib/grnxx/impl/column/vector/text.hpp 2014-11-25 11:01:27 +0900 (c5a2ebe) @@ -63,6 +63,9 @@ class Column<Vector<Text>> : public ColumnBase { return Header{ 0, Int::na() }; } + // Return the active column size. + size_t get_valid_size() const; + // Parse "datum" as Vector<Text>. // // On success, returns the result. -------------- next part -------------- HTML����������������������������...Download