[Groonga-commit] groonga/groonga [master] Added GRN_OBJ_KEY_GEO_POINT.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 6月 30日 (水) 14:20:26 JST


Daijiro MORI	2010-06-30 05:20:26 +0000 (Wed, 30 Jun 2010)

  New Revision: b5581a97604e73c454e7fc2967bea24112aa7c31

  Log:
    Added GRN_OBJ_KEY_GEO_POINT.

  Modified files:
    groonga.h
    lib/db.c
    lib/pat.c

  Modified: groonga.h (+1 -0)
===================================================================
--- groonga.h    2010-06-29 14:10:52 +0000 (c60582c)
+++ groonga.h    2010-06-30 05:20:26 +0000 (04c35c5)
@@ -252,6 +252,7 @@ typedef unsigned short int grn_obj_flags;
 #define GRN_OBJ_KEY_UINT               (0x00<<3)
 #define GRN_OBJ_KEY_INT                (0x01<<3)
 #define GRN_OBJ_KEY_FLOAT              (0x02<<3)
+#define GRN_OBJ_KEY_GEO_POINT          (0x03<<3)
 
 #define GRN_OBJ_KEY_WITH_SIS           (0x01<<6)
 #define GRN_OBJ_KEY_NORMALIZE          (0x01<<7)

  Modified: lib/db.c (+3 -2)
===================================================================
--- lib/db.c    2010-06-29 14:10:52 +0000 (5b4ca2c)
+++ lib/db.c    2010-06-30 05:20:26 +0000 (3cf15d9)
@@ -6452,6 +6452,7 @@ grn_table_sort(grn_ctx *ctx, grn_obj *table, int offset, int limit,
             uint8_t key_type = range->header.flags & GRN_OBJ_KEY_MASK;
             switch (key_type) {
             case GRN_OBJ_KEY_UINT :
+            case GRN_OBJ_KEY_GEO_POINT :
               switch (GRN_TYPE_SIZE(DB_OBJ(range))) {
               case 1 :
                 kp->offset = KEY_UINT8;
@@ -6594,10 +6595,10 @@ grn_db_init_builtin_types(grn_ctx *ctx)
                 GRN_OBJ_KEY_VAR_SIZE, 1 << 31);
   if (!obj || DB_OBJ(obj)->id != GRN_DB_LONG_TEXT) { return GRN_FILE_CORRUPT; }
   obj = deftype(ctx, "TokyoGeoPoint",
-                GRN_OBJ_KEY_UINT, sizeof(grn_geo_point));
+                GRN_OBJ_KEY_GEO_POINT, sizeof(grn_geo_point));
   if (!obj || DB_OBJ(obj)->id != GRN_DB_TOKYO_GEO_POINT) { return GRN_FILE_CORRUPT; }
   obj = deftype(ctx, "WGS84GeoPoint",
-                GRN_OBJ_KEY_UINT, sizeof(grn_geo_point));
+                GRN_OBJ_KEY_GEO_POINT, sizeof(grn_geo_point));
   if (!obj || DB_OBJ(obj)->id != GRN_DB_WGS84_GEO_POINT) { return GRN_FILE_CORRUPT; }
   for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < GRN_DB_MECAB; id++) {
     grn_itoh(id, buf + 3, 2);

  Modified: lib/pat.c (+48 -2)
===================================================================
--- lib/pat.c    2010-06-29 14:10:52 +0000 (5080f24)
+++ lib/pat.c    2010-06-30 05:20:26 +0000 (ac8e233)
@@ -647,6 +647,40 @@ chop(grn_ctx *ctx, grn_pat *pat, const char **key, const char *end, uint32_t *lk
   }
 }
 
+static void
+grn_gton(uint8_t *keybuf, const void *key, uint32_t size)
+{
+  int la = ((grn_geo_point *)key)->latitude;
+  int lo = ((grn_geo_point *)key)->longitude;
+  uint8_t *p = keybuf;
+  int i = 32;
+  while (i) {
+    i -= 4;
+    *p++ = ((((la >> i) & 8) << 4) + (((lo >> i) & 8) << 3) +
+            (((la >> i) & 4) << 3) + (((lo >> i) & 4) << 2) +
+            (((la >> i) & 2) << 2) + (((lo >> i) & 2) << 1) +
+            (((la >> i) & 1) << 1) + (((lo >> i) & 1) << 0));
+  }
+}
+
+static void
+grn_ntog(uint8_t *keybuf, uint8_t *key, uint32_t size)
+{
+  int la = 0, lo = 0;
+  uint8_t v, *p = key;
+  int i = 32;
+  while (size--) {
+    i -= 4;
+    v = *p++;
+    la += (((v & 128) >> 4) + ((v &  32) >> 3) +
+           ((v &   8) >> 2) + ((v &   2) >> 1)) << i;
+    lo += (((v &  64) >> 3) + ((v &  16) >> 2) +
+           ((v &   4) >> 1) + ((v &   1) >> 0)) << i;
+  }
+  ((grn_geo_point *)keybuf)->latitude = la;
+  ((grn_geo_point *)keybuf)->longitude = lo;
+}
+
 #define MAX_FIXED_KEY_SIZE (sizeof(int64_t))
 
 #define KEY_NEEDS_CONVERT(pat,size) \
@@ -655,7 +689,13 @@ chop(grn_ctx *ctx, grn_pat *pat, const char **key, const char *end, uint32_t *lk
 #define KEY_ENC(pat,keybuf,key,size) {\
   switch ((pat)->obj.header.flags & GRN_OBJ_KEY_MASK) {\
   case GRN_OBJ_KEY_UINT :\
-    grn_hton((keybuf), (key), (size));\
+    if (((pat)->obj.header.domain != GRN_DB_TOKYO_GEO_POINT) &&\
+        ((pat)->obj.header.domain != GRN_DB_WGS84_GEO_POINT)) {\
+      grn_hton((keybuf), (key), (size));\
+      break;\
+    }\
+  case GRN_OBJ_KEY_GEO_POINT :\
+    grn_gton((keybuf), (key), (size));\
     break;\
   case GRN_OBJ_KEY_INT :\
     grn_hton((keybuf), (key), (size));\
@@ -674,7 +714,13 @@ chop(grn_ctx *ctx, grn_pat *pat, const char **key, const char *end, uint32_t *lk
 #define KEY_DEC(pat,keybuf,key,size) {\
   switch ((pat)->obj.header.flags & GRN_OBJ_KEY_MASK) {\
   case GRN_OBJ_KEY_UINT :\
-    grn_ntoh((keybuf), (key), (size));\
+    if (((pat)->obj.header.domain != GRN_DB_TOKYO_GEO_POINT) &&\
+        ((pat)->obj.header.domain != GRN_DB_WGS84_GEO_POINT)) {\
+      grn_ntoh((keybuf), (key), (size));\
+      break;\
+    }\
+  case GRN_OBJ_KEY_GEO_POINT :\
+    grn_ntog((keybuf), (key), (size));\
     break;\
   case GRN_OBJ_KEY_INT :\
     grn_ntohi((keybuf), (key), (size));\




Groonga-commit メーリングリストの案内
Back to archive index