The parsed query tree.
Unique reagent names in first-seen order (original casing preserved).
// (sodium OR potassium) hydroxide OR potassium carbonate
extractReagentNames(ast); // ["sodium hydroxide", "potassium hydroxide", "potassium carbonate"]
// acetone 99% AND NOT water
extractReagentNames(ast); // ["acetone"]
export function extractReagentNames(ast: SearchAst): string[] {
const seen = new Set<string>();
const names: string[] = [];
for (const group of extractOrGroups(ast)) {
const name = group
.join(' ')
.split(/\s+/)
.filter((word) => !PURITY_TOKEN.test(word))
.join(' ')
.trim();
const key = name.toLowerCase();
if (name === '' || seen.has(key)) continue;
seen.add(key);
names.push(name);
}
return names;
}
Expands a query tree into the distinct reagent names it searches for. Each positive AND-group (see extractOrGroups) becomes one name by joining its words with a space, so
(sodium OR potassium) hydroxide OR potassium carbonateyields three names. Bare purity tokens like99%are dropped, and names are de-duplicated case-insensitively.