[Groonga-commit] groonga/groonga at 4ab29e2 [master] between: support specifying index column

Back to archive index

Naoya Murakami null+****@clear*****
Fri Jul 14 07:04:51 JST 2017


Naoya Murakami	2017-07-14 07:04:51 +0900 (Fri, 14 Jul 2017)

  New Revision: 4ab29e28b490df5c6af67d691e90be96c5f0e905
  https://github.com/groonga/groonga/commit/4ab29e28b490df5c6af67d691e90be96c5f0e905

  Merged a0a4637: Merge pull request #740 from naoa/between-index-column

  Message:
    between: support specifying index column

  Added files:
    test/command/suite/select/function/between/with_index/index_column.expected
    test/command/suite/select/function/between/with_index/index_column.test
  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+20 -2)
===================================================================
--- lib/proc.c    2017-07-12 10:41:15 +0900 (29add30)
+++ lib/proc.c    2017-07-14 07:04:51 +0900 (0833911)
@@ -2394,10 +2394,20 @@ between_parse_args(grn_ctx *ctx, int nargs, grn_obj **args, between_data *data)
 
   {
     grn_id value_type;
-    if (data->value->header.type == GRN_BULK) {
+    switch (data->value->header.type) {
+    case GRN_BULK :
       value_type = data->value->header.domain;
-    } else {
+      break;
+    case GRN_COLUMN_INDEX :
+      {
+        grn_obj *domain_object;
+        domain_object = grn_ctx_at(ctx, data->value->header.domain);
+        value_type = domain_object->header.domain;
+      }
+      break;
+    default :
       value_type = grn_obj_get_range(ctx, data->value);
+      break;
     }
     if (value_type != data->min->header.domain) {
       rc = between_cast(ctx, data->min, &data->casted_min, value_type, "min");
@@ -2547,6 +2557,10 @@ selector_between_sequential_search_should_use(grn_ctx *ctx,
     return GRN_FALSE;
   }
 
+  if (data->value->header.type == GRN_COLUMN_INDEX) {
+    return GRN_FALSE;
+  }
+
   n_index_keys = grn_table_size(ctx, index_table);
   if (n_index_keys == 0) {
     return GRN_FALSE;
@@ -2771,6 +2785,10 @@ selector_between(grn_ctx *ctx,
     flags |= GRN_CURSOR_LT;
   }
 
+  if (data.value->header.type == GRN_COLUMN_INDEX) {
+    index = data.value;
+  }
+
   if (index) {
     switch (index->header.type) {
     case GRN_TABLE_NO_KEY :

  Added: test/command/suite/select/function/between/with_index/index_column.expected (+61 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/between/with_index/index_column.expected    2017-07-14 07:04:51 +0900 (a105502)
@@ -0,0 +1,61 @@
+table_create Users TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Users age COLUMN_SCALAR Int32
+[[0,0.0,0.0],true]
+table_create Ages TABLE_PAT_KEY Int32
+[[0,0.0,0.0],true]
+column_create Ages users_age COLUMN_INDEX Users age
+[[0,0.0,0.0],true]
+load --table Users
+[
+{"_key": "alice",  "age": 17},
+{"_key": "bob",    "age": 18},
+{"_key": "calros", "age": 19},
+{"_key": "dave",   "age": 20},
+{"_key": "eric",   "age": 21}
+]
+[[0,0.0,0.0],5]
+select Users --filter 'between(Ages.users_age, "18", "include", 20, "include")'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        3
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "_key",
+          "ShortText"
+        ],
+        [
+          "age",
+          "Int32"
+        ]
+      ],
+      [
+        2,
+        "bob",
+        18
+      ],
+      [
+        3,
+        "calros",
+        19
+      ],
+      [
+        4,
+        "dave",
+        20
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/function/between/with_index/index_column.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/between/with_index/index_column.test    2017-07-14 07:04:51 +0900 (a365681)
@@ -0,0 +1,16 @@
+table_create Users TABLE_HASH_KEY ShortText
+column_create Users age COLUMN_SCALAR Int32
+
+table_create Ages TABLE_PAT_KEY Int32
+column_create Ages users_age COLUMN_INDEX Users age
+
+load --table Users
+[
+{"_key": "alice",  "age": 17},
+{"_key": "bob",    "age": 18},
+{"_key": "calros", "age": 19},
+{"_key": "dave",   "age": 20},
+{"_key": "eric",   "age": 21}
+]
+
+select Users --filter 'between(Ages.users_age, "18", "include", 20, "include")'
-------------- next part --------------
HTML����������������������������...
Télécharger 



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