I’m writing a module to test ets match.
It would to store client consume by month/year.
I had try to follow match spec… I even tried to do automagic translate of elixir functions with GitHub - ericmj/ex2ms: :ets.fun2ms for Elixir, translate functions to match specifications
nonetheless I always end up with an empty list []
Please… someone help me with list_period
method…
defmodule ETS.Consume do
@moduledoc """
Consume tasks
r ETS.Consume
ETS.Consume.scenario()
table = ETS.Consume.start()
ETS.Consume.populate(table)
ETS.Consume.list(table, "12345678901")
ETS.Consume.list_period(table, "12345678901", 2, 2021, 10, 2021)
"""
import Ex2ms
@table :cons
@opts [:ordered_set, :protected]
def start do
:ets.new(@table, @opts)
end
def insert(ref, cpf_cnpj, mes, ano, consumo) do
key = {cpf_cnpj, mes, ano}
:ets.insert(ref, {key, consumo})
end
def list(table, cpf_cnpj) do
:ets.match(table, {{cpf_cnpj, :"$1", :"$2"}, :"$3"})
end
def list_period(table, cpf_cnpj, mes_inicio, ano_inicio, mes_fim, ano_fim) do
pattern = [{{{:"$1", :"$2", :"$3"}, :"$4"}, [{:<, :"$2", 2}], [true]}]
:ets.match(table, pattern)
end
def populate(table) do
insert(table, "12345678901", 1, 2021, 100)
insert(table, "12345678901", 2, 2021, 200)
insert(table, "12345678901", 3, 2021, 300)
insert(table, "12345678901", 4, 2021, 200)
insert(table, "12345678901", 5, 2021, 300)
insert(table, "12345678901", 6, 2021, 350)
insert(table, "12345678901", 7, 2021, 200)
insert(table, "12345678901", 8, 2021, 100)
insert(table, "12345678901", 9, 2021, 500)
insert(table, "12345678901", 10, 2021, 300)
insert(table, "12345678901", 11, 2021, 200)
insert(table, "12345678901", 12, 2021, 310)
insert(table, "12345678902", 1, 2021, 310)
end
def scenario do
table = ETS.Consume.start()
ETS.Consume.populate(table)
# ETS.Consume.list(table, "12345678901")
ETS.Consume.list_period(table, "12345678901", 2, 2021, 10, 2021)
end
def test() do
fun do {{ cpf_cnpj, mes, ano }, consumo} = arg when mes < 2 -> true end
end
end