package org.activityinfo.core.client;
import com.google.common.collect.Lists;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.core.shared.criteria.Criteria;
import org.activityinfo.core.shared.criteria.NullCriteria;
import org.activityinfo.model.formTree.FieldPath;
import java.util.List;
/**
* Describes a query for {@code FormInstances}
*/
public class InstanceQuery {
private final static int FALLBACK_MAX_COUNT = 100;
private final List<FieldPath> fieldPaths;
private final Criteria criteria;
private final int offset;
private final int maxCount;
public InstanceQuery(List<FieldPath> fieldPaths, Criteria criteria) {
this(fieldPaths, criteria, 0, FALLBACK_MAX_COUNT);
}
public InstanceQuery(List<FieldPath> fieldPaths, Criteria criteria, int offset, int maxCount) {
assert criteria != null;
this.criteria = criteria;
this.fieldPaths = fieldPaths;
this.offset = offset;
this.maxCount = maxCount;
}
public List<FieldPath> getFieldPaths() {
return fieldPaths;
}
public int getOffset() {
return offset;
}
public int getMaxCount() {
return maxCount;
}
public Criteria getCriteria() {
return criteria;
}
public static Builder select(ResourceId... fieldIds) {
return new Builder().select(fieldIds);
}
public static class Builder {
private List<FieldPath> paths = Lists.newArrayList();
private Criteria criteria;
private int offset = 0;
private int maxCount = FALLBACK_MAX_COUNT;
private Builder() {
}
public Builder where(Criteria criteria) {
assert this.criteria == null : "Criteria already specified";
this.criteria = criteria;
return this;
}
public Builder select(ResourceId... fields) {
for (ResourceId fieldId : fields) {
paths.add(new FieldPath(fieldId));
}
return this;
}
public Builder offset(int offset) {
this.offset = offset;
return this;
}
public Builder maxCount(int maxCount) {
this.maxCount = maxCount;
return this;
}
public InstanceQuery build() {
if (criteria == null) {
criteria = NullCriteria.INSTANCE;
}
return new InstanceQuery(paths, criteria, offset, maxCount);
}
}
}