package context.arch.discoverer.query; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import context.arch.discoverer.ComponentDescription; import context.arch.discoverer.component.dataModel.AbstractDataModel; /** * * @author Agathe * @author Brian Y. Lim * */ public class ORQueryItem extends BooleanQueryItem { private static final long serialVersionUID = 1094971636952363366L; public static final String OR_QUERY_ITEM = "orQueryItem"; public ORQueryItem(AbstractQueryItem<?,?> ... childrenArray) { super(OR_QUERY_ITEM, childrenArray); } public ORQueryItem (List<AbstractQueryItem<?,?>> children) { super(OR_QUERY_ITEM, children); } /** * Perform an OR */ @Override public Collection<ComponentDescription> search(AbstractDataModel dataModel) { return search(dataModel, children); } /** * Package protected and static to be reused by ElseQueryItem. * @param dataModel * @param children * @return */ static Collection<ComponentDescription> search(AbstractDataModel dataModel, List<AbstractQueryItem<?, ?>> children) { Set<ComponentDescription> components = new HashSet<ComponentDescription>(); // use Set to prevent duplicate entries, so that we can naively add if (children.isEmpty()) { return components; } // process first child for components components.addAll(children.get(0).search(dataModel)); if (children.size() == 1) { return components; } // process existing components in relation to the remaining children for (int c = 1; c < children.size(); c++) { Collection<ComponentDescription> childComponents = children.get(c).search(dataModel); // add to original components if not already included components.addAll(childComponents); } return components; } @Override public Boolean match(ComponentDescription component){ Boolean result = false; for (AbstractQueryItem<?,?> child : children) { Boolean childResult = child.match(component); if (childResult == null) { return null; } else { result |= childResult; } } return result; } }