[Groonga-commit] groonga/groonga at de52d66 [master] expr: fix a bug that non 4 bytes fixed vector column can't sequential match by specifying index of vector

Back to archive index

Naoya Murakami null+****@clear*****
Mon May 22 05:26:03 JST 2017


Naoya Murakami	2017-05-22 05:26:03 +0900 (Mon, 22 May 2017)

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

  Merged caa6132: Merge pull request #696 from naoa/fix-expr-get-member-uvector

  Message:
    expr: fix a bug that non 4 bytes fixed vector column can't sequential match by specifying index of vector
    
    GitHub: #694

  Added files:
    test/command/suite/select/filter/equal/vector_element_float.expected
    test/command/suite/select/filter/equal/vector_element_float.test
    test/command/suite/select/filter/equal/vector_element_int64.expected
    test/command/suite/select/filter/equal/vector_element_int64.test
    test/command/suite/select/filter/equal/vector_element_int8.expected
    test/command/suite/select/filter/equal/vector_element_int8.test
    test/command/suite/select/filter/equal/vector_element_reference.expected
    test/command/suite/select/filter/equal/vector_element_reference.test
  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+59 -6)
===================================================================
--- lib/expr.c    2017-05-19 14:02:25 +0900 (9dc1fff)
+++ lib/expr.c    2017-05-22 05:26:03 +0900 (ae2dc7d)
@@ -2442,13 +2442,66 @@ grn_expr_exec_get_member_vector(grn_ctx *ctx,
 
   i = GRN_UINT32_VALUE(index);
   if (values.header.type == GRN_UVECTOR) {
-    int n_elements;
-    grn_obj_reinit(ctx, result, DB_OBJ(column)->range, 0);
-    n_elements = GRN_BULK_VSIZE(&values) / sizeof(grn_id);
+    int n_elements = 0;
+    grn_obj *range;
+    grn_id range_id = DB_OBJ(column)->range;
+    grn_obj_reinit(ctx, result, range_id, 0);
+    if ((range = grn_ctx_at(ctx, range_id))) {
+      switch (range->header.type) {
+      case GRN_TYPE :
+        n_elements = GRN_BULK_VSIZE(&values) / GRN_TYPE_SIZE(DB_OBJ(range));
+        break;
+      case GRN_TABLE_HASH_KEY :
+      case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
+      case GRN_TABLE_NO_KEY :
+        n_elements = GRN_BULK_VSIZE(&values) / sizeof(grn_id);
+        break;
+      }
+    }
     if (n_elements > i) {
-      grn_id value;
-      value = GRN_RECORD_VALUE_AT(&values, i);
-      GRN_RECORD_SET(ctx, result, value);
+#define GET_UVECTOR_ELEMENT_AS(type) do {                                          \
+        GRN_ ## type ## _SET(ctx, result, GRN_ ## type ## _VALUE_AT(&values, i));  \
+      } while (GRN_FALSE)
+      switch (values.header.domain) {
+      case GRN_DB_BOOL :
+        GET_UVECTOR_ELEMENT_AS(BOOL);
+        break;
+      case GRN_DB_INT8 :
+        GET_UVECTOR_ELEMENT_AS(INT8);
+        break;
+      case GRN_DB_UINT8 :
+        GET_UVECTOR_ELEMENT_AS(UINT8);
+        break;
+      case GRN_DB_INT16 :
+        GET_UVECTOR_ELEMENT_AS(INT16);
+        break;
+      case GRN_DB_UINT16 :
+        GET_UVECTOR_ELEMENT_AS(UINT16);
+        break;
+      case GRN_DB_INT32 :
+        GET_UVECTOR_ELEMENT_AS(INT32);
+        break;
+      case GRN_DB_UINT32 :
+        GET_UVECTOR_ELEMENT_AS(UINT32);
+        break;
+      case GRN_DB_INT64 :
+        GET_UVECTOR_ELEMENT_AS(INT64);
+        break;
+      case GRN_DB_UINT64 :
+        GET_UVECTOR_ELEMENT_AS(UINT64);
+        break;
+      case GRN_DB_FLOAT :
+        GET_UVECTOR_ELEMENT_AS(FLOAT);
+        break;
+      case GRN_DB_TIME :
+        GET_UVECTOR_ELEMENT_AS(TIME);
+        break;
+      default :
+        GET_UVECTOR_ELEMENT_AS(RECORD);
+        break;
+      }
+#undef GET_UVECTOR_ELEMENT_AS
     }
   } else {
     if (values.u.v.n_sections > i) {

  Added: test/command/suite/select/filter/equal/vector_element_float.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_float.expected    2017-05-22 05:26:03 +0900 (1165979)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Float
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2.1, 1.2, 3.1]},
+{"numbers": [2.2, 3.1, 4.2]},
+{"numbers": [3.1, 9.3, -1.1]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] == 3.1'   --output_columns 'numbers'
+[[0,0.0,0.0],[[[1],[["numbers","Float"]],[[2.2,3.1,4.2]]]]]

  Added: test/command/suite/select/filter/equal/vector_element_float.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_float.test    2017-05-22 05:26:03 +0900 (9e17302)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Float
+
+load --table Values
+[
+{"numbers": [2.1, 1.2, 3.1]},
+{"numbers": [2.2, 3.1, 4.2]},
+{"numbers": [3.1, 9.3, -1.1]}
+]
+
+select Values \
+  --filter 'numbers[1] == 3.1' \
+  --output_columns 'numbers'

  Added: test/command/suite/select/filter/equal/vector_element_int64.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_int64.expected    2017-05-22 05:26:03 +0900 (db9fbbd)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int64
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [2, 3, 4]},
+{"numbers": [3, 9, -1]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] == 3'   --output_columns 'numbers'
+[[0,0.0,0.0],[[[1],[["numbers","Int64"]],[[2,3,4]]]]]

  Added: test/command/suite/select/filter/equal/vector_element_int64.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_int64.test    2017-05-22 05:26:03 +0900 (ce858b5)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int64
+
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [2, 3, 4]},
+{"numbers": [3, 9, -1]}
+]
+
+select Values \
+  --filter 'numbers[1] == 3' \
+  --output_columns 'numbers'

  Added: test/command/suite/select/filter/equal/vector_element_int8.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_int8.expected    2017-05-22 05:26:03 +0900 (6da93e8)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int8
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [2, 3, 4]},
+{"numbers": [3, 9, -1]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] == 3'   --output_columns 'numbers'
+[[0,0.0,0.0],[[[1],[["numbers","Int8"]],[[2,3,4]]]]]

  Added: test/command/suite/select/filter/equal/vector_element_int8.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_int8.test    2017-05-22 05:26:03 +0900 (35618cf)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int8
+
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [2, 3, 4]},
+{"numbers": [3, 9, -1]}
+]
+
+select Values \
+  --filter 'numbers[1] == 3' \
+  --output_columns 'numbers'

  Added: test/command/suite/select/filter/equal/vector_element_reference.expected (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_reference.expected    2017-05-22 05:26:03 +0900 (24b76a3)
@@ -0,0 +1,15 @@
+table_create Tags TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values tags COLUMN_VECTOR Tags
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"tags": ["Groonga", "Mroonga", "Rroonga"]},
+{"tags": ["Mroonga", "Rroonga"]},
+{"tags": ["Rroonga", "Groonga", "Mroonga"]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'tags[1] == "Rroonga"'   --output_columns 'tags'
+[[0,0.0,0.0],[[[1],[["tags","Tags"]],[["Mroonga","Rroonga"]]]]]

  Added: test/command/suite/select/filter/equal/vector_element_reference.test (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/equal/vector_element_reference.test    2017-05-22 05:26:03 +0900 (c5a6457)
@@ -0,0 +1,15 @@
+table_create Tags TABLE_HASH_KEY ShortText
+
+table_create Values TABLE_NO_KEY
+column_create Values tags COLUMN_VECTOR Tags
+
+load --table Values
+[
+{"tags": ["Groonga", "Mroonga", "Rroonga"]},
+{"tags": ["Mroonga", "Rroonga"]},
+{"tags": ["Rroonga", "Groonga", "Mroonga"]}
+]
+
+select Values \
+  --filter 'tags[1] == "Rroonga"' \
+  --output_columns 'tags'
-------------- next part --------------
HTML����������������������������...
Download 



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