[Groonga-commit] groonga/grnxx at def3845 [master] Add get_valid_size() to Column.

Back to archive index

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 



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