Fix CCS category order search

This commit is contained in:
hz
2026-07-23 23:14:38 -05:00
parent b9d4687b1b
commit edcc0def5d
4 changed files with 47 additions and 1 deletions
+19
View File
@@ -143,6 +143,25 @@ public sealed class CcsCaseTests
Assert.True(CcsRatingStore.ExpectedScore(800, 1000) < 0.25);
}
[Theory]
[InlineData("medication", "medication")]
[InlineData("medication", "medications")]
[InlineData("medication", "treatment")]
[InlineData("procedure", "procedures")]
[InlineData("laboratory", "tests")]
[InlineData("diagnostic", "study")]
public void CcsOrderSearchMatchesClinicalCategories(string category, string query)
{
var order = new CcsOrderDefinition
{
Code = "order",
CanonicalName = "Unrelated canonical name",
Category = category
};
Assert.True(CcsStore.Rank(order, query) < 1000);
}
[Fact]
public void ScoringReviewIncludesExpectedAndObservedEvidence()
{
+14 -1
View File
@@ -695,12 +695,25 @@ public sealed class CcsStore
PresentingLocation = value.PresentingLocation, RealTimeMinutes = value.RealTimeMinutes,
Difficulty = value.Difficulty, Tags = value.Tags
};
private static int Rank(CcsOrderDefinition order, string query)
internal static int Rank(CcsOrderDefinition order, string query)
{
var values = new[] { order.CanonicalName }.Concat(order.Aliases).Select(value => value.ToLowerInvariant());
if (values.Any(value => value == query)) return 0;
if (values.Any(value => value.StartsWith(query))) return 1;
if (values.Any(value => value.Contains(query))) return 2;
if (CategorySearchTerms(order.Category).Contains(query, StringComparer.OrdinalIgnoreCase)) return 3;
return 1000;
}
private static IReadOnlyList<string> CategorySearchTerms(string category) =>
category.Trim().ToLowerInvariant() switch
{
"laboratory" => ["laboratory", "laboratories", "lab", "labs", "test", "tests", "diagnostic", "diagnostics", "study", "studies"],
"diagnostic" => ["diagnostic", "diagnostics", "test", "tests", "study", "studies"],
"medication" => ["medication", "medications", "medicine", "medicines", "drug", "drugs", "treatment", "treatments", "therapy", "therapies"],
"procedure" => ["procedure", "procedures", "intervention", "interventions", "treatment", "treatments"],
"monitoring" => ["monitor", "monitoring", "treatment", "treatments"],
"disposition" => ["disposition", "admission", "admit", "transfer", "discharge"],
_ => [category.Trim().ToLowerInvariant()]
};
}
+7
View File
@@ -608,6 +608,13 @@ func _submit_search() -> void:
func _render_search() -> void:
_clear(search_results)
if CCSService.orders.is_empty():
_set_status(
"No matching orders found. Try a clinical name or category."
if search.text.strip_edges().length() >= 2
else "")
return
_set_status("")
for raw_order in CCSService.orders:
var order: Dictionary = raw_order
var code := str(order.get("code", ""))
+7
View File
@@ -190,6 +190,13 @@ test("public API and disposable learner journey", async () => {
expect(activeCcsAttempt).toBeTruthy();
expect(attempt.caseExternalId).toBeTruthy();
expect(attempt.state).toBe("active");
const { data: medicationOrders } = await call("/api/ccs/orders/search?q=medications&limit=20", { token });
expect(Array.isArray(medicationOrders)).toBeTruthy();
expect(medicationOrders.length).toBeGreaterThan(0);
expect(medicationOrders.some((order) => order.category === "medication")).toBeTruthy();
const { data: testOrders } = await call("/api/ccs/orders/search?q=tests&limit=20", { token });
expect(Array.isArray(testOrders)).toBeTruthy();
expect(testOrders.some((order) => ["laboratory", "diagnostic"].includes(order.category))).toBeTruthy();
const { data: opened } = await call(`/api/ccs/attempts/${activeCcsAttempt}/commands`, {
method: "POST", token, body: {
commandId: `smoke-opening-${suffix}`, expectedRevision: attempt.revision,