[Groonga-mysql-commit] mroonga/mroonga [master] multiple column key: split code for double

Back to archive index

null+****@clear***** null+****@clear*****
2012年 3月 18日 (日) 17:47:26 JST


Kouhei Sutou	2012-03-18 17:47:26 +0900 (Sun, 18 Mar 2012)

  New Revision: ec0b09861985dd1cbfb42ed1d70473856b46240e

  Log:
    multiple column key: split code for double

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+27 -20)
===================================================================
--- ha_mroonga.cc    2012-03-18 17:22:06 +0900 (224f2d1)
+++ ha_mroonga.cc    2012-03-18 17:47:26 +0900 (6d9dcf2)
@@ -8865,6 +8865,29 @@ uint32 ha_mroonga::storage_encode_multiple_column_key_float(const uchar *key,
   DBUG_RETURN(data_size);
 }
 
+uint32 ha_mroonga::storage_encode_multiple_column_key_double(const uchar *key,
+                                                             uchar *buffer,
+                                                             bool decode)
+{
+  MRN_DBUG_ENTER_METHOD();
+  uint32 data_size = 8;
+  double double_value = 0.0;
+  float8get(double_value, key);
+  int n_bits = (data_size * 8 - 1);
+  volatile long long int *long_long_value_pointer =
+    (long long int *)(&double_value);
+  volatile long long int long_long_value = *long_long_value_pointer;
+  if (!decode)
+     long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits));
+  mrn_byte_order_host_to_network(buffer, &long_long_value, data_size);
+  if (decode) {
+    long_long_value = *((long long int *)buffer);
+    *((long long int *)buffer) =
+      long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) |
+                          (1LL << n_bits));
+  }
+  DBUG_RETURN(data_size);
+}
 
 int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info,
                                                    const uchar *key,
@@ -8901,8 +8924,7 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info,
       TYPE_BYTE_SEQUENCE
     } data_type = TYPE_UNKNOWN;
     uint32 data_size = 0;
-    volatile long long int long_long_value = 0;
-    volatile double double_value = 0.0;
+    long long int long_long_value = 0;
     switch (field->real_type()) {
     case MYSQL_TYPE_DECIMAL:
       data_type = TYPE_BYTE_SEQUENCE;
@@ -8928,8 +8950,9 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info,
       break;
     case MYSQL_TYPE_DOUBLE:
       data_type = TYPE_DOUBLE;
-      data_size = 8;
-      float8get(double_value, current_key);
+      data_size = storage_encode_multiple_column_key_double(current_key,
+                                                            current_buffer,
+                                                            decode);
       break;
     case MYSQL_TYPE_NULL:
       data_type = TYPE_NUMBER;
@@ -9059,22 +9082,6 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info,
     case TYPE_FLOAT:
       break;
     case TYPE_DOUBLE:
-      {
-        int n_bits = (data_size * 8 - 1);
-        volatile long long int *encoded_value_pointer =
-          (long long int *)(&double_value);
-        long_long_value = *encoded_value_pointer;
-        if (!decode)
-          long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits));
-        mrn_byte_order_host_to_network(current_buffer, &long_long_value,
-                                       data_size);
-        if (decode) {
-          long_long_value = *((long long int *)current_buffer);
-          *((long long int *)current_buffer) =
-            long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) |
-                               (1LL << n_bits));
-        }
-      }
       break;
     case TYPE_BYTE_SEQUENCE:
       memcpy(current_buffer, current_key, data_size);

  Modified: ha_mroonga.h (+3 -0)
===================================================================
--- ha_mroonga.h    2012-03-18 17:22:06 +0900 (e4db7f8)
+++ ha_mroonga.h    2012-03-18 17:47:26 +0900 (fac5516)
@@ -536,6 +536,9 @@ private:
   uint32 storage_encode_multiple_column_key_float(const uchar *key,
                                                   uchar *buffer,
                                                   bool decode);
+  uint32 storage_encode_multiple_column_key_double(const uchar *key,
+                                                   uchar *buffer,
+                                                   bool decode);
   int storage_encode_multiple_column_key(KEY *key_info,
                                          const uchar *key, uint key_length,
                                          uchar *buffer, uint *encoded_length,




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