[Groonga-commit] groonga/groonga at 59e5a66 [master] Really support weight in uvector

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Jul 9 22:58:41 JST 2014


Kouhei Sutou	2014-07-09 22:58:41 +0900 (Wed, 09 Jul 2014)

  New Revision: 59e5a66662f177878e8fb96dfb43585ef3ca7414
  https://github.com/groonga/groonga/commit/59e5a66662f177878e8fb96dfb43585ef3ca7414

  Merged 9442a12: Merge pull request #181 from groonga/support-uvector-with-weight

  Message:
    Really support weight in uvector
    
    The current bulk stores its value size into flags field when value
    embedded mode (= !GRN_BULK_OUTP(bulk)). We can't use flags field to
    store GRN_OBJ_WITH_WEIGHT flag when the bulk is value embedded mode.
    
    This commit changes flags behavior in value embedded mode. The current
    GRN_BULK_BUFSIZE is 24 bytes. So we can use higher order bits in flags
    field. To use higher order bits in flags field, this change use mask
    to get value size in value embedded mode.
    
    This change will not break API and ABI. But we need to rebuild related
    codes that use uvector with weight. Rroonga will be the code. It will
    not be a problem because there are no these codes for now. Newer codes
    must be built.
    
    TODO:
    * Support outputting uvector with weight in select command and dump command.

  Modified files:
    include/groonga.h
    lib/db.c
    lib/str.c

  Modified: include/groonga.h (+8 -5)
===================================================================
--- include/groonga.h    2014-07-09 22:32:15 +0900 (1f10ac3)
+++ include/groonga.h    2014-07-09 22:58:41 +0900 (ca0562c)
@@ -1141,6 +1141,9 @@ GRN_API const char *grn_default_query_logger_get_path(void);
 /* grn_bulk */
 
 #define GRN_BULK_BUFSIZE (sizeof(grn_obj) - sizeof(grn_obj_header))
+/* This assumes that GRN_BULK_BUFSIZE is less than 32 (= 0x20). */
+#define GRN_BULK_BUFSIZE_MAX 0x1f
+#define GRN_BULK_SIZE_IN_FLAGS(flags) ((flags) & GRN_BULK_BUFSIZE_MAX)
 #define GRN_BULK_OUTP(bulk) ((bulk)->header.impl_flags & GRN_OBJ_OUTPLACE)
 #define GRN_BULK_REWIND(bulk) do {\
   if ((bulk)->header.type == GRN_VECTOR) {\
@@ -1149,7 +1152,7 @@ GRN_API const char *grn_default_query_logger_get_path(void);
       if (GRN_BULK_OUTP(_body)) {\
         (_body)->u.b.curr = (_body)->u.b.head;\
       } else {\
-        (_body)->header.flags = 0;\
+        (_body)->header.flags &= ~GRN_BULK_BUFSIZE_MAX;\
       }\
     }\
     (bulk)->u.v.n_sections = 0;\
@@ -1157,7 +1160,7 @@ GRN_API const char *grn_default_query_logger_get_path(void);
     if (GRN_BULK_OUTP(bulk)) {\
       (bulk)->u.b.curr = (bulk)->u.b.head;\
     } else {\
-      (bulk)->header.flags = 0;\
+      (bulk)->header.flags &= ~GRN_BULK_BUFSIZE_MAX;\
     }\
   }\
 } while (0)
@@ -1172,11 +1175,11 @@ GRN_API const char *grn_default_query_logger_get_path(void);
 #define GRN_BULK_VSIZE(bulk) \
   (GRN_BULK_OUTP(bulk)\
    ? ((bulk)->u.b.curr - (bulk)->u.b.head)\
-   : (bulk)->header.flags)
+   : GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags))
 #define GRN_BULK_EMPTYP(bulk) \
   (GRN_BULK_OUTP(bulk)\
    ? ((bulk)->u.b.curr == (bulk)->u.b.head)\
-   : !((bulk)->header.flags))
+   : !(GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags)))
 #define GRN_BULK_HEAD(bulk) \
   (GRN_BULK_OUTP(bulk)\
    ? ((bulk)->u.b.head)\
@@ -1184,7 +1187,7 @@ GRN_API const char *grn_default_query_logger_get_path(void);
 #define GRN_BULK_CURR(bulk) \
   (GRN_BULK_OUTP(bulk)\
    ? ((bulk)->u.b.curr)\
-   : (char *)&((bulk)->u.b.head) + (bulk)->header.flags)
+   : (char *)&((bulk)->u.b.head) + GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags))
 #define GRN_BULK_TAIL(bulk) \
   (GRN_BULK_OUTP(bulk)\
    ? ((bulk)->u.b.tail)\

  Modified: lib/db.c (+6 -6)
===================================================================
--- lib/db.c    2014-07-09 22:32:15 +0900 (0bc37b8)
+++ lib/db.c    2014-07-09 22:58:41 +0900 (93b32af)
@@ -37,7 +37,7 @@ typedef struct {
   unsigned int weight;
 } weight_uvector_entry;
 
-#define IS_WEIGHT_UVECTOR(obj) ((obj)->header.impl_flags & GRN_OBJ_WITH_WEIGHT)
+#define IS_WEIGHT_UVECTOR(obj) ((obj)->header.flags & GRN_OBJ_WITH_WEIGHT)
 
 #define NEXT_ADDR(p) (((byte *)(p)) + sizeof(*(p)))
 
@@ -5625,7 +5625,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column,
   if (need_convert) {
     unsigned int i, n;
     GRN_VALUE_FIX_SIZE_INIT(&uvector, GRN_OBJ_VECTOR, value->header.domain);
-    uvector.header.impl_flags |= uvector_flags;
+    uvector.header.flags |= uvector_flags;
     n = grn_uvector_size(ctx, value);
     for (i = 0; i < n; i++) {
       grn_id id;
@@ -5982,9 +5982,9 @@ grn_obj_get_value_column_vector(grn_ctx *ctx, grn_obj *obj,
     grn_ja_get_value(ctx, (grn_ja *)obj, id, value);
     value->header.type = GRN_UVECTOR;
     if (obj->header.flags & GRN_OBJ_WITH_WEIGHT) {
-      value->header.impl_flags |= GRN_OBJ_WITH_WEIGHT;
+      value->header.flags |= GRN_OBJ_WITH_WEIGHT;
     } else {
-      value->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT;
+      value->header.flags &= ~GRN_OBJ_WITH_WEIGHT;
     }
   }
 
@@ -8099,7 +8099,7 @@ grn_obj_ensure_vector(grn_ctx *ctx, grn_obj *obj)
 {
   if (obj->header.type != GRN_VECTOR) { grn_bulk_fin(ctx, obj); }
   obj->header.type = GRN_VECTOR;
-  obj->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT;
+  obj->header.flags &= ~GRN_OBJ_WITH_WEIGHT;
 }
 
 static void
@@ -8107,7 +8107,7 @@ grn_obj_ensure_bulk(grn_ctx *ctx, grn_obj *obj)
 {
   if (obj->header.type == GRN_VECTOR) { VECTOR_CLEAR(ctx, obj); }
   obj->header.type = GRN_BULK;
-  obj->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT;
+  obj->header.flags &= ~GRN_OBJ_WITH_WEIGHT;
 }
 
 grn_rc

  Modified: lib/str.c (+2 -1)
===================================================================
--- lib/str.c    2014-07-09 22:32:15 +0900 (08cdbe0)
+++ lib/str.c    2014-07-09 22:58:41 +0900 (111e881)
@@ -2000,7 +2000,8 @@ grn_bulk_truncate(grn_ctx *ctx, grn_obj *bulk, unsigned int len)
     if (GRN_BULK_BUFSIZE < len) {
       return grn_bulk_space_clear(ctx, bulk, len);
     } else {
-      bulk->header.flags = len;
+      bulk->header.flags &= ~GRN_BULK_BUFSIZE_MAX;
+      bulk->header.flags += len;
     }
   }
   return GRN_SUCCESS;
-------------- next part --------------
HTML����������������������������...
Download 



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