Skip to content

Commit d1974c8

Browse files
authored
Merge pull request #11 from openmc-data-storage/tiered_search
Tiered search
2 parents 5495848 + 02de4f0 commit d1974c8

File tree

1 file changed

+122
-46
lines changed

1 file changed

+122
-46
lines changed

src/sauce/home.rs

Lines changed: 122 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -311,52 +311,128 @@ pub fn home() -> Html {
311311
})
312312
};
313313

314-
let filtered_data: Vec<TableLine> = mock_data.data
315-
.iter()
316-
.enumerate()
317-
.filter(|(_, entry)| {
318-
let element = &entry.element;
319-
let nucleons = &entry.nucleons;
320-
let reaction = &entry.reaction;
321-
let mt = &entry.mt;
322-
let library = &entry.library;
323-
324-
let element_match = match element_search {
325-
Some(ref term) => element.to_lowercase().contains(&term.to_lowercase()),
326-
None => true,
327-
};
328-
let nucleons_match = match nucleons_search {
329-
Some(ref term) => nucleons.to_string().contains(&*term),
330-
None => true,
331-
};
332-
let reaction_match = match reaction_search {
333-
Some(ref term) => reaction.to_lowercase().contains(&term.to_lowercase()),
334-
None => true,
335-
};
336-
let mt_match = match mt_search {
337-
Some(ref term) => mt.to_string().contains(&*term),
338-
None => true,
339-
};
340-
let library_match = match library_search {
341-
Some(ref term) => library.to_lowercase().contains(&term.to_lowercase()),
342-
None => true,
343-
};
344-
345-
element_match && nucleons_match && reaction_match && mt_match && library_match
346-
})
347-
.map(|(index, entry)| TableLine {
348-
original_index: index,
349-
id: entry.id,
350-
element: entry.element.clone(),
351-
nucleons: entry.nucleons.clone(),
352-
reaction: entry.reaction.clone(),
353-
mt: entry.mt.clone(),
354-
library: entry.library.clone(),
355-
temperature: entry.temperature.clone(),
356-
checked: selected_indexes.current().contains(&index),
357-
sum_callback: callback_sum.clone(),
358-
})
359-
.collect();
314+
let filtered_data: Vec<TableLine> = {
315+
// First pass: check for exact matches across all entries
316+
let has_element_exact = match element_search {
317+
Some(ref term) => {
318+
let term_lower = term.to_lowercase();
319+
mock_data.data.iter().any(|entry| entry.element.to_lowercase() == term_lower)
320+
}
321+
None => true,
322+
};
323+
let has_nucleons_exact = match nucleons_search {
324+
Some(ref term) => {
325+
mock_data.data.iter().any(|entry| entry.nucleons.to_string() == *term)
326+
}
327+
None => true,
328+
};
329+
let has_reaction_exact = match reaction_search {
330+
Some(ref term) => {
331+
let term_lower = term.to_lowercase();
332+
mock_data.data.iter().any(|entry| entry.reaction.to_lowercase() == term_lower)
333+
}
334+
None => true,
335+
};
336+
let has_mt_exact = match mt_search {
337+
Some(ref term) => {
338+
mock_data.data.iter().any(|entry| entry.mt.to_string() == *term)
339+
}
340+
None => true,
341+
};
342+
let has_library_exact = match library_search {
343+
Some(ref term) => {
344+
let term_lower = term.to_lowercase();
345+
mock_data.data.iter().any(|entry| entry.library.to_lowercase() == term_lower)
346+
}
347+
None => true,
348+
};
349+
350+
// Second pass: filter based on match criteria
351+
mock_data.data
352+
.iter()
353+
.enumerate()
354+
.filter(|(_, entry)| {
355+
let element = &entry.element;
356+
let nucleons = &entry.nucleons;
357+
let reaction = &entry.reaction;
358+
let mt = &entry.mt;
359+
let library = &entry.library;
360+
361+
let element_match = match element_search {
362+
Some(ref term) => {
363+
let term_lower = term.to_lowercase();
364+
let element_lower = element.to_lowercase();
365+
if has_element_exact {
366+
element_lower == term_lower
367+
} else {
368+
element_lower.starts_with(&term_lower)
369+
}
370+
}
371+
None => true,
372+
};
373+
let nucleons_match = match nucleons_search {
374+
Some(ref term) => {
375+
let nucleons_str = nucleons.to_string();
376+
if has_nucleons_exact {
377+
nucleons_str == *term
378+
} else {
379+
nucleons_str.starts_with(term)
380+
}
381+
}
382+
None => true,
383+
};
384+
let reaction_match = match reaction_search {
385+
Some(ref term) => {
386+
let term_lower = term.to_lowercase();
387+
let reaction_lower = reaction.to_lowercase();
388+
if has_reaction_exact {
389+
reaction_lower == term_lower
390+
} else {
391+
reaction_lower.starts_with(&term_lower)
392+
}
393+
}
394+
None => true,
395+
};
396+
let mt_match = match mt_search {
397+
Some(ref term) => {
398+
let mt_str = mt.to_string();
399+
if has_mt_exact {
400+
mt_str == *term
401+
} else {
402+
mt_str.starts_with(term)
403+
}
404+
}
405+
None => true,
406+
};
407+
let library_match = match library_search {
408+
Some(ref term) => {
409+
let term_lower = term.to_lowercase();
410+
let library_lower = library.to_lowercase();
411+
if has_library_exact {
412+
library_lower == term_lower
413+
} else {
414+
library_lower.starts_with(&term_lower)
415+
}
416+
}
417+
None => true,
418+
};
419+
420+
element_match && nucleons_match && reaction_match && mt_match && library_match
421+
})
422+
.map(|(index, entry)| TableLine {
423+
original_index: index,
424+
id: entry.id,
425+
element: entry.element.clone(),
426+
nucleons: entry.nucleons.clone(),
427+
reaction: entry.reaction.clone(),
428+
mt: entry.mt.clone(),
429+
library: entry.library.clone(),
430+
temperature: entry.temperature.clone(),
431+
checked: selected_indexes.current().contains(&index),
432+
sum_callback: callback_sum.clone(),
433+
})
434+
.collect()
435+
};
360436

361437
let limit = 10;
362438
let current_page = if filtered_data.is_empty() {

0 commit comments

Comments
 (0)