package org.aksw.jena_sparql_api.views.index; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NavigableSet; import java.util.TreeSet; import java.util.function.BinaryOperator; import org.aksw.jena_sparql_api.utils.model.Quadlet; public class QuadPrefixes { public static final QuadPrefixes ALWAYS_MATCHING = createAlwaysMatching(); protected Quadlet<? extends NavigableSet<String>> prefixes; protected boolean mayBeObjectLiteral; protected boolean mayBeObjectResource; public QuadPrefixes(Quadlet<? extends NavigableSet<String>> prefixes, boolean mayBeObjectResource, boolean mayBeObjectLiteral) { super(); this.prefixes = prefixes; this.mayBeObjectLiteral = mayBeObjectLiteral; this.mayBeObjectResource = mayBeObjectResource; } public Quadlet<? extends NavigableSet<String>> getPrefixes() { return prefixes; } public boolean isMayBeObjectLiteral() { return mayBeObjectLiteral; } public boolean isMayBeObjectResource() { return mayBeObjectResource; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (mayBeObjectLiteral ? 1231 : 1237); result = prime * result + (mayBeObjectResource ? 1231 : 1237); result = prime * result + ((prefixes == null) ? 0 : prefixes.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; QuadPrefixes other = (QuadPrefixes) obj; if (mayBeObjectLiteral != other.mayBeObjectLiteral) return false; if (mayBeObjectResource != other.mayBeObjectResource) return false; if (prefixes == null) { if (other.prefixes != null) return false; } else if (!prefixes.equals(other.prefixes)) return false; return true; } @Override public String toString() { return "PrefixDescription [prefixes=" + prefixes + ", mayBeObjectLiteral=" + mayBeObjectLiteral + ", mayBeObjectResource=" + mayBeObjectResource + "]"; } public static QuadPrefixes createAlwaysMatching() { NavigableSet<String> x = new TreeSet<String>(Collections.singleton("")); QuadPrefixes result = new QuadPrefixes(new Quadlet<>(x, x, x, x), true, true); return result; } public static QuadPrefixes intersect(QuadPrefixes a, QuadPrefixes b) { QuadPrefixes result = applyOp(a, b, CandidateViewSelectorImpl::intersectPrefixes, Boolean::logicalAnd); return result; } public static QuadPrefixes union(QuadPrefixes a, QuadPrefixes b) { QuadPrefixes result = applyOp(a, b, CandidateViewSelectorImpl::unionPrefixes, Boolean::logicalOr); return result; } public static QuadPrefixes applyOp(QuadPrefixes a, QuadPrefixes b, BinaryOperator<NavigableSet<String>> prefixOp, BinaryOperator<Boolean> booleanOp) { Quadlet<? extends NavigableSet<String>> pa = a.getPrefixes(); Quadlet<? extends NavigableSet<String>> pb = b.getPrefixes(); int n = pa.size(); List<NavigableSet<String>> components = new ArrayList<>(4); for(int i = 0; i < n; ++i) { NavigableSet<String> pas = pa.get(i); NavigableSet<String> pbs = pb.get(i); NavigableSet<String> c = prefixOp.apply(pas, pbs); components.add(c); } Quadlet<NavigableSet<String>> quadlet = new Quadlet<>(components); boolean mayBeResource = booleanOp.apply(a.isMayBeObjectResource(), b.isMayBeObjectResource()); boolean mayBeLiteral = booleanOp.apply(a.isMayBeObjectLiteral(), b.isMayBeObjectLiteral()); QuadPrefixes result = new QuadPrefixes(quadlet, mayBeResource, mayBeLiteral); return result; } }