package org.activityinfo.core.shared.criteria;
import com.google.common.collect.Lists;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.core.shared.Projection;
import org.activityinfo.model.form.FormInstance;
import javax.annotation.Nonnull;
import java.util.List;
import java.util.Set;
/**
* Spike for instance criteria. Defines the criteria
* for the query as FormInstances that are classes of the
* given Iri.
*/
public class ClassCriteria implements Criteria {
private ResourceId classId;
public ClassCriteria(ResourceId resourceId) {
this.classId = resourceId;
}
@Override
public void accept(CriteriaVisitor visitor) {
visitor.visitClassCriteria(this);
}
@Override
public boolean apply(FormInstance input) {
return classId.equals(input.getClassId());
}
@Override
public boolean apply(@Nonnull Projection projection) {
return classId.equals(projection.getRootClassId());
}
public static Criteria union(Set<ResourceId> range) {
if(range.size() == 1) {
return new ClassCriteria(range.iterator().next());
} else {
List<ClassCriteria> criteriaList = Lists.newArrayList();
for(ResourceId classResourceId : range) {
criteriaList.add(new ClassCriteria(classResourceId));
}
return new CriteriaUnion(criteriaList);
}
}
public ResourceId getClassId() {
return classId;
}
}