Как создавать сложные запросы с помощью эликсира
Я кэшировал кучу значений почтовых индексов и длинных лат, используя функциональность erlangs ets.
Представьте себе следующее...
iex()> :ets.new(:postcode_cache, [:named_table])
:postcode_cache
iex()> :ets.insert(:postcode_cache, [{"OX495NU", "latlongvalue"},{"M320JG", "latlongvalue"}])
true
Это похоже на таблицу ets, которую я создал в своем приложении. Я хочу создать функцию, которая выбирает только записи из кэша, где почтовый индекс содержит подстроку того, что ввел пользователь. Есть ли способ сделать это, и если да, то как бы я реализовать эту функцию?
(В будущем я могу выбрать только значения, которые находятся на определенном расстоянии, используя значение lat-long, но это выходит за рамки этого вопроса).
Просто для ясности, таблица похожа на следующий список эликсира...
iex()> postcode_list = [{"OX495NU","latlong"}, {"M320JG", "latlong"}]
Функциональность, которую я хотел бы воспроизвести с помощью ets, выглядит примерно так...
iex()> Enum.filter(list, fn({postcode, _}) -> if String.contains?(postcode, "OX49") end)
[{"OX495NU", "latlong"}]
1 ответ
Нельзя вызывать произвольные функции в совпадениях, но здесь у вас есть совпадение, которое можно использовать с :ets.foldl/3
:
:ets.foldl(fn
{<<"0X49", _ :: binary>>, "latlong"} = n, acc -> [n | acc]
_, acc -> acc
end, [], :named_table)