Как создавать сложные запросы с помощью эликсира

Я кэшировал кучу значений почтовых индексов и длинных лат, используя функциональность 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)
Другие вопросы по тегам