[Groonga-commit] groonga/groonga at 583555f [master] Support 'vector_column[i] < 29' with index

Back to archive index

Kouhei Sutou null+****@clear*****
Sat Feb 6 19:53:54 JST 2016


Kouhei Sutou	2016-02-06 19:53:54 +0900 (Sat, 06 Feb 2016)

  New Revision: 583555f8465499ef0b6c381eb23e9e6189db9eac
  https://github.com/groonga/groonga/commit/583555f8465499ef0b6c381eb23e9e6189db9eac

  Message:
    Support 'vector_column[i] < 29' with index
    
    All of '<', '<=', '>' and '>=' are supported.

  Added files:
    test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.expected
    test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.test
    test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.expected
    test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.test
    test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.expected
    test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.test
    test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.expected
    test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.test
  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+39 -9)
===================================================================
--- lib/expr.c    2016-02-06 19:41:09 +0900 (be49894)
+++ lib/expr.c    2016-02-06 19:53:54 +0900 (6ed5c51)
@@ -5618,25 +5618,55 @@ grn_table_select_index_range_column(grn_ctx *ctx, grn_obj *table,
                                    min, min_size, max, max_size,
                                    offset, limit, flags);
     if (cursor) {
+      grn_id tid;
       uint32_t sid;
       int32_t weight;
-      grn_obj *index_cursor;
+      grn_ii *ii = (grn_ii *)index;
+      int ii_cursor_flags;
 
       sid = GRN_UINT32_VALUE_AT(&(si->wv), 0);
       weight = GRN_INT32_VALUE_AT(&(si->wv), 1);
-      index_cursor = grn_index_cursor_open(ctx, cursor, index,
-                                           GRN_ID_NIL, GRN_ID_MAX, 0);
-      if (index_cursor) {
-        grn_posting *posting;
-        while ((posting = grn_index_cursor_next(ctx, index_cursor, NULL))) {
-          if (sid == 0 || posting->sid == sid) {
-            grn_posting new_posting = *posting;
+      ii_cursor_flags = GRN_OBJ_WITH_WEIGHT;
+      if (sid != 0) {
+        ii_cursor_flags |= GRN_OBJ_WITH_SECTION;
+      }
+      if (si->position.specified) {
+        ii_cursor_flags |= GRN_OBJ_WITH_POSITION;
+      }
+      while ((tid = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) {
+        grn_ii_cursor *ii_cursor;
+
+        ii_cursor = grn_ii_cursor_open(ctx, ii, tid,
+                                       GRN_ID_NIL, GRN_ID_MAX,
+                                       ii->n_elements,
+                                       ii_cursor_flags);
+        if (ii_cursor) {
+          grn_posting *posting;
+          while ((posting = grn_ii_cursor_next(ctx, ii_cursor))) {
+            grn_posting new_posting;
+
+            if (!(sid == 0 || posting->sid == sid)) {
+              continue;
+            }
+
+            if (si->position.specified) {
+              while ((posting = grn_ii_cursor_next_pos(ctx, ii_cursor))) {
+                if (posting->pos == si->position.start) {
+                  break;
+                }
+              }
+              if (!posting) {
+                continue;
+              }
+            }
+
+            new_posting = *posting;
             new_posting.weight *= weight;
             grn_ii_posting_add(ctx, &new_posting, (grn_hash *)res, logical_op);
           }
         }
         processed = GRN_TRUE;
-        grn_obj_unlink(ctx, index_cursor);
+        grn_ii_cursor_close(ctx, ii_cursor);
       }
       grn_table_cursor_close(ctx, cursor);
     }

  Added: test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.expected (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.expected    2016-02-06 19:53:54 +0900 (05805be)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int32
+[[0,0.0,0.0],true]
+table_create Numbers TABLE_PAT_KEY Int32
+[[0,0.0,0.0],true]
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2, 3,  9]},
+{"numbers": [2, 4,  3]},
+{"numbers": [8, 5, -1]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] > 3'   --output_columns 'numbers'
+[[0,0.0,0.0],[[[2],[["numbers","Int32"]],[[2,4,3]],[[8,5,-1]]]]]

  Added: test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/greater/vector_element_int32.test    2016-02-06 19:53:54 +0900 (49111db)
@@ -0,0 +1,16 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int32
+
+table_create Numbers TABLE_PAT_KEY Int32
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+
+load --table Values
+[
+{"numbers": [2, 3,  9]},
+{"numbers": [2, 4,  3]},
+{"numbers": [8, 5, -1]}
+]
+
+select Values \
+  --filter 'numbers[1] > 3' \
+  --output_columns 'numbers'

  Added: test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.expected (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.expected    2016-02-06 19:53:54 +0900 (8466247)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int32
+[[0,0.0,0.0],true]
+table_create Numbers TABLE_PAT_KEY Int32
+[[0,0.0,0.0],true]
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2, 3, 9]},
+{"numbers": [2, 4, 3]},
+{"numbers": [8, 5, -1]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] >= 4'   --output_columns 'numbers'
+[[0,0.0,0.0],[[[2],[["numbers","Int32"]],[[2,4,3]],[[8,5,-1]]]]]

  Added: test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/greater_equal/vector_element_int32.test    2016-02-06 19:53:54 +0900 (aaa1c94)
@@ -0,0 +1,16 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int32
+
+table_create Numbers TABLE_PAT_KEY Int32
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+
+load --table Values
+[
+{"numbers": [2, 3, 9]},
+{"numbers": [2, 4, 3]},
+{"numbers": [8, 5, -1]}
+]
+
+select Values \
+  --filter 'numbers[1] >= 4' \
+  --output_columns 'numbers'

  Added: test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.expected (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.expected    2016-02-06 19:53:54 +0900 (22fff05)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int32
+[[0,0.0,0.0],true]
+table_create Numbers TABLE_PAT_KEY Int32
+[[0,0.0,0.0],true]
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [3, 2, 0]},
+{"numbers": [8, -1, 9]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] < 2'   --output_columns 'numbers'   --sortby _id
+[[0,0.0,0.0],[[[2],[["numbers","Int32"]],[[2,1,3]],[[8,-1,9]]]]]

  Added: test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.test (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/less/vector_element_int32.test    2016-02-06 19:53:54 +0900 (60dcd28)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int32
+
+table_create Numbers TABLE_PAT_KEY Int32
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+
+load --table Values
+[
+{"numbers": [2, 1, 3]},
+{"numbers": [3, 2, 0]},
+{"numbers": [8, -1, 9]}
+]
+
+select Values \
+  --filter 'numbers[1] < 2' \
+  --output_columns 'numbers' \
+  --sortby _id

  Added: test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.expected (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.expected    2016-02-06 19:53:54 +0900 (4fb01dd)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values numbers COLUMN_VECTOR Int32
+[[0,0.0,0.0],true]
+table_create Numbers TABLE_PAT_KEY Int32
+[[0,0.0,0.0],true]
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"numbers": [2,  1, 3]},
+{"numbers": [3,  2, 0]},
+{"numbers": [8, -1, 9]}
+]
+[[0,0.0,0.0],3]
+select Values   --filter 'numbers[1] <= 1'   --output_columns 'numbers'   --sortby _id
+[[0,0.0,0.0],[[[2],[["numbers","Int32"]],[[2,1,3]],[[8,-1,9]]]]]

  Added: test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.test (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/index/compare_operation/less_equal/vector_element_int32.test    2016-02-06 19:53:54 +0900 (8015e38)
@@ -0,0 +1,17 @@
+table_create Values TABLE_NO_KEY
+column_create Values numbers COLUMN_VECTOR Int32
+
+table_create Numbers TABLE_PAT_KEY Int32
+column_create Numbers values_numbers COLUMN_INDEX|WITH_POSITION Values numbers
+
+load --table Values
+[
+{"numbers": [2,  1, 3]},
+{"numbers": [3,  2, 0]},
+{"numbers": [8, -1, 9]}
+]
+
+select Values \
+  --filter 'numbers[1] <= 1' \
+  --output_columns 'numbers' \
+  --sortby _id
-------------- next part --------------
HTML����������������������������...
Download 



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