hyperoceanic

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

APB9785

Creator of ECSx

@hyperoceanic I just released v0.5.2 with the fix for this issue. Thanks for reporting it!

APB9785

APB9785

Creator of ECSx

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

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)) #=> []

Last Post!

hyperoceanic

hyperoceanic

Many thanks, @APB9785!

Where Next?

Popular in Questions Top

RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New

Other popular topics Top

hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement