[Groonga-commit] groonga/groonga at a8786de [master] egn: support vector columns as output columns except Text vector columns

Back to archive index

susumu.yata null+****@clear*****
Wed Jul 8 11:54:57 JST 2015


susumu.yata	2015-07-08 11:54:57 +0900 (Wed, 08 Jul 2015)

  New Revision: a8786deb309ebe36f3995df194d860ea8386ba85
  https://github.com/groonga/groonga/commit/a8786deb309ebe36f3995df194d860ea8386ba85

  Message:
    egn: support vector columns as output columns except Text vector columns

  Modified files:
    lib/egn.cpp
    lib/grn_egn.h
    lib/grn_egn.hpp

  Modified: lib/egn.cpp (+502 -4)
===================================================================
--- lib/egn.cpp    2015-07-08 10:40:35 +0900 (78406fe)
+++ lib/egn.cpp    2015-07-08 11:54:57 +0900 (e131755)
@@ -22,6 +22,7 @@
 
 #include <cctype>
 #include <cstdio>
+#include <cstdlib>
 #include <limits>
 #include <memory>
 #include <string>
@@ -1156,6 +1157,395 @@ grn_rc ColumnNode<BoolVector>::evaluate(
   return GRN_SUCCESS;
 }
 
+// -- ColumnNode<IntVector> --
+
+template <>
+class ColumnNode<IntVector> : public TypedNode<IntVector> {
+ public:
+  ~ColumnNode() {
+    GRN_OBJ_FIN(ctx_, &buf_);
+    std::free(int_buf_);
+  }
+
+  static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) {
+    ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column);
+    if (!new_node) {
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    *node = new_node;
+    return GRN_SUCCESS;
+  }
+
+  ExpressionNodeType type() const {
+    return GRN_EGN_COLUMN_NODE;
+  }
+  grn_builtin_type builtin_type() const {
+    return static_cast<grn_builtin_type>(grn_obj_get_range(ctx_, column_));
+  }
+
+  grn_rc evaluate(
+    const Record *records, size_t num_records, IntVector *results);
+
+ private:
+  grn_ctx *ctx_;
+  grn_obj *column_;
+  grn_obj buf_;
+  grn_egn_int *int_buf_;
+
+  ColumnNode(grn_ctx *ctx, grn_obj *column)
+    : TypedNode<IntVector>(), ctx_(ctx), column_(column), buf_(),
+      int_buf_(NULL) {
+    switch (grn_obj_get_range(ctx_, column_)) {
+      case GRN_DB_INT8: {
+        GRN_INT8_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_INT16: {
+        GRN_INT16_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_INT32: {
+        GRN_INT32_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_INT64: {
+        GRN_INT64_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_UINT8: {
+        GRN_UINT8_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_UINT16: {
+        GRN_UINT16_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_UINT32: {
+        GRN_UINT32_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+      case GRN_DB_UINT64: {
+        GRN_UINT64_INIT(&buf_, GRN_OBJ_VECTOR);
+        break;
+      }
+    }
+  }
+};
+
+grn_rc ColumnNode<IntVector>::evaluate(
+  const Record *records, size_t num_records, IntVector *results) {
+  GRN_BULK_REWIND(&buf_);
+  size_t offset = 0;
+  for (size_t i = 0; i < num_records; i++) {
+    grn_obj_get_value(ctx_, column_, records[i].id, &buf_);
+    if (ctx_->rc != GRN_SUCCESS) {
+      return ctx_->rc;
+    }
+    size_t next_size = GRN_BULK_VSIZE(&buf_);
+    size_t next_offset;
+    switch (builtin_type()) {
+      case GRN_DB_INT8: {
+        next_offset = next_size / sizeof(int8_t);
+        break;
+      }
+      case GRN_DB_INT16: {
+        next_offset = next_size / sizeof(int16_t);
+        break;
+      }
+      case GRN_DB_INT32: {
+        next_offset = next_size / sizeof(int32_t);
+        break;
+      }
+      case GRN_DB_INT64: {
+        next_offset = next_size / sizeof(int64_t);
+        break;
+      }
+      case GRN_DB_UINT8: {
+        next_offset = next_size / sizeof(uint8_t);
+        break;
+      }
+      case GRN_DB_UINT16: {
+        next_offset = next_size / sizeof(uint16_t);
+        break;
+      }
+      case GRN_DB_UINT32: {
+        next_offset = next_size / sizeof(uint32_t);
+        break;
+      }
+      case GRN_DB_UINT64: {
+        next_offset = next_size / sizeof(uint64_t);
+        break;
+      }
+      default: {
+        return GRN_UNKNOWN_ERROR;
+      }
+    }
+    results[i].raw.size = next_offset - offset;
+    offset = next_offset;
+  }
+  grn_egn_int *new_buf = static_cast<grn_egn_int *>(
+    std::realloc(int_buf_, sizeof(grn_egn_int) * offset));
+  if (!new_buf) {
+    return GRN_NO_MEMORY_AVAILABLE;
+  }
+  int_buf_ = new_buf;
+  switch (builtin_type()) {
+    case GRN_DB_INT8: {
+      int8_t *ptr = reinterpret_cast<int8_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_INT16: {
+      int16_t *ptr = reinterpret_cast<int16_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_INT32: {
+      int32_t *ptr = reinterpret_cast<int32_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_INT64: {
+      int64_t *ptr = reinterpret_cast<int64_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_UINT8: {
+      uint8_t *ptr = reinterpret_cast<uint8_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_UINT16: {
+      uint16_t *ptr = reinterpret_cast<uint16_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_UINT32: {
+      uint32_t *ptr = reinterpret_cast<uint32_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    case GRN_DB_UINT64: {
+      uint64_t *ptr = reinterpret_cast<uint64_t *>(GRN_BULK_HEAD(&buf_));
+      for (size_t i = 0; i < offset; ++i) {
+        int_buf_[i] = ptr[i];
+      }
+      break;
+    }
+    default: {
+      return GRN_UNKNOWN_ERROR;
+    }
+  }
+  grn_egn_int *ptr = int_buf_;
+  for (size_t i = 0; i < num_records; i++) {
+    results[i].raw.ptr = ptr;
+    ptr += results[i].raw.size;
+  }
+  return GRN_SUCCESS;
+}
+
+// -- ColumnNode<FloatVector> --
+
+template <>
+class ColumnNode<FloatVector> : public TypedNode<FloatVector> {
+ public:
+  ~ColumnNode() {
+    GRN_OBJ_FIN(ctx_, &buf_);
+  }
+
+  static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) {
+    ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column);
+    if (!new_node) {
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    *node = new_node;
+    return GRN_SUCCESS;
+  }
+
+  ExpressionNodeType type() const {
+    return GRN_EGN_COLUMN_NODE;
+  }
+  grn_builtin_type builtin_type() const {
+    return static_cast<grn_builtin_type>(grn_obj_get_range(ctx_, column_));
+  }
+
+  grn_rc evaluate(
+    const Record *records, size_t num_records, FloatVector *results);
+
+ private:
+  grn_ctx *ctx_;
+  grn_obj *column_;
+  grn_obj buf_;
+
+  ColumnNode(grn_ctx *ctx, grn_obj *column)
+    : TypedNode<FloatVector>(), ctx_(ctx), column_(column), buf_() {
+    GRN_FLOAT_INIT(&buf_, GRN_OBJ_VECTOR);
+  }
+};
+
+grn_rc ColumnNode<FloatVector>::evaluate(
+  const Record *records, size_t num_records, FloatVector *results) {
+  GRN_BULK_REWIND(&buf_);
+  size_t offset = 0;
+  for (size_t i = 0; i < num_records; i++) {
+    grn_obj_get_value(ctx_, column_, records[i].id, &buf_);
+    if (ctx_->rc != GRN_SUCCESS) {
+      return ctx_->rc;
+    }
+    size_t next_size = GRN_BULK_VSIZE(&buf_);
+    size_t next_offset = next_size / sizeof(grn_egn_float);
+    results[i].raw.size = next_offset - offset;
+    offset = next_offset;
+  }
+  grn_egn_float *ptr = reinterpret_cast<grn_egn_float *>(GRN_BULK_HEAD(&buf_));
+  for (size_t i = 0; i < num_records; i++) {
+    results[i].raw.ptr = ptr;
+    ptr += results[i].raw.size;
+  }
+  return GRN_SUCCESS;
+}
+
+// -- ColumnNode<TimeVector> --
+
+template <>
+class ColumnNode<TimeVector> : public TypedNode<TimeVector> {
+ public:
+  ~ColumnNode() {
+    GRN_OBJ_FIN(ctx_, &buf_);
+  }
+
+  static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) {
+    ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column);
+    if (!new_node) {
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    *node = new_node;
+    return GRN_SUCCESS;
+  }
+
+  ExpressionNodeType type() const {
+    return GRN_EGN_COLUMN_NODE;
+  }
+  grn_builtin_type builtin_type() const {
+    return static_cast<grn_builtin_type>(grn_obj_get_range(ctx_, column_));
+  }
+
+  grn_rc evaluate(
+    const Record *records, size_t num_records, TimeVector *results);
+
+ private:
+  grn_ctx *ctx_;
+  grn_obj *column_;
+  grn_obj buf_;
+
+  ColumnNode(grn_ctx *ctx, grn_obj *column)
+    : TypedNode<TimeVector>(), ctx_(ctx), column_(column), buf_() {
+    GRN_TIME_INIT(&buf_, GRN_OBJ_VECTOR);
+  }
+};
+
+grn_rc ColumnNode<TimeVector>::evaluate(
+  const Record *records, size_t num_records, TimeVector *results) {
+  GRN_BULK_REWIND(&buf_);
+  size_t offset = 0;
+  for (size_t i = 0; i < num_records; i++) {
+    grn_obj_get_value(ctx_, column_, records[i].id, &buf_);
+    if (ctx_->rc != GRN_SUCCESS) {
+      return ctx_->rc;
+    }
+    size_t next_size = GRN_BULK_VSIZE(&buf_);
+    size_t next_offset = next_size / sizeof(grn_egn_time);
+    results[i].raw.size = next_offset - offset;
+    offset = next_offset;
+  }
+  grn_egn_time *ptr = reinterpret_cast<grn_egn_time *>(GRN_BULK_HEAD(&buf_));
+  for (size_t i = 0; i < num_records; i++) {
+    results[i].raw.ptr = ptr;
+    ptr += results[i].raw.size;
+  }
+  return GRN_SUCCESS;
+}
+
+// -- ColumnNode<GeoPointVector> --
+
+template <>
+class ColumnNode<GeoPointVector> : public TypedNode<GeoPointVector> {
+ public:
+  ~ColumnNode() {
+    GRN_OBJ_FIN(ctx_, &buf_);
+  }
+
+  static grn_rc open(grn_ctx *ctx, grn_obj *column, ExpressionNode **node) {
+    ColumnNode *new_node = new (std::nothrow) ColumnNode(ctx, column);
+    if (!new_node) {
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    *node = new_node;
+    return GRN_SUCCESS;
+  }
+
+  ExpressionNodeType type() const {
+    return GRN_EGN_COLUMN_NODE;
+  }
+  grn_builtin_type builtin_type() const {
+    return static_cast<grn_builtin_type>(grn_obj_get_range(ctx_, column_));
+  }
+
+  grn_rc evaluate(
+    const Record *records, size_t num_records, GeoPointVector *results);
+
+ private:
+  grn_ctx *ctx_;
+  grn_obj *column_;
+  grn_obj buf_;
+
+  ColumnNode(grn_ctx *ctx, grn_obj *column)
+    : TypedNode<GeoPointVector>(), ctx_(ctx), column_(column), buf_() {
+    if (grn_obj_get_range(ctx_, column_) == GRN_DB_TOKYO_GEO_POINT) {
+      GRN_TOKYO_GEO_POINT_INIT(&buf_, GRN_OBJ_VECTOR);
+    } else {
+      GRN_WGS84_GEO_POINT_INIT(&buf_, GRN_OBJ_VECTOR);
+    }
+  }
+};
+
+grn_rc ColumnNode<GeoPointVector>::evaluate(
+  const Record *records, size_t num_records, GeoPointVector *results) {
+  GRN_BULK_REWIND(&buf_);
+  size_t offset = 0;
+  for (size_t i = 0; i < num_records; i++) {
+    grn_obj_get_value(ctx_, column_, records[i].id, &buf_);
+    if (ctx_->rc != GRN_SUCCESS) {
+      return ctx_->rc;
+    }
+    size_t next_size = GRN_BULK_VSIZE(&buf_);
+    size_t next_offset = next_size / sizeof(grn_egn_geo_point);
+    results[i].raw.size = next_offset - offset;
+    offset = next_offset;
+  }
+  grn_egn_geo_point *ptr =
+    reinterpret_cast<grn_egn_geo_point *>(GRN_BULK_HEAD(&buf_));
+  for (size_t i = 0; i < num_records; i++) {
+    results[i].raw.ptr = ptr;
+    ptr += results[i].raw.size;
+  }
+  return GRN_SUCCESS;
+}
+
 // -- OperatorNode --
 
 template <typename T>
@@ -2903,6 +3293,30 @@ grn_rc Expression::push_column_object(grn_obj *obj) {
               rc = ColumnNode<BoolVector>::open(ctx_, obj, &node);
               break;
             }
+            case GRN_DB_INT8:
+            case GRN_DB_INT16:
+            case GRN_DB_INT32:
+            case GRN_DB_INT64:
+            case GRN_DB_UINT8:
+            case GRN_DB_UINT16:
+            case GRN_DB_UINT32:
+            case GRN_DB_UINT64: {
+              rc = ColumnNode<IntVector>::open(ctx_, obj, &node);
+              break;
+            }
+            case GRN_DB_FLOAT: {
+              rc = ColumnNode<FloatVector>::open(ctx_, obj, &node);
+              break;
+            }
+            case GRN_DB_TIME: {
+              rc = ColumnNode<TimeVector>::open(ctx_, obj, &node);
+              break;
+            }
+            case GRN_DB_TOKYO_GEO_POINT:
+            case GRN_DB_WGS84_GEO_POINT: {
+              rc = ColumnNode<GeoPointVector>::open(ctx_, obj, &node);
+              break;
+            }
             default: {
               return GRN_INVALID_ARGUMENT;
             }
@@ -3296,7 +3710,8 @@ grn_egn_select_output(grn_ctx *ctx, grn_obj *table,
         GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Bool");
         break;
       }
-      case GRN_EGN_INT: {
+      case GRN_EGN_INT:
+      case GRN_EGN_INT_VECTOR: {
         switch (expressions[i]->builtin_type()) {
           case GRN_DB_INT8: {
             GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Int8");
@@ -3337,11 +3752,13 @@ grn_egn_select_output(grn_ctx *ctx, grn_obj *table,
         }
         break;
       }
-      case GRN_EGN_FLOAT: {
+      case GRN_EGN_FLOAT:
+      case GRN_EGN_FLOAT_VECTOR: {
         GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Float");
         break;
       }
-      case GRN_EGN_TIME: {
+      case GRN_EGN_TIME:
+      case GRN_EGN_TIME_VECTOR: {
         GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "Time");
         break;
       }
@@ -3366,7 +3783,8 @@ grn_egn_select_output(grn_ctx *ctx, grn_obj *table,
         }
         break;
       }
-      case GRN_EGN_GEO_POINT: {
+      case GRN_EGN_GEO_POINT:
+      case GRN_EGN_GEO_POINT_VECTOR: {
         switch (expressions[i]->builtin_type()) {
           case GRN_DB_TOKYO_GEO_POINT: {
             GRN_TEXT_PUTS(ctx, ctx->impl->outbuf, "TokyoGeoPoint");
@@ -3444,6 +3862,30 @@ grn_egn_select_output(grn_ctx *ctx, grn_obj *table,
                                      (grn::egn::BoolVector *)&bufs[i][0]);
             break;
           }
+          case GRN_EGN_INT_VECTOR: {
+            bufs[i].resize(sizeof(grn_egn_int_vector) * batch_size);
+            expressions[i]->evaluate(records + count, batch_size,
+                                     (grn::egn::IntVector *)&bufs[i][0]);
+            break;
+          }
+          case GRN_EGN_FLOAT_VECTOR: {
+            bufs[i].resize(sizeof(grn_egn_float_vector) * batch_size);
+            expressions[i]->evaluate(records + count, batch_size,
+                                     (grn::egn::FloatVector *)&bufs[i][0]);
+            break;
+          }
+          case GRN_EGN_TIME_VECTOR: {
+            bufs[i].resize(sizeof(grn_egn_time_vector) * batch_size);
+            expressions[i]->evaluate(records + count, batch_size,
+                                     (grn::egn::TimeVector *)&bufs[i][0]);
+            break;
+          }
+          case GRN_EGN_GEO_POINT_VECTOR: {
+            bufs[i].resize(sizeof(grn_egn_geo_point_vector) * batch_size);
+            expressions[i]->evaluate(records + count, batch_size,
+                                     (grn::egn::GeoPointVector *)&bufs[i][0]);
+            break;
+          }
           default: {
             break;
           }
@@ -3511,6 +3953,62 @@ grn_egn_select_output(grn_ctx *ctx, grn_obj *table,
               GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ']');
               break;
             }
+            case GRN_EGN_INT_VECTOR: {
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '[');
+              grn_egn_int_vector value =
+                ((grn_egn_int_vector *)&bufs[j][0])[i];
+              for (size_t k = 0; k < value.size; ++k) {
+                if (k != 0) {
+                  GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
+                }
+                grn_text_lltoa(ctx, ctx->impl->outbuf, value.ptr[k]);
+              }
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ']');
+              break;
+            }
+            case GRN_EGN_FLOAT_VECTOR: {
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '[');
+              grn_egn_float_vector value =
+                ((grn_egn_float_vector *)&bufs[j][0])[i];
+              for (size_t k = 0; k < value.size; ++k) {
+                if (k != 0) {
+                  GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
+                }
+                grn_text_ftoa(ctx, ctx->impl->outbuf, value.ptr[k]);
+              }
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ']');
+              break;
+            }
+            case GRN_EGN_TIME_VECTOR: {
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '[');
+              grn_egn_time_vector value =
+                ((grn_egn_time_vector *)&bufs[j][0])[i];
+              for (size_t k = 0; k < value.size; ++k) {
+                if (k != 0) {
+                  GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
+                }
+                grn_text_ftoa(ctx, ctx->impl->outbuf, value.ptr[k] * 0.000001);
+              }
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ']');
+              break;
+            }
+            case GRN_EGN_GEO_POINT_VECTOR: {
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '[');
+              grn_egn_geo_point_vector value =
+                ((grn_egn_geo_point_vector *)&bufs[j][0])[i];
+              for (size_t k = 0; k < value.size; ++k) {
+                if (k != 0) {
+                  GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ',');
+                }
+                GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '"');
+                grn_text_itoa(ctx, ctx->impl->outbuf, value.ptr[k].latitude);
+                GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, 'x');
+                grn_text_itoa(ctx, ctx->impl->outbuf, value.ptr[k].longitude);
+                GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, '"');
+              }
+              GRN_TEXT_PUTC(ctx, ctx->impl->outbuf, ']');
+              break;
+            }
             default: {
               break;
             }

  Modified: lib/grn_egn.h (+20 -20)
===================================================================
--- lib/grn_egn.h    2015-07-08 10:40:35 +0900 (55ad06c)
+++ lib/grn_egn.h    2015-07-08 11:54:57 +0900 (b41205c)
@@ -95,26 +95,26 @@ typedef struct {
   const grn_egn_bool *ptr;
   size_t size;
 } grn_egn_bool_vector;
-//typedef struct {
-//  const grn_egn_int *ptr;
-//  size_t size;
-//} grn_egn_int_vector;
-//typedef struct {
-//  const grn_egn_float *ptr;
-//  size_t size;
-//} grn_egn_float_vector;
-//typedef struct {
-//  const grn_egn_time *ptr;
-//  size_t size;
-//} grn_egn_time_vector;
-//typedef struct {
-//  const grn_egn_text *ptr;
-//  size_t size;
-//} grn_egn_text_vector;
-//typedef struct {
-//  const grn_egn_geo_point *ptr;
-//  size_t size;
-//} grn_egn_geo_point_vector;
+typedef struct {
+  const grn_egn_int *ptr;
+  size_t size;
+} grn_egn_int_vector;
+typedef struct {
+  const grn_egn_float *ptr;
+  size_t size;
+} grn_egn_float_vector;
+typedef struct {
+  const grn_egn_time *ptr;
+  size_t size;
+} grn_egn_time_vector;
+typedef struct {
+  const grn_egn_text *ptr;
+  size_t size;
+} grn_egn_text_vector;
+typedef struct {
+  const grn_egn_geo_point *ptr;
+  size_t size;
+} grn_egn_geo_point_vector;
 
 /*
  * grn_egn_select() finds records passing through a filter (specified by

  Modified: lib/grn_egn.hpp (+90 -90)
===================================================================
--- lib/grn_egn.hpp    2015-07-08 10:40:35 +0900 (657fc9c)
+++ lib/grn_egn.hpp    2015-07-08 11:54:57 +0900 (f91c00a)
@@ -230,96 +230,96 @@ struct BoolVector {
   ~BoolVector() {}
 };
 
-//struct IntVector {
-//  typedef grn_egn_int_vector Raw;
-//  Raw raw;
-
-//  static DataType data_type() {
-//    return GRN_EGN_INT_VECTOR;
-//  }
-//  static grn_builtin_type default_builtin_type() {
-//    return GRN_DB_INT64;
-//  }
-
-//  IntVector() : raw() {}
-//  IntVector(const IntVector &value) : raw(value.raw) {}
-//  explicit IntVector(const Raw &value) : raw(value) {}
-//  IntVector(const grn_egn_int *ptr, size_t size) : raw((Raw){ptr, size}) {}
-//  ~IntVector() {}
-//};
-
-//struct FloatVector {
-//  typedef grn_egn_float_vector Raw;
-//  Raw raw;
-
-//  static DataType data_type() {
-//    return GRN_EGN_FLOAT_VECTOR;
-//  }
-//  static grn_builtin_type default_builtin_type() {
-//    return GRN_DB_FLOAT;
-//  }
-
-//  FloatVector() : raw() {}
-//  FloatVector(const FloatVector &value) : raw(value.raw) {}
-//  explicit FloatVector(const Raw &value) : raw(value) {}
-//  FloatVector(const grn_egn_float *ptr, size_t size) : raw((Raw){ptr, size}) {}
-//  ~FloatVector() {}
-//};
-
-//struct TimeVector {
-//  typedef grn_egn_time_vector Raw;
-//  Raw raw;
-
-//  static DataType data_type() {
-//    return GRN_EGN_INT_VECTOR;
-//  }
-//  static grn_builtin_type default_builtin_type() {
-//    return GRN_DB_INT64;
-//  }
-
-//  TimeVector() : raw() {}
-//  TimeVector(const TimeVector &value) : raw(value.raw) {}
-//  explicit TimeVector(const Raw &value) : raw(value) {}
-//  TimeVector(const grn_egn_time *ptr, size_t size) : raw((Raw){ptr, size}) {}
-//  ~TimeVector() {}
-//};
-
-//struct TextVector {
-//  typedef grn_egn_text_vector Raw;
-//  Raw raw;
-
-//  static DataType data_type() {
-//    return GRN_EGN_TEXT_VECTOR;
-//  }
-//  static grn_builtin_type default_builtin_type() {
-//    return GRN_DB_TEXT;
-//  }
-
-//  TextVector() : raw() {}
-//  TextVector(const TextVector &value) : raw(value.raw) {}
-//  explicit TextVector(const Raw &value) : raw(value) {}
-//  TextVector(const grn_egn_text *ptr, size_t size) : raw((Raw){ptr, size}) {}
-//  ~TextVector() {}
-//};
-
-//struct GeoPointVector {
-//  typedef grn_egn_geo_point_vector Raw;
-//  Raw raw;
-
-//  static DataType data_type() {
-//    return GRN_EGN_GEO_POINT_VECTOR;
-//  }
-//  static grn_builtin_type default_builtin_type() {
-//    return GRN_DB_VOID;
-//  }
-
-//  GeoPointVector() : raw() {}
-//  GeoPointVector(const GeoPointVector &value) : raw(value.raw) {}
-//  explicit GeoPointVector(const Raw &value) : raw(value) {}
-//  GeoPointVector(const grn_egn_geo_point *ptr, size_t size)
-//    : raw((Raw){ptr, size}) {}
-//  ~GeoPointVector() {}
-//};
+struct IntVector {
+  typedef grn_egn_int_vector Raw;
+  Raw raw;
+
+  static DataType data_type() {
+    return GRN_EGN_INT_VECTOR;
+  }
+  static grn_builtin_type default_builtin_type() {
+    return GRN_DB_INT64;
+  }
+
+  IntVector() : raw() {}
+  IntVector(const IntVector &value) : raw(value.raw) {}
+  explicit IntVector(const Raw &value) : raw(value) {}
+  IntVector(const grn_egn_int *ptr, size_t size) : raw((Raw){ptr, size}) {}
+  ~IntVector() {}
+};
+
+struct FloatVector {
+  typedef grn_egn_float_vector Raw;
+  Raw raw;
+
+  static DataType data_type() {
+    return GRN_EGN_FLOAT_VECTOR;
+  }
+  static grn_builtin_type default_builtin_type() {
+    return GRN_DB_FLOAT;
+  }
+
+  FloatVector() : raw() {}
+  FloatVector(const FloatVector &value) : raw(value.raw) {}
+  explicit FloatVector(const Raw &value) : raw(value) {}
+  FloatVector(const grn_egn_float *ptr, size_t size) : raw((Raw){ptr, size}) {}
+  ~FloatVector() {}
+};
+
+struct TimeVector {
+  typedef grn_egn_time_vector Raw;
+  Raw raw;
+
+  static DataType data_type() {
+    return GRN_EGN_INT_VECTOR;
+  }
+  static grn_builtin_type default_builtin_type() {
+    return GRN_DB_INT64;
+  }
+
+  TimeVector() : raw() {}
+  TimeVector(const TimeVector &value) : raw(value.raw) {}
+  explicit TimeVector(const Raw &value) : raw(value) {}
+  TimeVector(const grn_egn_time *ptr, size_t size) : raw((Raw){ptr, size}) {}
+  ~TimeVector() {}
+};
+
+struct TextVector {
+  typedef grn_egn_text_vector Raw;
+  Raw raw;
+
+  static DataType data_type() {
+    return GRN_EGN_TEXT_VECTOR;
+  }
+  static grn_builtin_type default_builtin_type() {
+    return GRN_DB_TEXT;
+  }
+
+  TextVector() : raw() {}
+  TextVector(const TextVector &value) : raw(value.raw) {}
+  explicit TextVector(const Raw &value) : raw(value) {}
+  TextVector(const grn_egn_text *ptr, size_t size) : raw((Raw){ptr, size}) {}
+  ~TextVector() {}
+};
+
+struct GeoPointVector {
+  typedef grn_egn_geo_point_vector Raw;
+  Raw raw;
+
+  static DataType data_type() {
+    return GRN_EGN_GEO_POINT_VECTOR;
+  }
+  static grn_builtin_type default_builtin_type() {
+    return GRN_DB_VOID;
+  }
+
+  GeoPointVector() : raw() {}
+  GeoPointVector(const GeoPointVector &value) : raw(value.raw) {}
+  explicit GeoPointVector(const Raw &value) : raw(value) {}
+  GeoPointVector(const grn_egn_geo_point *ptr, size_t size)
+    : raw((Raw){ptr, size}) {}
+  ~GeoPointVector() {}
+};
 
 // Cursor is a base class which provides an interface for sequential access to
 // records.
-------------- next part --------------
HTML����������������������������...
Télécharger 



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