defdelegate put(name, keyspace, key, value), to: Ring
defdelegate update(name, keyspace, key, value, fun), to: Ring
defdelegate batch(name, keyspace, batch), to: Ring
+ defdelegate get_wildcard_key(key, split_on, join, wildcard), to: Ring
defdelegate put_wildcard(name, keyspace, key, value, split_on, join, wildcard), to: Ring
defdelegate prefix(name, keyspace, key, split_on, min, timeout \\ :infinity), to: Ring
defdelegate stream(name, timeout \\ :infinity), to: Ring
:gen_statem.cast(ClusterKV.ring_name(name), {:update, keyspace, key, value, fun})
end
+ @spec get_wildcard_key(
+ key :: String.t(),
+ split_on :: String.t(),
+ join :: String.t(),
+ wildcard :: String.t()
+ ) :: :ok
+ def get_wildcard_key(key, split_on, join, wildcard) do
+ do_get_wildcard_key(key, split_on, wildcard, join)
+ end
+
@spec put_wildcard(
name :: module(),
keyspace :: String.t(),
end)
end
+ defp do_get_wildcard_key(topic, split_on, wildcard, join) do
+ topic
+ |> String.split(split_on)
+ |> Enum.with_index()
+ |> Enum.reduce_while(nil, fn
+ {^wildcard, _}, acc ->
+ {:cont, acc}
+
+ {k, i}, _ ->
+ {:halt, Enum.join([k, i], join)}
+ end)
+ end
+
@spec redistribute_data(
name :: module(),
me :: node(),
ClusterKV.put(db, @keyspace, "test1:test", :cruel)
ClusterKV.put(db, @keyspace, "test1:test", :world)
+ assert "test:1" = ClusterKV.get_wildcard_key(".test.light..status", ".", ":", "")
+
ClusterKV.put_wildcard(
db,
@keyspace,