Had a great day or so coding against the EXSx framework - love the
Systems model to divide up the work. I’m having a bit of a moment with Component.search returning Components that I’m certain I’ve already removed. I’ve extracted the code into its own method, below.
def get_live_assignments(worker_id) do
dbg AssignmentWorker.search(worker_id)
|> Enum.filter(&AssignmentWorker.exists?(&1) )
end
I would expect search
to not return records that would fail the exists?
test, but that’s not what I’m seeing.
First - before removing any assignments:
[lib/taiichi/systems/worker_assignment_balancer.ex:14: Taiichi.Systems.WorkerAssignmentBalancer.get_live_assignments/1]
AssignmentWorker.search(worker_id) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]
|> Enum.filter(&AssignmentWorker.exists?(&1)) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]
All is good - the exists?
filter returns both records returned by search
. However, when I remove one of the assignments (in another System), there’s a mismatch:
[lib/taiichi/systems/worker_assignment_balancer.ex:14: Taiichi.Systems.WorkerAssignmentBalancer.get_live_assignments/1]
AssignmentWorker.search(worker_id) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]
|> Enum.filter(&AssignmentWorker.exists?(&1)) #=> ["a1399542-8bd1-4470-8892-4d4981a9a6b4"]
Search is returning two records, while only one exists.
Here’s the definition for the Component, for reference:
defmodule Taiichi.Components.AssignmentWorker do
@moduledoc """
Tracks the worker who is on the assignment.
key = assignment_id, value = worker_id.
"""
use ECSx.Component,
value: :binary,
index: true
end
Besides that, I love the clarity and productivity that elixir and ECSx are bringing. I’ve built something where I can assign many people to a task, have them contribute to getting the work on the task done according to their own productivity, balance their assignments across many tasks and unassign them from completed tasks in just a few lines of code.
Any thoughts? I can always pipe calls to search
into exists?
but I’m worried I’m missing something obvious.