如何使用Elixir Ets创建复杂的查询

时间:2019-01-17 15:15:43

标签: caching erlang elixir ets

我已经使用erlangs ets功能缓存了一堆邮政编码和lat-long值。

拍摄以下内容...

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 :(得分:2)

一个人不能在匹配中调用任意函数,但是在这里您可以使用:ets.foldl/3进行匹配:

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