#!/usr/bin/env tarantool box.cfg { listen = 3303, background = true, log = '.planetmint-monit/logs/tarantool.log', pid_file = '.planetmint-monit/monit_processes/tarantool.pid' } box.schema.user.grant('guest','read,write,execute,create,drop','universe') function indexed_pattern_search(space_name, field_no, pattern) if (box.space[space_name] == nil) then print("Error: Failed to find the specified space") return nil end local index_no = -1 for i=0,box.schema.INDEX_MAX,1 do if (box.space[space_name].index[i] == nil) then break end if (box.space[space_name].index[i].type == "TREE" and box.space[space_name].index[i].parts[1].fieldno == field_no and (box.space[space_name].index[i].parts[1].type == "scalar" or box.space[space_name].index[i].parts[1].type == "string")) then index_no = i break end end if (index_no == -1) then print("Error: Failed to find an appropriate index") return nil end local index_search_key = "" local index_search_key_length = 0 local last_character = "" local c = "" local c2 = "" for i=1,string.len(pattern),1 do c = string.sub(pattern, i, i) if (last_character ~= "%") then if (c == '^' or c == "$" or c == "(" or c == ")" or c == "." or c == "[" or c == "]" or c == "*" or c == "+" or c == "-" or c == "?") then break end if (c == "%") then c2 = string.sub(pattern, i + 1, i + 1) if (string.match(c2, "%p") == nil) then break end index_search_key = index_search_key .. c2 else index_search_key = index_search_key .. c end end last_character = c end index_search_key_length = string.len(index_search_key) local result_set = {} local number_of_tuples_in_result_set = 0 local previous_tuple_field = "" while true do local number_of_tuples_since_last_yield = 0 local is_time_for_a_yield = false for _,tuple in box.space[space_name].index[index_no]: pairs(index_search_key,{iterator = box.index.GE}) do if (string.sub(tuple[field_no], 1, index_search_key_length) > index_search_key) then break end number_of_tuples_since_last_yield = number_of_tuples_since_last_yield + 1 if (number_of_tuples_since_last_yield >= 10 and tuple[field_no] ~= previous_tuple_field) then index_search_key = tuple[field_no] is_time_for_a_yield = true break end previous_tuple_field = tuple[field_no] if (string.match(tuple[field_no], pattern) ~= nil) then number_of_tuples_in_result_set = number_of_tuples_in_result_set + 1 result_set[number_of_tuples_in_result_set] = tuple end end if (is_time_for_a_yield ~= true) then break end require('fiber').yield() end return result_set end