package cz.cuni.mff.d3s.been.persistence;
/**
* A fluent builder for {@link AttributeFilter} objects
*
* @param <T> Type of the {@link QueryBuilderBase} extension that requested this builder
*
* @author darklight
*/
public class AttributeFilterBuilder<T extends QueryBuilderBase> {
private final T queryBuilder;
private final String attributeName;
AttributeFilterBuilder(T queryBuilder, String attributeName) {
this.queryBuilder = queryBuilder;
this.attributeName = attributeName;
}
/**
* Put an equality selector on the attribute. Only entries whose attribute value is equal to the specified value will be selected.
*
* @param value Value the attribute must have
*
* @return The query builder, with added selector
*/
public T equal(Object value) {
queryBuilder.selectors.put(attributeName, createEqFilter(value));
return queryBuilder;
}
/**
* Put a non-equality selector on the attribute. Only entries whose attribute value is different from the specified value will be selected.
*
* @param value Value the attribute must not have
*
* @return The query builder, with added selector
*/
public T differentFrom(Object value) {
queryBuilder.selectors.put(attributeName, createNotEqFilter(value));
return queryBuilder;
}
/**
* Put a 'like' selector on the attribute. Only entries matching the pattern (regex) will be selected.
*
* @param pattern Pattern the attribute value must match to be selected
*
* @return The query builder, with added selector
*/
public T like(String pattern) {
queryBuilder.selectors.put(attributeName, createPatternFilter(pattern));
return queryBuilder;
}
/**
* Put a '>=' selector on the attribute. Only entries whose value is superior or equal to provided value will be selected.
*
* @param value Minimal value for the attribute for its entry to pass into selection
*
* @return The query builder, with added selector
*/
public T above(Object value) {
queryBuilder.selectors.put(attributeName, createIntervalFilter(value, null));
return queryBuilder;
}
/**
* Put a '<' selector on the attribute. Only entries whose value is inferior to provided value will be selected
*
* @param value Minimal value of the attribute for its entry to be excluded from selection
*
* @return The query builder, with added selector
*/
public T below(Object value) {
queryBuilder.selectors.put(attributeName, createIntervalFilter(null, value));
return queryBuilder;
}
/**
* Put a 'in [lowBound, highBound)' selector on the attribute. Only entries whose value is inside the semi-open interval will be selected
*
* @param lowBound Minimal value of the attribute for its entry to be selected
* @param highBound Minimal value of the attribute for its entry to be excluded from selection
*
* @return The query builder, with added selector
*/
public T between(Object lowBound, Object highBound) {
queryBuilder.selectors.put(attributeName, createIntervalFilter(lowBound, highBound));
return queryBuilder;
}
private SkeletalAttributeFilter createEqFilter(Object value) {
return new EqAttributeFilter(value);
}
private SkeletalAttributeFilter createNotEqFilter(Object value) {
return new NotEqAttributeFilter(value);
}
private SkeletalAttributeFilter createPatternFilter(String pattern) {
return new PatternAttributeFilter(pattern);
}
private SkeletalAttributeFilter createIntervalFilter(Object lo, Object hi) {
return new IntervalAttributeFilter(lo, hi);
}
}