calculate :patient_display_name, :string do public? true calculation expr( cond do not is_nil(patient.last_name) -> patient.first_name <> " " <> patient.last_name true -> nil end ) end
calculate :patient_display_name, :string do public? true calculation expr( cond do not is_nil(patient.last_name) -> patient.first_name <> " " <> patient.last_name true -> nil end ) end
But loading this calculation causes a terrible query:
SELECT v0.id, -- patient_display_name calculation CASE WHEN s1.last_name IS NOT NULL THEN s1.first_name || ' ' || s1.last_name ELSE NULL END AS patient_display_nameFROM visits v0-- Patient subquery (loads ALL columns unnecessarily)LEFT JOIN ( SELECT sp0.id, sp0.first_name, -- ✓ needed sp0.last_name, -- ✓ needed sp0.custom_id, -- ❌ unnecessary sp0.hidden_at, -- ❌ unnecessary ... [ a bunch of other unnecessary fields ] ... sp0.practice_id, -- ❌ unnecessary (already filtering on it) FROM patients sp0 WHERE sp0.practice_id = $practice_id) s1 ON v0.patient_id = s1.idWHERE v0.id = $visit_id AND v0.practice_id = $practice_id;
SELECT v0.id, -- patient_display_name calculation CASE WHEN s1.last_name IS NOT NULL THEN s1.first_name || ' ' || s1.last_name ELSE NULL END AS patient_display_nameFROM visits v0-- Patient subquery (loads ALL columns unnecessarily)LEFT JOIN ( SELECT sp0.id, sp0.first_name, -- ✓ needed sp0.last_name, -- ✓ needed sp0.custom_id, -- ❌ unnecessary sp0.hidden_at, -- ❌ unnecessary ... [ a bunch of other unnecessary fields ] ... sp0.practice_id, -- ❌ unnecessary (already filtering on it) FROM patients sp0 WHERE sp0.practice_id = $practice_id) s1 ON v0.patient_id = s1.idWHERE v0.id = $visit_id AND v0.practice_id = $practice_id;
The unnecessary fields aren't terrible, but loading the entire patient table to get one causes this query to take 300ms instead of a few ms
The Elixir backend framework for unparalleled productivity. Declarative tools that let you stop wasting time. Use with Phoenix LiveView or build APIs in minutes for your front-end of choice.