susumu.yata
null+****@clear*****
Tue Dec 16 10:43:47 JST 2014
susumu.yata 2014-11-17 18:25:19 +0900 (Mon, 17 Nov 2014) New Revision: 872c23295388df6649b19fcba5d1fe477dcaab8b https://github.com/groonga/grnxx/commit/872c23295388df6649b19fcba5d1fe477dcaab8b Message: Update ConstantNode to support Vector<T>. (#104). Modified files: include/grnxx/expression.hpp lib/grnxx/impl/expression.cpp lib/grnxx/impl/expression.hpp Modified: include/grnxx/expression.hpp (+22 -0) =================================================================== --- include/grnxx/expression.hpp 2014-11-17 18:03:17 +0900 (bb26685) +++ include/grnxx/expression.hpp 2014-11-17 18:25:19 +0900 (f86b129) @@ -145,6 +145,17 @@ class Expression { Array<GeoPoint> *results) = 0; virtual void evaluate(ArrayCRef<Record> records, Array<Text> *results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + Array<Vector<Bool>> *results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + Array<Vector<Int>> *results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + Array<Vector<Float>> *results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + Array<Vector<GeoPoint>> *results) = 0; + // TODO +// virtual void evaluate(ArrayCRef<Record> records, +// Array<Vector<Text>> *results) = 0; // Evaluate the expression. // @@ -165,6 +176,17 @@ class Expression { ArrayRef<GeoPoint> results) = 0; virtual void evaluate(ArrayCRef<Record> records, ArrayRef<Text> results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Bool>> results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Int>> results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Float>> results) = 0; + virtual void evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<GeoPoint>> results) = 0; + // TODO +// virtual void evaluate(ArrayCRef<Record> records, +// ArrayRef<Vector<Text>> results) = 0; }; class ExpressionBuilder { Modified: lib/grnxx/impl/expression.cpp (+93 -12) =================================================================== --- lib/grnxx/impl/expression.cpp 2014-11-17 18:03:17 +0900 (eb648e7) +++ lib/grnxx/impl/expression.cpp 2014-11-17 18:25:19 +0900 (ff6ab65) @@ -261,6 +261,36 @@ class ConstantNode<Text> : public TypedNode<Text> { String value_; }; +// TODO: Vector will have ownership in future. +template <typename T> +class ConstantNode<Vector<T>> : public TypedNode<Vector<T>> { + public: + using Value = Vector<T>; + + explicit ConstantNode(const Value &value) + : TypedNode<Value>(), + value_() { + size_t value_size = value.size().value(); + value_.resize(value_size); + for (size_t i = 0; i < value_size; ++i) { + value_[i] = value[i]; + } + } + + NodeType node_type() const { + return CONSTANT_NODE; + } + + void evaluate(ArrayCRef<Record> records, ArrayRef<Value> results) { + for (size_t i = 0; i < records.size(); ++i) { + results[i] = Value(value_.data(), value_.size()); + } + } + + private: + Array<T> value_; +}; + // -- RowIDNode -- class RowIDNode : public TypedNode<Int> { @@ -1348,6 +1378,32 @@ void Expression::evaluate(ArrayCRef<Record> records, } void Expression::evaluate(ArrayCRef<Record> records, + Array<Vector<Bool>> *results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + Array<Vector<Int>> *results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + Array<Vector<Float>> *results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + Array<Vector<GeoPoint>> *results) { + _evaluate(records, results); +} + +// TODO +//void Expression::evaluate(ArrayCRef<Record> records, +// Array<Vector<Text>> *results) { +// _evaluate(records, results); +//} + +void Expression::evaluate(ArrayCRef<Record> records, ArrayRef<Bool> results) { _evaluate(records, results); } @@ -1372,6 +1428,31 @@ void Expression::evaluate(ArrayCRef<Record> records, _evaluate(records, results); } +void Expression::evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Bool>> results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Int>> results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<Float>> results) { + _evaluate(records, results); +} + +void Expression::evaluate(ArrayCRef<Record> records, + ArrayRef<Vector<GeoPoint>> results) { + _evaluate(records, results); +} + +//void Expression::evaluate(ArrayCRef<Record> records, +// ArrayRef<Vector<Text>> results) { +// _evaluate(records, results); +//} + template <typename T> void Expression::_evaluate(ArrayCRef<Record> records, Array<T> *results) { results->resize(records.size()); @@ -1588,18 +1669,18 @@ Node *ExpressionBuilder::create_constant_node( case TEXT_DATA: { return new ConstantNode<Text>(datum.as_text()); } -// case BOOL_VECTOR_DATA: { -// return new ConstantNode<Vector<Bool>>(datum.as_bool_vector()); -// } -// case INT_VECTOR_DATA: { -// return new ConstantNode<Vector<Int>>(datum.as_int_vector()); -// } -// case FLOAT_VECTOR_DATA: { -// return new ConstantNode<Vector<Float>>(datum.as_float_vector()); -// } -// case GEO_POINT_VECTOR_DATA: { -// return new ConstantNode<Vector<GeoPoint>>(datum.as_geo_point_vector()); -// } + case BOOL_VECTOR_DATA: { + return new ConstantNode<Vector<Bool>>(datum.as_bool_vector()); + } + case INT_VECTOR_DATA: { + return new ConstantNode<Vector<Int>>(datum.as_int_vector()); + } + case FLOAT_VECTOR_DATA: { + return new ConstantNode<Vector<Float>>(datum.as_float_vector()); + } + case GEO_POINT_VECTOR_DATA: { + return new ConstantNode<Vector<GeoPoint>>(datum.as_geo_point_vector()); + } // case TEXT_VECTOR_DATA: { // return new ConstantNode<Vector<Text>>(datum.as_text_vector()); // } Modified: lib/grnxx/impl/expression.hpp (+12 -0) =================================================================== --- lib/grnxx/impl/expression.hpp 2014-11-17 18:03:17 +0900 (6c05306) +++ lib/grnxx/impl/expression.hpp 2014-11-17 18:25:19 +0900 (2894886) @@ -50,12 +50,24 @@ class Expression : public ExpressionInterface { void evaluate(ArrayCRef<Record> records, Array<Float> *results); void evaluate(ArrayCRef<Record> records, Array<GeoPoint> *results); void evaluate(ArrayCRef<Record> records, Array<Text> *results); + void evaluate(ArrayCRef<Record> records, Array<Vector<Bool>> *results); + void evaluate(ArrayCRef<Record> records, Array<Vector<Int>> *results); + void evaluate(ArrayCRef<Record> records, Array<Vector<Float>> *results); + void evaluate(ArrayCRef<Record> records, Array<Vector<GeoPoint>> *results); + // TODO +// void evaluate(ArrayCRef<Record> records, Array<Vector<Text>> *results); void evaluate(ArrayCRef<Record> records, ArrayRef<Bool> results); void evaluate(ArrayCRef<Record> records, ArrayRef<Int> results); void evaluate(ArrayCRef<Record> records, ArrayRef<Float> results); void evaluate(ArrayCRef<Record> records, ArrayRef<GeoPoint> results); void evaluate(ArrayCRef<Record> records, ArrayRef<Text> results); + void evaluate(ArrayCRef<Record> records, ArrayRef<Vector<Bool>> results); + void evaluate(ArrayCRef<Record> records, ArrayRef<Vector<Int>> results); + void evaluate(ArrayCRef<Record> records, ArrayRef<Vector<Float>> results); + void evaluate(ArrayCRef<Record> records, ArrayRef<Vector<GeoPoint>> results); + // TODO +// void evaluate(ArrayCRef<Record> records, ArrayRef<Vector<Text>> results); private: const Table *table_; -------------- next part -------------- HTML����������������������������...다운로드