/*
* ANDQueryItem.java
*
* Created on July 5, 2001, 4:22 PM
*/
package context.arch.discoverer.query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import context.arch.discoverer.ComponentDescription;
import context.arch.discoverer.component.dataModel.AbstractDataModel;
/**
*
* @author Agathe
* @author Brian Y. Lim
*
*/
public class ANDQueryItem extends BooleanQueryItem {
private static final long serialVersionUID = -5396890304095806576L;
public static final String AND_QUERY_ITEM = "andQueryItem";
public ANDQueryItem(AbstractQueryItem<?,?> ... childrenArray) {
super(AND_QUERY_ITEM, childrenArray);
}
public ANDQueryItem(List<AbstractQueryItem<?,?>> children) {
super(AND_QUERY_ITEM, children);
}
/**
* Perform a AND
*/
@Override
public Collection<ComponentDescription> search(AbstractDataModel dataModel) {
Collection<ComponentDescription> components = new ArrayList<ComponentDescription>(); // use ArrayList for quick iteration
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++) { // start from second
Collection<ComponentDescription> childComponents = children.get(c).search(dataModel);
// remove from original components if not in childComponents
Iterator<ComponentDescription> it = components.iterator();
while (it.hasNext()) {
if (!childComponents.contains(it.next())) {
it.remove();
}
}
}
return components;
}
@Override
public Boolean match(ComponentDescription component) {
Boolean result = true;
for (AbstractQueryItem<?,?> child : children) {
Boolean childResult = child.match(component);
// System.err.println("ANDListQueryItem.process childQuery = " + child);
// System.err.println("ANDListQueryItem.process childResult = " + childResult);
// System.err.println("ANDListQueryItem.process component = " + component);
if (childResult == null) { return null; }
else { result &= childResult; }
}
return result;
}
}