Skip to content

Commit

Permalink
Merge pull request #740 from naoa/between-index-column
Browse files Browse the repository at this point in the history
between: support specifying index column

Patch by Naoya Murakami. Thanks!!!
  • Loading branch information
kou committed Jul 17, 2017
2 parents 2f28a3f + 789e737 commit a0a4637
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 5 deletions.
11 changes: 8 additions & 3 deletions lib/mrb/scripts/expression_tree/function_call.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@ def estimate_size(table)

column, min, min_border, max, max_border = @arguments

index_info = column.column.find_index(Operator::CALL)
return table.size if index_info.nil?
index_column = index_info.index
if column.is_a?(Groonga::ExpressionTree::IndexColumn)
index_column = column.object
else
index_info = column.column.find_index(Operator::CALL)
return table.size if index_info.nil?
index_column = index_info.index
end

while index_column.is_a?(Groonga::Accessor)
if index_column.have_next?
index_column = index_column.next
Expand Down
22 changes: 20 additions & 2 deletions lib/proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 :
Expand Down
Original file line number Diff line number Diff line change
@@ -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
]
]
]
]
Original file line number Diff line number Diff line change
@@ -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")'

0 comments on commit a0a4637

Please sign in to comment.