package org.aksw.jena_sparql_api.views; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class ValueSet<T> { private Set<T> values; private boolean isPositive; public ValueSet(Set<T> values) { this.values = values; this.isPositive = true; } public ValueSet(boolean isPositive, Set<T> values) { this.values = values; this.isPositive = isPositive; } /* public ValueSet(boolean isPositive, T ...values) { this.isPositive = isPositive; this.values = new HashSet<T>(Arrays.asList(values)); }*/ public static <T> ValueSet<T> create(boolean isPositive, T ... values) { //this.isPositive = isPositive; Set<T> v = new HashSet<T>(Arrays.asList(values)); ValueSet<T> result = new ValueSet<T>(isPositive, v); return result; } /** * case: positive - positive * Simply take the intersection * * case: positive - negative * {1, 2, 3} intersect {not {2}}: -> {1, 3} (positive.removeAll(negative)) * * case: negative - positive * Same as above * * case: negative - negative * Simply take the union * * * @param other * @return */ public ValueSet<T> intersect(ValueSet<T> that) { Set<T> set = new HashSet<T>(); boolean isPos = true; if(isPositive) { if(that.isPositive) { set.addAll(this.values); set.retainAll(that.values); } else { set.addAll(this.values); set.removeAll(that.values); } } else { if(that.isPositive) { set.addAll(that.values); set.removeAll(this.values); } else { set.addAll(this.values); set.addAll(that.values); isPos = false; } } ValueSet<T> result = new ValueSet<T>(isPos, set); return result; } /** * case: positive - positive * Simply take the union * * case: positive - negative * {1, 2, 3} intersect {not {1, 4}}: -> {4} (negative.removeAll(positive)) * * case: negative - positive * Same as above * * case: negative - negative * Simply take the intersection * * @param that * @return */ public ValueSet<T> union(ValueSet<T> that) { Set<T> set = new HashSet<T>(); boolean isPos = true; if(isPositive) { if(that.isPositive) { set.addAll(this.values); set.addAll(that.values); } else { set.addAll(that.values); set.removeAll(this.values); isPos = false; } } else { if(that.isPositive) { set.addAll(this.values); set.removeAll(that.values); isPos = false; } else { set.addAll(this.values); set.retainAll(that.values); } } ValueSet<T> result = new ValueSet<T>(isPos, set); return result; } public ValueSet<T> negate() { ValueSet<T> result = new ValueSet<T>(!isPositive, values); return result; } public boolean isEmpty() { return isPositive && values.isEmpty(); } public boolean contains(Object item) { boolean isContained = values.contains(item); boolean result = isPositive ? isContained : !isContained; return result; } @Override public String toString() { String polarity = (isPositive) ? "+" : "-"; return polarity + values; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (isPositive ? 1231 : 1237); result = prime * result + ((values == null) ? 0 : values.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ValueSet<?> other = (ValueSet<?>) obj; if (isPositive != other.isPositive) return false; if (values == null) { if (other.values != null) return false; } else if (!values.equals(other.values)) return false; return true; } }