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