[Groonga-commit] groonga/grnxx at 555df0e [master] Add an argument "offset" to Expression::filter(). (#29)

Back to archive index

susumu.yata null+****@clear*****
Fri Aug 1 16:48:42 JST 2014


susumu.yata	2014-08-01 16:48:42 +0900 (Fri, 01 Aug 2014)

  New Revision: 555df0e3c400978b06d608c3f4cfa63228912a96
  https://github.com/groonga/grnxx/commit/555df0e3c400978b06d608c3f4cfa63228912a96

  Message:
    Add an argument "offset" to Expression::filter(). (#29)

  Modified files:
    include/grnxx/expression.hpp
    lib/grnxx/expression.cpp

  Modified: include/grnxx/expression.hpp (+1 -1)
===================================================================
--- include/grnxx/expression.hpp    2014-08-01 16:08:27 +0900 (5a44f9a)
+++ include/grnxx/expression.hpp    2014-08-01 16:48:42 +0900 (3c371b7)
@@ -88,7 +88,7 @@ class Expression {
   // Returns true on success.
   // On failure, returns false and stores error information into "*error" if
   // "error" != nullptr.
-  bool filter(Error *error, RecordSet *record_set);
+  bool filter(Error *error, RecordSet *record_set, Int offset = 0);
 
   // Adjust scores of records.
   //

  Modified: lib/grnxx/expression.cpp (+32 -17)
===================================================================
--- lib/grnxx/expression.cpp    2014-08-01 16:08:27 +0900 (71fbd8b)
+++ lib/grnxx/expression.cpp    2014-08-01 16:48:42 +0900 (256b289)
@@ -39,7 +39,7 @@ class ExpressionNode {
   // Returns true on success.
   // On failure, returns false and stores error information into "*error" if
   // "error" != nullptr.
-  virtual bool filter(Error *error, RecordSet *record_set) = 0;
+  virtual bool filter(Error *error, RecordSubset *record_set) = 0;
 
   // Adjust scores of records.
   //
@@ -73,7 +73,7 @@ class Node : public ExpressionNode {
     return TypeTraits<T>::data_type();
   }
 
-  virtual bool filter(Error *error, RecordSet *record_set);
+  virtual bool filter(Error *error, RecordSubset *record_set);
   virtual bool adjust(Error *error, RecordSubset *record_set);
 
   virtual bool evaluate(Error *error, const RecordSubset &record_set) = 0;
@@ -87,14 +87,14 @@ class Node : public ExpressionNode {
 };
 
 template <typename T>
-bool Node<T>::filter(Error *error, RecordSet *record_set) {
+bool Node<T>::filter(Error *error, RecordSubset *record_set) {
   // Only Node<Bool> supports filter().
   GRNXX_ERROR_SET(error, INVALID_OPERATION, "Invalid operation");
   return false;
 }
 
 template <>
-bool Node<Bool>::filter(Error *error, RecordSet *record_set) {
+bool Node<Bool>::filter(Error *error, RecordSubset *record_set) {
   if (!evaluate(error, *record_set)) {
     return false;
   }
@@ -105,7 +105,8 @@ bool Node<Bool>::filter(Error *error, RecordSet *record_set) {
       ++dest;
     }
   }
-  return record_set->resize(error, dest);
+  *record_set = record_set->subset(0, dest);
+  return true;
 }
 
 template <typename T>
@@ -521,7 +522,7 @@ class LogicalAndNode : public Node<Bool> {
     return OPERATOR_NODE;
   }
 
-  bool filter(Error *error, RecordSet *record_set);
+  bool filter(Error *error, RecordSubset *record_set);
 
   bool evaluate(Error *error, const RecordSubset &record_set);
 
@@ -531,7 +532,7 @@ class LogicalAndNode : public Node<Bool> {
   RecordSet temp_record_set_;
 };
 
-bool LogicalAndNode::filter(Error *error, RecordSet *record_set) {
+bool LogicalAndNode::filter(Error *error, RecordSubset *record_set) {
   return lhs_->filter(error, record_set) && rhs_->filter(error, record_set);
 }
 
@@ -576,7 +577,7 @@ class LogicalOrNode : public Node<Bool> {
     return OPERATOR_NODE;
   }
 
-  bool filter(Error *error, RecordSet *record_set);
+  bool filter(Error *error, RecordSubset *record_set);
 
   bool evaluate(Error *error, const RecordSubset &record_set);
 
@@ -587,7 +588,7 @@ class LogicalOrNode : public Node<Bool> {
   RecordSet right_record_set_;
 };
 
-bool LogicalOrNode::filter(Error *error, RecordSet *record_set) {
+bool LogicalOrNode::filter(Error *error, RecordSubset *record_set) {
   // Make a copy of the given record set and apply the left-filter to it.
   if (!left_record_set_.resize(error, record_set->size())) {
     return false;
@@ -595,7 +596,11 @@ bool LogicalOrNode::filter(Error *error, RecordSet *record_set) {
   for (Int i = 0; i < record_set->size(); ++i) {
     left_record_set_.set(i, record_set->get(i));
   }
-  if (!lhs_->filter(error, &left_record_set_)) {
+  RecordSubset left_record_subset = left_record_set_.subset();
+  if (!lhs_->filter(error, &left_record_subset)) {
+    return false;
+  }
+  if (!left_record_set_.resize(error, left_record_subset.size())) {
     return false;
   }
   if (left_record_set_.size() == 0) {
@@ -622,14 +627,16 @@ bool LogicalOrNode::filter(Error *error, RecordSet *record_set) {
       ++right_count;
     }
   }
-  if (!rhs_->filter(error, &right_record_set_)) {
+  RecordSubset right_record_subset = right_record_set_.subset();
+  if (!rhs_->filter(error, &right_record_subset)) {
+    return false;
+  }
+  if (!right_record_set_.resize(error, right_record_subset.size())) {
     return false;
   }
   if (right_record_set_.size() == 0) {
     // There are no right-true records.
-    if (!record_set->resize(error, left_record_set_.size())) {
-      return false;
-    }
+    *record_set = record_set->subset(0, left_record_set_.size());
     for (Int i = 0; i < record_set->size(); ++i) {
       record_set->set(i, left_record_set_.get(i));
     }
@@ -659,7 +666,8 @@ bool LogicalOrNode::filter(Error *error, RecordSet *record_set) {
       ++right_count;
     }
   }
-  return record_set->resize(error, left_count + right_count);
+  *record_set = record_set->subset(0, left_count + right_count);
+  return true;
 }
 
 bool LogicalOrNode::evaluate(Error *error, const RecordSubset &record_set) {
@@ -711,8 +719,15 @@ DataType Expression::data_type() const {
   return root_->data_type();
 }
 
-bool Expression::filter(Error *error, RecordSet *record_set) {
-  return root_->filter(error, record_set);
+bool Expression::filter(Error *error, RecordSet *record_set, Int offset) {
+  RecordSubset subset = record_set->subset(offset);
+  if (!root_->filter(error, &subset)) {
+    return false;
+  }
+  if (!record_set->resize(error, offset + subset.size())) {
+    return false;
+  }
+  return true;
 }
 
 bool Expression::adjust(Error *error, RecordSet *record_set, Int offset) {
-------------- next part --------------
HTML����������������������������...
Download 



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