[Groonga-commit] groonga/grnxx at bb9fc74 [master] Support expressions for Vector<Int/Float>.

Back to archive index

susumu.yata null+****@clear*****
Thu Aug 28 15:38:14 JST 2014


susumu.yata	2014-08-28 15:38:14 +0900 (Thu, 28 Aug 2014)

  New Revision: bb9fc743c6f81c524c477d7e1203f2626a2ddc6b
  https://github.com/groonga/grnxx/commit/bb9fc743c6f81c524c477d7e1203f2626a2ddc6b

  Message:
    Support expressions for Vector<Int/Float>.

  Modified files:
    lib/grnxx/expression.cpp

  Modified: lib/grnxx/expression.cpp (+119 -6)
===================================================================
--- lib/grnxx/expression.cpp    2014-08-28 13:55:09 +0900 (44db766)
+++ lib/grnxx/expression.cpp    2014-08-28 15:38:14 +0900 (768efe1)
@@ -2219,7 +2219,13 @@ bool SubscriptNode<T>::evaluate(Error *error,
     return false;
   }
   for (Int i = 0; i < records.size(); ++i) {
-    results.set(i, this->arg1_values_[i][this->arg2_values_[i]]);
+    auto arg1_value = this->arg1_values_[i];
+    auto arg2_value = this->arg2_values_[i];
+    if (arg2_value < arg1_value.size()) {
+      results.set(i, arg1_value[arg2_value]);
+    } else {
+      results.set(i, TypeTraits<T>::default_value());
+    }
   }
   return true;
 }
@@ -2262,9 +2268,13 @@ bool SubscriptNode<Bool>::filter(Error *error,
   }
   Int count = 0;
   for (Int i = 0; i < input_records.size(); ++i) {
-    if (this->arg1_values_[i][this->arg2_values_[i]]) {
-      output_records->set(count, input_records.get(i));
-      ++count;
+    auto arg1_value = this->arg1_values_[i];
+    auto arg2_value = this->arg2_values_[i];
+    if (arg2_value < arg1_value.size()) {
+      if (arg1_value[arg2_value]) {
+        output_records->set(count, input_records.get(i));
+        ++count;
+      }
     }
   }
   *output_records = output_records->ref(0, count);
@@ -2279,7 +2289,77 @@ bool SubscriptNode<Bool>::evaluate(Error *error,
     return false;
   }
   for (Int i = 0; i < records.size(); ++i) {
-    results.set(i, this->arg1_values_[i][this->arg2_values_[i]]);
+    auto arg1_value = this->arg1_values_[i];
+    auto arg2_value = this->arg2_values_[i];
+    if (arg2_value < arg1_value.size()) {
+      results.set(i, arg1_value[arg2_value]);
+    } else {
+      results.set(i, TypeTraits<Bool>::default_value());
+    }
+  }
+  return true;
+}
+
+template <>
+class SubscriptNode<Float> : public BinaryNode<Float, Vector<Float>, Int> {
+ public:
+  using Value = Float;
+  using Arg1 = Vector<Float>;
+  using Arg2 = Int;
+
+  static unique_ptr<Node> create(Error *error,
+                                 unique_ptr<Node> &&arg1,
+                                 unique_ptr<Node> &&arg2) {
+    unique_ptr<Node> node(
+        new (nothrow) SubscriptNode(std::move(arg1), std::move(arg2)));
+    if (!node) {
+      GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed");
+    }
+    return node;
+  }
+
+  SubscriptNode(unique_ptr<Node> &&arg1, unique_ptr<Node> &&arg2)
+      : BinaryNode<Value, Arg1, Arg2>(std::move(arg1), std::move(arg2)) {}
+
+  bool adjust(Error *error, ArrayRef<Record> records);
+  bool evaluate(Error *error,
+                ArrayCRef<Record> records,
+                ArrayRef<Value> results);
+};
+
+bool SubscriptNode<Float>::adjust(Error *error,
+                                  ArrayRef<Record> records) {
+  if (!fill_arg1_values(error, records) ||
+      !fill_arg2_values(error, records)) {
+    return false;
+  }
+  for (Int i = 0; i < records.size(); ++i) {
+    auto arg1_value = this->arg1_values_[i];
+    auto arg2_value = this->arg2_values_[i];
+    if (arg2_value < arg1_value.size()) {
+      records.set_score(i, arg1_value[arg2_value]);
+    } else {
+      records.set_score(i, TypeTraits<Float>::default_value());
+    }
+  }
+  return true;
+}
+
+bool SubscriptNode<Float>::evaluate(Error *error,
+                                    ArrayCRef<Record> records,
+                                    ArrayRef<Value> results) {
+  if (!this->fill_arg1_values(error, records) ||
+      !this->fill_arg2_values(error, records)) {
+    return false;
+  }
+  for (Int i = 0; i < records.size(); ++i) {
+    auto arg1_value = this->arg1_values_[i];
+    auto arg2_value = this->arg2_values_[i];
+    if (arg2_value < arg1_value.size()) {
+      results.set(i, arg1_value[arg2_value]);
+    } else {
+      results.set(i, TypeTraits<Float>::default_value());
+    }
   }
   return true;
 }
@@ -2404,6 +2484,8 @@ GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(Float);
 GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(GeoPoint);
 GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(Text);
 GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(Vector<Bool>);
+GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(Vector<Int>);
+GRNXX_INSTANTIATE_EXPRESSION_EVALUATE(Vector<Float>);
 #undef GRNXX_INSTANTIATE_EXPRESSION_EVALUATE
 
 template <typename T>
@@ -2581,6 +2663,12 @@ unique_ptr<Node> ExpressionBuilder::create_datum_node(
     case BOOL_VECTOR_DATA: {
       return DatumNode<Vector<Bool>>::create(error, datum.force_bool_vector());
     }
+    case INT_VECTOR_DATA: {
+      return DatumNode<Vector<Int>>::create(error, datum.force_int_vector());
+    }
+    case FLOAT_VECTOR_DATA: {
+      return DatumNode<Vector<Float>>::create(error, datum.force_float_vector());
+    }
     default: {
       // TODO: Other types are not supported yet.
       GRNXX_ERROR_SET(error, NOT_SUPPORTED_YET, "Not supported yet");
@@ -2636,6 +2724,12 @@ unique_ptr<Node> ExpressionBuilder::create_column_node(
     case BOOL_VECTOR_DATA: {
       return ColumnNode<Vector<Bool>>::create(error, column);
     }
+    case INT_VECTOR_DATA: {
+      return ColumnNode<Vector<Int>>::create(error, column);
+    }
+    case FLOAT_VECTOR_DATA: {
+      return ColumnNode<Vector<Float>>::create(error, column);
+    }
     default: {
       // TODO: Other types are not supported yet.
       GRNXX_ERROR_SET(error, NOT_SUPPORTED_YET, "Not supported yet");
@@ -2883,7 +2977,18 @@ unique_ptr<Node> ExpressionBuilder::create_equality_test_node(
           error, std::move(arg1), std::move(arg2));
     }
     case BOOL_VECTOR_DATA: {
-      return ComparisonNode<typename T:: template Comparer<Vector<Bool>>>::create(
+      typedef typename T:: template Comparer<Vector<Bool>> Functor;
+      return ComparisonNode<Functor>::create(
+          error, std::move(arg1), std::move(arg2));
+    }
+    case INT_VECTOR_DATA: {
+      typedef typename T:: template Comparer<Vector<Int>> Functor;
+      return ComparisonNode<Functor>::create(
+          error, std::move(arg1), std::move(arg2));
+    }
+    case FLOAT_VECTOR_DATA: {
+      typedef typename T:: template Comparer<Vector<Float>> Functor;
+      return ComparisonNode<Functor>::create(
           error, std::move(arg1), std::move(arg2));
     }
     // TODO: Support other types.
@@ -3000,6 +3105,14 @@ unique_ptr<Node> ExpressionBuilder::create_subscript_node(
       return SubscriptNode<Bool>::create(
           error, std::move(arg1), std::move(arg2));
     }
+    case INT_VECTOR_DATA: {
+      return SubscriptNode<Int>::create(
+          error, std::move(arg1), std::move(arg2));
+    }
+    case FLOAT_VECTOR_DATA: {
+      return SubscriptNode<Float>::create(
+          error, std::move(arg1), std::move(arg2));
+    }
     default: {
       GRNXX_ERROR_SET(error, INVALID_OPERAND, "Invalid data type");
       return nullptr;
-------------- next part --------------
HTML����������������������������...
Télécharger 



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