Как создавать сложные запросы с помощью эликсира - PullRequest
0 голосов
/ 17 января 2019

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

0 голосов
/ 17 января 2019

Нельзя вызывать произвольные функции в совпадениях, но здесь у вас есть совпадение, которое можно использовать с :ets.foldl/3:

:ets.foldl(fn
  {<<"0X49", _ :: binary>>, "latlong"} = n, acc -> [n | acc]
  _, acc -> acc
end, [], :named_table)
...