hyperoceanic
ECSx Component.search confusion/bug?
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.
Most Liked
APB9785
@hyperoceanic I just released v0.5.2 with the fix for this issue. Thanks for reporting it!
APB9785
Hi again Mark, thanks for the kind words. Very happy to hear about your experience with Elixir + ECSx.
The issue you’re seeing appears to be a bug with ECSx.Component :index feature. Should be a simple fix, but just to confirm, could you try the same steps again but with index: false on that component?
hyperoceanic
Hi Andy - yes that solved it!
[lib/taiichi/systems/worker_assignment_balancer.ex:14: Taiichi.Systems.WorkerAssignmentBalancer.get_live_assignments/1]
AssignmentWorker.search(worker_id) #=> []
|> Enum.filter(&AssignmentWorker.exists?(&1)) #=> []








