package mil.nga.giat.geowave.adapter.vector.query.cql;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.index.ByteArrayRange;
import mil.nga.giat.geowave.core.store.filter.DistributableQueryFilter;
import mil.nga.giat.geowave.core.store.index.FilterableConstraints;
import mil.nga.giat.geowave.core.store.index.SecondaryIndex;
public class PropertyConstraintSet
{
private final Map<ByteArrayId, FilterableConstraints> constraints = new HashMap<ByteArrayId, FilterableConstraints>();
public PropertyConstraintSet() {}
public PropertyConstraintSet(
final FilterableConstraints constraint ) {
add(
constraint,
true);
}
public boolean isEmpty() {
return constraints.isEmpty();
}
public List<FilterableConstraints> getConstraintsFor(
final ByteArrayId[] fieldIds ) {
final List<FilterableConstraints> result = new LinkedList<FilterableConstraints>();
for (final ByteArrayId fieldId : fieldIds) {
final FilterableConstraints c = constraints.get(fieldId);
if (c != null) {
result.add(c);
}
}
return result;
}
public List<ByteArrayRange> getRangesFor(
final SecondaryIndex<?> index ) {
final List<ByteArrayRange> result = new LinkedList<ByteArrayRange>();
final FilterableConstraints c = constraints.get(index.getFieldId());
if (c != null) {
result.addAll(index.getIndexStrategy().getQueryRanges(
c));
}
return result;
}
public List<DistributableQueryFilter> getFiltersFor(
final SecondaryIndex<?> index ) {
final List<DistributableQueryFilter> result = new LinkedList<DistributableQueryFilter>();
final FilterableConstraints c = constraints.get(index.getFieldId());
if (c != null) {
final DistributableQueryFilter filter = c.getFilter();
if (filter != null) {
result.add(filter);
}
}
return result;
}
public void add(
final FilterableConstraints constraint,
final boolean intersect ) {
final ByteArrayId id = constraint.getFieldId();
final FilterableConstraints constraintsForId = constraints.get(id);
if (constraintsForId == null) {
constraints.put(
id,
constraint);
}
else if (intersect) {
constraints.put(
id,
constraintsForId.intersect(constraint));
}
else {
constraints.put(
id,
constraintsForId.union(constraint));
}
}
public void intersect(
final PropertyConstraintSet set ) {
for (final Map.Entry<ByteArrayId, FilterableConstraints> entry : set.constraints.entrySet()) {
add(
entry.getValue(),
true);
}
}
public void union(
final PropertyConstraintSet set ) {
for (final Map.Entry<ByteArrayId, FilterableConstraints> entry : set.constraints.entrySet()) {
add(
entry.getValue(),
false);
}
}
public FilterableConstraints getConstraintsById(
final ByteArrayId id ) {
return constraints.get(id);
}
}