http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleReArranger.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleReArranger.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleReArranger.java deleted file mode 100644 index 089ef5d..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleReArranger.java +++ /dev/null @@ -1,348 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; -import mvm.rya.rdftriplestore.inference.DoNotExpandSP; -import mvm.rya.rdftriplestore.utils.FixedStatementPattern; - -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; - -import com.beust.jcommander.internal.Lists; -import com.google.common.collect.Collections2; -import com.google.common.collect.Maps; - - -//A given TupleExpr can be broken up into "join segments", which are sections of the TupleExpr where nodes can -//be freely exchanged. This class creates a list of permuted TupleExpr from a specified TupleExpr by permuting the nodes -//in each join segment. -public class TupleReArranger { - - private static Map<Join, List<List<TupleExpr>>> joinArgs; - private static Map<Join, List<Filter>> filterArgs; - - - public static Iterator<TupleExpr> getPlans(Iterator<TupleExpr> indexPlans) { - - final Iterator<TupleExpr> iter = indexPlans; - - return new Iterator<TupleExpr>() { - - private TupleExpr next = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - Iterator<TupleExpr> tuples = null; - - @Override - public boolean hasNext() { - - if (!hasNextCalled && !isEmpty) { - if (tuples != null && tuples.hasNext()) { - next = tuples.next(); - hasNextCalled = true; - return true; - } else { - while (iter.hasNext()) { - tuples = getTupleReOrderings(iter.next()).iterator(); - if (tuples == null) { - throw new IllegalStateException("Plans cannot be null!"); - } - next = tuples.next(); - hasNextCalled = true; - return true; - } - isEmpty = true; - return false; - } - } else if (isEmpty) { - return false; - } else { - return true; - } - } - - @Override - public TupleExpr next() { - - if (hasNextCalled) { - hasNextCalled = false; - return next; - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - hasNextCalled = false; - return next; - } else { - throw new NoSuchElementException(); - } - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException("Cannot delete from iterator!"); - } - }; - } - - - //Give a TupleExpr, return list of join segment permuted TupleExpr - public static List<TupleExpr> getTupleReOrderings(TupleExpr te) { - - joinArgs = Maps.newHashMap(); - filterArgs = Maps.newHashMap(); - - NodeCollector nc = new NodeCollector(); - te.visit(nc); - joinArgs = nc.getPerms(); - List<Join> joins = Lists.newArrayList(joinArgs.keySet()); - - return getPlans(getReOrderings(joins), te); - - } - - - //iterates through the reOrder maps, and for each reOrder map builds a new, reordered tupleExpr - private static List<TupleExpr> getPlans(List<Map<Join, List<TupleExpr>>> reOrderings, TupleExpr te) { - - List<TupleExpr> queryPlans = Lists.newArrayList(); - PermInserter pm = new PermInserter(); - - for (Map<Join, List<TupleExpr>> order : reOrderings) { - TupleExpr clone = te.clone(); - pm.setReOrderMap(order); - clone.visit(pm); - queryPlans.add(clone); - } - - return queryPlans; - } - - - - //recursive method which produces a list of maps. Each map associates a join with - //a list of the non-join arguments below it contained in same join segment. The list - //represents an ordering of the - //non-join arguments and creating a TupleExpr from this map yields a new TupleExpr - //whose non-join arguments are permuted - private static List<Map<Join, List<TupleExpr>>> getReOrderings(List<Join> joins) { - Map<Join, List<TupleExpr>> reOrder = Maps.newHashMap(); - List<Map<Join, List<TupleExpr>>> reOrderings = Lists.newArrayList(); - getReOrderings(joins, reOrder, reOrderings); - return reOrderings; - - } - - private static void getReOrderings(List<Join> joins, Map<Join, List<TupleExpr>> reOrder, - List<Map<Join, List<TupleExpr>>> reOrderings) { - - if (joins.isEmpty()) { - reOrderings.add(reOrder); - return; - } - - List<Join> joinsCopy = Lists.newArrayList(joins); - Join join = joinsCopy.remove(0); - List<List<TupleExpr>> joinArgPerms = joinArgs.get(join); - for (List<TupleExpr> tupList : joinArgPerms) { - Map<Join, List<TupleExpr>> newReOrder = Maps.newHashMap(reOrder); - newReOrder.put(join, tupList); - getReOrderings(joinsCopy, newReOrder, reOrderings); - } - - return; - - } - - - //creates a map which associates each first join of a TupleExpr join segment with all permutations of - //the non-join nodes after it. More specifically, each join is associated with a list of TupleExpr - //lists, where each list represents an ordering of the non-join nodes following the associated join - private static class NodeCollector extends QueryModelVisitorBase<RuntimeException> { - - private static List<Filter> filterList; - - public Map<Join, List<List<TupleExpr>>> getPerms() { - return joinArgs; - } - - @Override - public void meet(Join node) { - - filterList = Lists.newArrayList(); - - List<TupleExpr> args = Lists.newArrayList(); - args = getJoinArgs(node, args); - List<List<TupleExpr>> argPerms = Lists.newArrayList(Collections2.permutations(args)); - joinArgs.put(node, argPerms); - filterArgs.put(node, filterList); - - for (TupleExpr te : args) { - if (!(te instanceof StatementPattern) && !(te instanceof ExternalTupleSet)) { - te.visit(this); - } - } - - } - - - //get all non-join nodes below tupleExpr in same join segment - private static List<TupleExpr> getJoinArgs(TupleExpr tupleExpr, List<TupleExpr> joinArgs) { - if (tupleExpr instanceof Join) { - if (!(((Join) tupleExpr).getLeftArg() instanceof FixedStatementPattern) - && !(((Join) tupleExpr).getRightArg() instanceof DoNotExpandSP)) { - Join join = (Join) tupleExpr; - getJoinArgs(join.getLeftArg(), joinArgs); - getJoinArgs(join.getRightArg(), joinArgs); - } // assumes all filter occur above first join of segment -- - // this should be the state - // after PrecompJoinOptimizer is called - } else if (tupleExpr instanceof Filter) { - filterList.add((Filter) tupleExpr); - getJoinArgs(((Filter) tupleExpr).getArg(), joinArgs); - } else { - joinArgs.add(tupleExpr); - } - - return joinArgs; - } - - } - - - - //for a given reOrder map, searches through TupleExpr and places each reordered collection - //of nodes at appropriate join - private static class PermInserter extends QueryModelVisitorBase<RuntimeException> { - - private Map<Join, List<TupleExpr>> reOrderMap = Maps.newHashMap(); - - public void setReOrderMap(Map<Join, List<TupleExpr>> reOrderMap) { - this.reOrderMap = reOrderMap; - } - - @Override - public void meet(Join node) { - - List<TupleExpr> reOrder = reOrderMap.get(node); - if (reOrder != null) { - List<Filter> filterList = Lists.newArrayList(filterArgs.get(node)); - node.replaceWith(getNewJoin(reOrder, getFilterChain(filterList))); - - for (TupleExpr te : reOrder) { - if (!(te instanceof StatementPattern) && !(te instanceof ExternalTupleSet)) { - te.visit(this); - } - } - } - super.meet(node); - } - } - - - // chain filters together and return front and back of chain - private static List<TupleExpr> getFilterChain(List<Filter> filters) { - List<TupleExpr> filterTopBottom = Lists.newArrayList(); - Filter filterChainTop = null; - Filter filterChainBottom = null; - - for (Filter filter : filters) { - if (filterChainTop == null) { - filterChainTop = filter.clone(); - } else if (filterChainBottom == null) { - filterChainBottom = filter.clone(); - filterChainTop.setArg(filterChainBottom); - } else { - Filter newFilter = filter.clone(); - filterChainBottom.setArg(newFilter); - filterChainBottom = newFilter; - } - } - if (filterChainTop != null) { - filterTopBottom.add(filterChainTop); - } - if (filterChainBottom != null) { - filterTopBottom.add(filterChainBottom); - } - return filterTopBottom; - } - - // build newJoin node given remaining joinArgs and chain of filters - private static TupleExpr getNewJoin(List<TupleExpr> args, List<TupleExpr> filterChain) { - TupleExpr newJoin; - List<TupleExpr> joinArgs = Lists.newArrayList(args); - - if (joinArgs.size() > 1) { - if (filterChain.size() > 0) { - TupleExpr finalJoinArg = joinArgs.remove(0).clone(); - TupleExpr tempJoin; - TupleExpr temp = filterChain.get(0); - - if (joinArgs.size() > 1) { - tempJoin = new Join(joinArgs.remove(0).clone(), joinArgs.remove(0).clone()); - for (TupleExpr te : joinArgs) { - tempJoin = new Join(tempJoin, te.clone()); - } - } else { - tempJoin = joinArgs.remove(0).clone(); - } - - if (filterChain.size() == 1) { - ((Filter) temp).setArg(tempJoin); - } else { - ((Filter) filterChain.get(1)).setArg(tempJoin); - } - newJoin = new Join(temp, finalJoinArg); - } else { - newJoin = new Join(joinArgs.remove(0).clone(), joinArgs.remove(0).clone()); - - for (TupleExpr te : joinArgs) { - newJoin = new Join(newJoin, te.clone()); - } - } - } else if (joinArgs.size() == 1) { - if (filterChain.size() > 0) { - newJoin = filterChain.get(0); - if (filterChain.size() == 1) { - ((Filter) newJoin).setArg(joinArgs.get(0).clone()); - } else { - ((Filter) filterChain.get(1)).setArg(joinArgs.get(0).clone()); - } - } else { - newJoin = joinArgs.get(0).clone(); - } - } else { - throw new IllegalStateException("JoinArgs size cannot be zero."); - } - return newJoin; - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleValidator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleValidator.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleValidator.java deleted file mode 100644 index 4960d78..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/TupleValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Iterator; - -import org.openrdf.query.algebra.TupleExpr; - -public interface TupleValidator { - - public boolean isValid(TupleExpr te); - - public Iterator<TupleExpr> getValidTuples(Iterator<TupleExpr> tupleList); - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java deleted file mode 100644 index 483457f..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java +++ /dev/null @@ -1,461 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Set; - -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; - -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; - -import com.google.common.base.Joiner; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -public class ValidIndexCombinationGenerator { - - private TupleExpr query; - private Set<String> invalidCombos = Sets.newTreeSet(); - private Set<QueryModelNode> spFilterSet; - - public ValidIndexCombinationGenerator(TupleExpr query) { - this.query = query; - SpFilterCollector sfc = new SpFilterCollector(); - query.visit(sfc); - spFilterSet = sfc.getSpFilterSet(); - } - - public Iterator<List<ExternalTupleSet>> getValidIndexCombos( - List<ExternalTupleSet> indexSet) { - - Collections.shuffle(indexSet); - final List<ExternalTupleSet> list = indexSet; - final Iterator<List<Integer>> iter = getValidCombos(list); - - return new Iterator<List<ExternalTupleSet>>() { - - private List<ExternalTupleSet> next = null; - private List<Integer> nextCombo = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - - @Override - public boolean hasNext() { - - if (!hasNextCalled && !isEmpty) { - if (!iter.hasNext()) { - isEmpty = true; - return false; - } else { - nextCombo = iter.next(); - List<ExternalTupleSet> indexCombo = Lists - .newArrayList(); - for (Integer i : nextCombo) { - indexCombo.add(list.get(i)); - } - next = indexCombo; - hasNextCalled = true; - return true; - - } - - } else if (isEmpty) { - return false; - } else { - return true; - } - } - - @Override - public List<ExternalTupleSet> next() { - - if (hasNextCalled) { - hasNextCalled = false; - return next; - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - hasNextCalled = false; - return next; - } else { - throw new NoSuchElementException(); - } - } - } - - @Override - public void remove() { - - throw new UnsupportedOperationException( - "Cannot delete from iterator!"); - - } - - }; - - } - - private Iterator<List<Integer>> getValidCombos( - List<ExternalTupleSet> indexList) { - - final List<ExternalTupleSet> list = indexList; - final int indexSize = list.size(); - final Iterator<List<Integer>> iter = getCombos(indexSize); - - return new Iterator<List<Integer>>() { - - private List<Integer> next = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - - @Override - public boolean hasNext() { - if (!hasNextCalled && !isEmpty) { - - while (iter.hasNext()) { - List<Integer> tempNext = iter.next(); - if (isValid(tempNext, list)) { - next = tempNext; - hasNextCalled = true; - return true; - } - - } - - isEmpty = true; - return false; - - } else if (isEmpty) { - return false; - } else { - return true; - } - } - - @Override - public List<Integer> next() { - - if (hasNextCalled) { - hasNextCalled = false; - return next; - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - hasNextCalled = false; - return next; - } else { - throw new NoSuchElementException(); - } - - } - - } - - @Override - public void remove() { - - throw new UnsupportedOperationException( - "Cannot delete from iterator!"); - - } - - }; - } - - private Iterator<List<Integer>> getCombos(int indexListSize) { - - final int indexSize = indexListSize; - final int maxSubListSize = spFilterSet.size() / 2; - - return new Iterator<List<Integer>>() { - - private List<Integer> next = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - private int subListSize = Math.min(maxSubListSize, indexSize) + 1; - Iterator<List<Integer>> subList = null; - - @Override - public boolean hasNext() { - - if (!hasNextCalled && !isEmpty) { - if (subList != null && subList.hasNext()) { - next = subList.next(); - hasNextCalled = true; - return true; - } else { - subListSize--; - if (subListSize == 0) { - isEmpty = true; - return false; - } - subList = getCombos(subListSize, indexSize); - if (subList == null) { - throw new IllegalStateException( - "Combos cannot be null!"); - } - next = subList.next(); - hasNextCalled = true; - return true; - - } - } else if (isEmpty) { - return false; - } else { - return true; - } - } - - @Override - public List<Integer> next() { - - if (hasNextCalled) { - hasNextCalled = false; - return next; - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - hasNextCalled = false; - return next; - } else { - throw new NoSuchElementException(); - } - - } - - } - - @Override - public void remove() { - throw new UnsupportedOperationException( - "Cannot delete from iterator!"); - } - - }; - - } - - private Iterator<List<Integer>> getCombos(int subListSize, int indexListSize) { - - if (subListSize > indexListSize) { - throw new IllegalArgumentException( - "Sublist size must be less than or equal to list size!"); - } - - final int subSize = subListSize; - final int indexSize = indexListSize; - - return new Iterator<List<Integer>>() { - - private List<Integer> next = null; - private List<Integer> tempList = Lists.newArrayList(); - private boolean calledHasNext = false; - private boolean isEmpty = false; - - @Override - public boolean hasNext() { - - if (!calledHasNext && !isEmpty) { - if (next == null) { - for (int i = 0; i < subSize; i++) { - tempList.add(i); - } - next = tempList; - calledHasNext = true; - return true; - } else { - next = getNext(next, indexSize - 1); - if (next == null) { - isEmpty = true; - return false; - } else { - calledHasNext = true; - return true; - } - - } - } else if (isEmpty) { - return false; - } else { - return true; - } - - } - - @Override - public List<Integer> next() { - - if (calledHasNext) { - calledHasNext = false; - return next; - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - calledHasNext = false; - return next; - } else { - throw new NoSuchElementException(); - } - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - - } - - }; - } - - private List<Integer> getNext(List<Integer> prev, int maxInt) { - - List<Integer> returnList = Lists.newArrayList(); - int size = prev.size(); - int incrementPos = -1; - int incrementVal = 0; - - for (int i = 0; i < size; i++) { - if (prev.get(size - (i + 1)) != maxInt - i) { - incrementPos = size - (i + 1); - break; - } - } - - if (incrementPos == -1) { - return null; - } else { - - incrementVal = prev.get(incrementPos); - for (int i = 0; i < incrementPos; i++) { - returnList.add(prev.get(i)); - } - - for (int j = incrementPos; j < size; j++) { - returnList.add(++incrementVal); - } - - return returnList; - } - } - - private boolean isValid(List<Integer> combo, - List<ExternalTupleSet> indexList) { - - String s1 = Joiner.on("\u0000").join(combo).trim(); - - if (invalidCombos.contains(s1)) { - return false; - } else { - int valid = indicesDisjoint(combo, indexList); - - if (valid >= 0) { - String s2 = ""; - for (int i = 0; i < valid + 1; i++) { - if (s2.length() == 0) { - s2 = s2 + combo.get(i); - } else { - s2 = s2 + "\u0000" + combo.get(i); - } - } - invalidCombos.add(s2); - - for (int i = valid + 1; i < combo.size(); i++) { - s2 = s2 + "\u0000" + combo.get(i); - invalidCombos.add(s2); - } - - return false; - } else { - return true; - } - } - - } - - private int indicesDisjoint(List<Integer> combo, - List<ExternalTupleSet> indexList) { - - Set<QueryModelNode> indexNodes = Sets.newHashSet(); - Set<QueryModelNode> tempNodes; - TupleExpr temp; - - int j = 0; - for (Integer i : combo) { - temp = indexList.get(i).getTupleExpr(); - SpFilterCollector spf = new SpFilterCollector(); - temp.visit(spf); - tempNodes = spf.getSpFilterSet(); - if (Sets.intersection(indexNodes, tempNodes).size() == 0) { - indexNodes = Sets.union(indexNodes, tempNodes); - if (indexNodes.size() > spFilterSet.size()) { - return j; - } - } else { - return j; - } - j++; - } - - return -1; - } - - private static class SpFilterCollector extends - QueryModelVisitorBase<RuntimeException> { - - private Set<QueryModelNode> spFilterSet = Sets.newHashSet(); - - public int getNodeNumber() { - return spFilterSet.size(); - } - - public Set<QueryModelNode> getSpFilterSet() { - return spFilterSet; - } - - @Override - public void meet(StatementPattern node) { - - spFilterSet.add(node); - return; - - } - - @Override - public void meet(Filter node) { - - spFilterSet.add(node.getCondition()); - node.getArg().visit(this); - } - - } -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java deleted file mode 100644 index 577663b..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java +++ /dev/null @@ -1,174 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; - -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.ValueConstant; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - - - - -public class VarConstantIndexListPruner implements IndexListPruner { - - private Map<String, Integer> queryConstantMap; - private int querySpCount; - private int queryFilterCount; - - public VarConstantIndexListPruner(TupleExpr te) { - - ConstantCollector cc = new ConstantCollector(); - te.visit(cc); - this.queryConstantMap = cc.getConstantMap(); - querySpCount = cc.getSpCount(); - queryFilterCount = cc.getFilterCount(); - } - - @Override - public List<ExternalTupleSet> getRelevantIndices(List<ExternalTupleSet> indexList) { - - List<ExternalTupleSet> relIndexSet = new ArrayList<>(); - - for (ExternalTupleSet e : indexList) { - - if (isRelevant(e.getTupleExpr())) { - relIndexSet.add(e); - } - - } - - return relIndexSet; - } - - private boolean isRelevant(TupleExpr index) { - - ConstantCollector cc = new ConstantCollector(); - index.visit(cc); - - Map<String, Integer> indexConstantMap = cc.getConstantMap(); - int indexSpCount = cc.getSpCount(); - int indexFilterCount = cc.getFilterCount(); - Set<String> indexConstants = indexConstantMap.keySet(); - - if (indexSpCount > querySpCount || indexFilterCount > queryFilterCount - || !Sets.intersection(indexConstants, queryConstantMap.keySet()).equals(indexConstants)) { - return false; - } - - for (String s : indexConstants) { - if (indexConstantMap.get(s) > queryConstantMap.get(s)) { - return false; - } - } - - return true; - } - - - private static class ConstantCollector extends QueryModelVisitorBase<RuntimeException> { - - private Map<String, Integer> constantMap = Maps.newHashMap(); - private int spCount = 0; - private int filterCount = 0; - - - @Override - public void meet(StatementPattern node) throws RuntimeException { - - spCount++; - super.meet(node); - - } - - - @Override - public void meet(Filter node) throws RuntimeException { - - filterCount++; - super.meet(node); - - } - - - - - @Override - public void meet(Var node) throws RuntimeException { - - if (node.isConstant()) { - String key = node.getValue().toString(); - if(constantMap.containsKey(key)){ - int count = constantMap.get(key); - count += 1; - constantMap.put(key, count); - } else { - constantMap.put(key, 1); - } - } - - } - - - @Override - public void meet(ValueConstant node) throws RuntimeException { - - String key = node.getValue().toString(); - - if(constantMap.containsKey(key)) { - int count = constantMap.get(key); - count += 1; - constantMap.put(key, count); - } else { - constantMap.put(key,1); - } - - } - - - public Map<String, Integer> getConstantMap() { - return constantMap; - } - - public int getSpCount(){ - return spCount; - } - - - public int getFilterCount() { - return filterCount; - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexingExpr.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexingExpr.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexingExpr.java deleted file mode 100644 index 1d4c4bb..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexingExpr.java +++ /dev/null @@ -1,94 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Set; - -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.Var; - -import com.google.common.collect.Sets; - -public class IndexingExpr { - - private final URI function; - private final Value[] arguments; - private final StatementPattern spConstraint; - - public IndexingExpr(URI function, StatementPattern spConstraint, Value... arguments) { - this.function = function; - this.arguments = arguments; - this.spConstraint = spConstraint; - } - - public URI getFunction() { - return function; - } - - public Value[] getArguments() { - return arguments; - } - - public StatementPattern getSpConstraint() { - return spConstraint; - } - - - public Set<String> getBindingNames() { - //resource and match variable for search are already included as standard result-bindings - Set<String> bindings = Sets.newHashSet(); - - for(Var v: spConstraint.getVarList()) { - if(!v.isConstant()) { - bindings.add(v.getName()); - } - } - return bindings; - } - - - @Override - public boolean equals(Object other) { - if (!(other instanceof IndexingExpr)) { - return false; - } - IndexingExpr arg = (IndexingExpr) other; - return (this.function.equals(arg.function)) && (this.spConstraint.equals(arg.spConstraint)) - && (this.arguments.equals(arg.arguments)); - } - - - @Override - public int hashCode() { - int result = 17; - result = 31*result + function.hashCode(); - result = 31*result + spConstraint.hashCode(); - result = 31*result + arguments.hashCode(); - - return result; - } - -} - - - http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IndexingFunctionRegistry.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexingFunctionRegistry.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexingFunctionRegistry.java deleted file mode 100644 index 2f2c486..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexingFunctionRegistry.java +++ /dev/null @@ -1,134 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.openrdf.model.URI; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.query.algebra.ValueConstant; -import org.openrdf.query.algebra.ValueExpr; -import org.openrdf.query.algebra.Var; - -import com.google.common.collect.Maps; - -public class IndexingFunctionRegistry { - - - private static final Map<URI, FUNCTION_TYPE> SEARCH_FUNCTIONS = Maps.newHashMap(); - - static { - - String TEMPORAL_NS = "tag:rya-rdf.org,2015:temporal#"; - - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"after"),FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"before"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"equals"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"beforeInterval"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"afterInterval"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"insideInterval"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"hasBeginningInterval"), FUNCTION_TYPE.TEMPORAL); - SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"hasEndInterval"), FUNCTION_TYPE.TEMPORAL); - - - SEARCH_FUNCTIONS.put(new URIImpl("http://rdf.useekm.com/fts#text"), FUNCTION_TYPE.FREETEXT); - - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_EQUALS, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_DISJOINT, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_INTERSECTS, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_TOUCHES, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_WITHIN, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_CONTAINS, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_OVERLAPS, FUNCTION_TYPE.GEO); - SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_CROSSES, FUNCTION_TYPE.GEO); - - } - - public enum FUNCTION_TYPE {GEO, TEMPORAL, FREETEXT}; - - - public static Set<URI> getFunctions() { - return SEARCH_FUNCTIONS.keySet(); - } - - - public static Var getResultVarFromFunctionCall(URI function, List<ValueExpr> args) { - - FUNCTION_TYPE type = SEARCH_FUNCTIONS.get(function); - - switch(type) { - case GEO: - return findBinaryResultVar(args); - case FREETEXT: - return findLiteralResultVar(args); - case TEMPORAL: - return findBinaryResultVar(args); - default: - return null; - } - - } - - - public static FUNCTION_TYPE getFunctionType(URI func) { - return SEARCH_FUNCTIONS.get(func); - } - - - - private static boolean isUnboundVariable(ValueExpr expr) { - return expr instanceof Var && !((Var)expr).hasValue(); - } - - private static boolean isConstant(ValueExpr expr) { - return expr instanceof ValueConstant || (expr instanceof Var && ((Var)expr).hasValue()); - } - - - private static Var findBinaryResultVar(List<ValueExpr> args) { - - if (args.size() >= 2) { - ValueExpr arg1 = args.get(0); - ValueExpr arg2 = args.get(1); - if (isUnboundVariable(arg1) && isConstant(arg2)) - return (Var) arg1; - else if (isUnboundVariable(arg2) && isConstant(arg1)) - return (Var) arg2; - } - return null; - } - - - private static Var findLiteralResultVar(List<ValueExpr> args) { - if (args.size() >= 2) { - ValueExpr arg1 = args.get(0); - ValueExpr arg2 = args.get(1); - if (isUnboundVariable(arg1) && isConstant(arg2)) - return (Var)arg1; - } - return null; - } - - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/IteratorFactory.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IteratorFactory.java b/extras/indexing/src/main/java/mvm/rya/indexing/IteratorFactory.java deleted file mode 100644 index eb88d99..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IteratorFactory.java +++ /dev/null @@ -1,159 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import info.aduna.iteration.CloseableIteration; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.NoSuchElementException; -import java.util.Set; - -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.impl.MapBindingSet; - - -//Given StatementPattern constraint and SearchFunction associated with an Indexing Node, -//creates appropriate StatementConstraints object from StatementPattern constraint and -//binding set and then uses SearchFunction to delegate query to appropriate index. -//Resulting iterator over statements is then converted to an iterator over binding sets -public class IteratorFactory { - - public static CloseableIteration<BindingSet, QueryEvaluationException> getIterator(final StatementPattern match, - final BindingSet bindings, final String queryText, final SearchFunction searchFunction) { - return new CloseableIteration<BindingSet, QueryEvaluationException>() { - - private boolean isClosed = false; - private CloseableIteration<Statement, QueryEvaluationException> statementIt = null; - - private String subjectBinding = match.getSubjectVar().getName(); - private String predicateBinding = match.getPredicateVar().getName(); - private String objectBinding = match.getObjectVar().getName(); - private String contextBinding = null; - - private void performQuery() throws QueryEvaluationException { - - StatementConstraints contraints = new StatementConstraints(); - - // get the context (i.e. named graph) of the statement and use that in the query - QueryModelNode parentNode = match.getSubjectVar().getParentNode(); - if (parentNode instanceof StatementPattern) { - StatementPattern parentStatement = (StatementPattern) parentNode; - Var contextVar = parentStatement.getContextVar(); - if (contextVar != null) { - contextBinding = contextVar.getName(); - Resource context = (Resource) contextVar.getValue(); - contraints.setContext(context); - } - } - - // get the subject constraint - if (match.getSubjectVar().isConstant()) { - // get the subject binding from the filter/statement pair - Resource subject = (Resource) match.getSubjectVar().getValue(); - contraints.setSubject(subject); - } else if (bindings.hasBinding(subjectBinding)) { - // get the subject binding from the passed in bindings (eg from other statements/parts of the tree) - Resource subject = (Resource) bindings.getValue(subjectBinding); - contraints.setSubject(subject); - } - - // get the predicate constraint - if (match.getPredicateVar().isConstant()) { - // get the predicate binding from the filter/statement pair - Set<URI> predicates = new HashSet<URI>(getPredicateRestrictions(match.getPredicateVar())); - contraints.setPredicates(predicates); - } else if (bindings.hasBinding(predicateBinding)) { - // get the predicate binding from the passed in bindings (eg from other statements/parts of the tree) - URI predicateUri = (URI) bindings.getValue(predicateBinding); - Set<URI> predicates = Collections.singleton(predicateUri); - contraints.setPredicates(predicates); - } - - statementIt = searchFunction.performSearch(queryText, contraints); - } - - @Override - public boolean hasNext() throws QueryEvaluationException { - if (statementIt == null) { - performQuery(); - } - return statementIt.hasNext(); - } - - @Override - public BindingSet next() throws QueryEvaluationException { - if (!hasNext() || isClosed) { - throw new NoSuchElementException(); - } - - Statement statment = statementIt.next(); - - MapBindingSet bset = new MapBindingSet(); - if (!subjectBinding.startsWith("-const")) - bset.addBinding(subjectBinding, statment.getSubject()); - if (!predicateBinding.startsWith("-const")) - bset.addBinding(predicateBinding, statment.getPredicate()); - if (!objectBinding.startsWith("-const")) - bset.addBinding(objectBinding, statment.getObject()); - if (contextBinding != null && !contextBinding.startsWith("-const")) - bset.addBinding(contextBinding, statment.getContext()); - - // merge with other bindings. - for (String name : bindings.getBindingNames()) { - bset.addBinding(name, bindings.getValue(name)); - } - - return bset; - } - - @Override - public void remove() throws QueryEvaluationException { - throw new UnsupportedOperationException(); - - } - - @Override - public void close() throws QueryEvaluationException { - if (statementIt != null) { - statementIt.close(); - } - isClosed = true; - } - - }; - - } - - public static Collection<URI> getPredicateRestrictions(Var predicate) { - if (predicate.hasValue()) - return Collections.singleton((URI) predicate.getValue()); - return Collections.emptyList(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/KeyParts.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/KeyParts.java b/extras/indexing/src/main/java/mvm/rya/indexing/KeyParts.java deleted file mode 100644 index 2dd7a73..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/KeyParts.java +++ /dev/null @@ -1,333 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import org.apache.accumulo.core.data.Value; -import org.apache.commons.codec.binary.StringUtils; -import org.apache.hadoop.io.Text; -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.model.impl.ContextStatementImpl; -import org.openrdf.model.impl.StatementImpl; -import org.openrdf.model.impl.URIImpl; - -/** - * Store and format the various temporal index keys. - * Row Keys are in these two forms, where [x] denotes x is optional: - * rowkey = contraintPrefix datetime - * rowkey = datetime 0x/00 uniquesuffix - * contraintPrefix = 0x/00 hash([subject][predicate]) - * uniquesuffix = some bytes to make it unique, like hash(statement). - * - * The instance is in one of two modes depending on the constructor: - * storage mode -- construct with a triple statement, get an iterator of keys to store. - * query mode -- construct with a statement and query constraints, get the key prefix to search. - * - * this has the flavor of an immutable object - * This is independent of the underlying database engine - * - * @author David.Lotts - * - */ -public class KeyParts implements Iterable<KeyParts> { - private static final String CQ_S_P_AT = "spo"; - private static final String CQ_P_AT = "po"; - private static final String CQ_S_AT = "so"; - private static final String CQ_O_AT = "o"; - public static final String CQ_BEGIN = "begin"; - public static final String CQ_END = "end"; - - public static final byte[] HASH_PREFIX = new byte[] {0}; - public static final byte[] HASH_PREFIX_FOLLOWING = new byte[] {1}; - - public final Text cf; - public final Text cq; - public final Text constraintPrefix; // subject and/or predicate - final Text storeKey; // subject and/or predicate - final private TemporalInstant instant; - final private Statement statement; - final private boolean queryMode; - KeyParts(final Text constraintPrefix, final TemporalInstant instant, final String cf, final String cq) { - queryMode = true; // query mode - storeKey = null; - statement = null; - this.constraintPrefix = constraintPrefix; - this.instant = instant; - this.cf = new Text(cf); - this.cq = new Text(cq); - } - - /** - * this is the value to index. - * @return - */ - public Value getValue() { - assert statement!=null; - return new Value(StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - } - - public KeyParts(final Statement statement, final TemporalInstant instant2) { - queryMode = false; // store mode - storeKey = null; - constraintPrefix = null; - this.statement = statement; - instant = instant2; - cf = null; - cq = null; - } - - private KeyParts(final Text keyText, final Text cf, final Text cq, final Statement statement) { - queryMode = false; // store mode - constraintPrefix = null; - this.statement = statement; - instant = null; - storeKey = keyText; - this.cf = cf; - this.cq = cq; - } - - @Override - public Iterator<KeyParts> iterator() { - final String[] strategies = new String[] { - CQ_O_AT, CQ_S_P_AT, CQ_P_AT, CQ_S_AT - } ; // CQ_END? - assert !queryMode : "iterator for queryMode is not immplemented" ; - if (queryMode) { - return null; - } - - // if (!queryMode) - return new Iterator<KeyParts>() { - int nextStrategy = 0; - - @Override - public boolean hasNext() { - return nextStrategy < strategies.length; - } - - @Override - public KeyParts next() { - assert(statement!=null); - Text keyText = new Text(); - // increment++ the next strategy AFTER getting the value - switch (nextStrategy++) { - case 0: // index o+hash(p+s) - assert (CQ_O_AT.equals(strategies[0])); - keyText = new Text(instant.getAsKeyBytes()); - KeyParts.appendUniqueness(statement, keyText); - return new KeyParts(keyText, new Text(StatementSerializer.writeContext(statement)), new Text(CQ_O_AT), statement); - case 1:// index hash(s+p)+o - assert (CQ_S_P_AT.equals(strategies[1])); - KeyParts.appendSubjectPredicate(statement, keyText); - KeyParts.appendInstant(instant, keyText); - // appendUniqueness -- Not needed since it is already unique. - return new KeyParts(keyText, new Text(StatementSerializer.writeContext(statement)), new Text(CQ_S_P_AT), statement); - case 2: // index hash(p)+o - assert (CQ_P_AT.equals(strategies[2])); - KeyParts.appendPredicate(statement, keyText); - KeyParts.appendInstant(instant, keyText); - KeyParts.appendUniqueness(statement, keyText); - return new KeyParts(keyText, new Text(StatementSerializer.writeContext(statement)), new Text(CQ_P_AT), statement); - case 3: // index hash(s)+o - assert (CQ_S_AT.equals(strategies[3])); - KeyParts.appendSubject(statement, keyText); - KeyParts.appendInstant(instant, keyText); - KeyParts.appendUniqueness(statement, keyText); - return new KeyParts(keyText, new Text(StatementSerializer.writeContext(statement)), new Text(CQ_S_AT), statement); - } - throw new Error("Next passed end? No such nextStrategy="+(nextStrategy-1)); - - } - - @Override - public void remove() { - throw new Error("Remove not Implemented."); - } - }; - } - - public byte[] getStoreKey() { - assert !queryMode : "must be in store Mode, store keys are not initialized."; - return storeKey.copyBytes(); - } - - /** - * Query key is the prefix plus the datetime, but no uniqueness at the end. - * @return the row key for range queries. - */ - public Text getQueryKey() { - return getQueryKey(instant); - }; - - /** - * Query key is the prefix plus the datetime, but no uniqueness at the end. - * - * @return the row key for range queries. - */ - public Text getQueryKey(final TemporalInstant theInstant) { - assert queryMode : "must be in query Mode, query keys are not initialized."; - final Text keyText = new Text(); - if (constraintPrefix != null) { - appendBytes(constraintPrefix.copyBytes(), keyText); - } - appendInstant(theInstant, keyText); - return keyText; - }; - - @Override - public String toString() { - return "KeyParts [contraintPrefix=" + toHumanString(constraintPrefix) + ", instant=" + toHumanString(instant.getAsKeyBytes()) + ", cf=" + cf + ", cq=" + cq + "]"; - } - private static void appendSubject(final Statement statement, final Text keyText) { - final Value statementValue = new Value(StatementSerializer.writeSubject(statement).getBytes()); - final byte[] hashOfValue = uniqueFromValueForKey(statementValue); - appendBytes(HASH_PREFIX, keyText); // prefix the hash with a zero byte. - appendBytes(hashOfValue, keyText); - } - - private static void appendPredicate(final Statement statement, final Text keyText) { - final Value statementValue = new Value(StringUtils.getBytesUtf8(StatementSerializer.writePredicate(statement))); - final byte[] hashOfValue = uniqueFromValueForKey(statementValue); - appendBytes(HASH_PREFIX, keyText); // prefix the hash with a zero byte. - appendBytes(hashOfValue, keyText); - } - - private static void appendInstant(final TemporalInstant instant, final Text keyText) { - final byte[] bytes = instant.getAsKeyBytes(); - appendBytes(bytes, keyText); - } - - private static void appendSubjectPredicate(final Statement statement, final Text keyText) { - final Value statementValue = new Value(StringUtils.getBytesUtf8(StatementSerializer.writeSubjectPredicate(statement))); - final byte[] hashOfValue = uniqueFromValueForKey(statementValue); - appendBytes(HASH_PREFIX, keyText); // prefix the hash with a zero byte. - appendBytes(hashOfValue, keyText); - } - - /** - * Append any byte array to a row key. - * @param bytes append this - * @param keyText text to append to - */ - private static void appendBytes(final byte[] bytes, final Text keyText) { - keyText.append(bytes, 0, bytes.length); - } - - /** - * Get a collision unlikely hash string and append to the key, - * so that if two keys have the same value, then they will be the same, - * if two different values that occur at the same time there keys are different. - * If the application uses a very large number of statements at the exact same time, - * the md5 value might be upgraded to for example sha-1 to avoid collisions. - * @param statement - * @param keyText - */ - public static void appendUniqueness(final Statement statement, final Text keyText) { - keyText.append(HASH_PREFIX, 0, 1); // delimiter - final Value statementValue = new Value(StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - final byte[] hashOfValue = Md5Hash.md5Binary(statementValue); - keyText.append(hashOfValue, 0, hashOfValue.length); - } - /** - * Get a collision unlikely hash string to append to the key, - * so that if two keys have the same value, then they will be the same, - * if two different values that occur at the same time there keys are different. - * @param value - * @return - */ - private static byte[] uniqueFromValueForKey(final Value value) { - return Md5Hash.md5Binary(value); - } - - /** - * List all the index keys to find for any query. Set the strategy via the column qualifier, ex: CQ_S_P_AT. - * Column Family (CF) is the context/named-graph. - * @param queryInstant - * @param contraints - * @return - */ - static public List<KeyParts> keyPartsForQuery(final TemporalInstant queryInstant, final StatementConstraints contraints) { - final List<KeyParts> keys = new LinkedList<KeyParts>(); - final URI urlNull = new URIImpl("urn:null"); - final Resource currentContext = contraints.getContext(); - final boolean hasSubj = contraints.hasSubject(); - if (contraints.hasPredicates()) { - for (final URI nextPredicate : contraints.getPredicates()) { - final Text contraintPrefix = new Text(); - final Statement statement = new ContextStatementImpl(hasSubj ? contraints.getSubject() : urlNull, nextPredicate, urlNull, contraints.getContext()); - if (hasSubj) { - appendSubjectPredicate(statement, contraintPrefix); - } else { - appendPredicate(statement, contraintPrefix); - } - keys.add(new KeyParts(contraintPrefix, queryInstant, (currentContext==null)?"":currentContext.toString(), hasSubj?CQ_S_P_AT:CQ_P_AT )); - } - } - else if (contraints.hasSubject()) { // and no predicates - final Text contraintPrefix = new Text(); - final Statement statement = new StatementImpl(contraints.getSubject(), urlNull, urlNull); - appendSubject(statement, contraintPrefix); - keys.add( new KeyParts(contraintPrefix, queryInstant, (currentContext==null)?"":currentContext.toString(), CQ_S_AT) ); - } - else { - // No constraints except possibly a context/named-graph, handled by the CF - keys.add( new KeyParts(null, queryInstant, (currentContext==null)?"":currentContext.toString(), CQ_O_AT) ); - } - return keys; - } - /** - * convert a non-utf8 byte[] and text and value to string and show unprintable bytes as {xx} where x is hex. - * @param value - * @return Human readable representation. - */ - public static String toHumanString(final Value value) { - return toHumanString(value==null?null:value.get()); - } - public static String toHumanString(final Text text) { - return toHumanString(text==null?null:text.copyBytes()); - } - public static String toHumanString(final byte[] bytes) { - if (bytes==null) { - return "{null}"; - } - final StringBuilder sb = new StringBuilder(); - for (final byte b : bytes) { - if ((b > 0x7e) || (b < 32)) { - sb.append("{"); - sb.append(Integer.toHexString( b & 0xff )); // Lop off the sign extended ones. - sb.append("}"); - } else if (b == '{'||b == '}') { // Escape the literal braces. - sb.append("{"); - sb.append((char)b); - sb.append("}"); - } else { - sb.append((char)b); - } - } - return sb.toString(); - } - - } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/Md5Hash.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/Md5Hash.java b/extras/indexing/src/main/java/mvm/rya/indexing/Md5Hash.java deleted file mode 100644 index 0e83822..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/Md5Hash.java +++ /dev/null @@ -1,44 +0,0 @@ -package mvm.rya.indexing; - -import org.apache.accumulo.core.data.Value; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.codec.binary.StringUtils; -import org.apache.commons.codec.digest.DigestUtils; - -/** - * Utility methods for generating hashes. Note that MD5 is 16 bytes, or 32 Hex chars. To make it smaller (but still printable), this class - * Base64 encodes those 16 bytes into 22 chars. - */ -public class Md5Hash { - public static String md5Base64(final byte[] data) { - return Base64.encodeBase64URLSafeString(DigestUtils.md5(data)); - } - - public static String md5Base64(final String string) { - return md5Base64(StringUtils.getBytesUtf8(string)); - } - - public static byte[] md5Binary(final Value value) { - return DigestUtils.md5(value.get()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunction.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunction.java b/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunction.java deleted file mode 100644 index 6a19ee0..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunction.java +++ /dev/null @@ -1,45 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import info.aduna.iteration.CloseableIteration; -import org.openrdf.model.Statement; -import org.openrdf.query.QueryEvaluationException; - -/** - * A function used to perform a search. - */ -public interface SearchFunction { - - /** - * Search the indices for the given terms and return {@link Statement}s that meet the {@link StatementConstraints} - * - * @param searchTerms - * the search terms - * @param contraints - * the constraints on the returned {@link Statement}s - * @return - * @throws QueryEvaluationException - */ - public abstract CloseableIteration<Statement, QueryEvaluationException> performSearch(String searchTerms, StatementConstraints contraints) - throws QueryEvaluationException; - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunctionFactory.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunctionFactory.java b/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunctionFactory.java deleted file mode 100644 index 719cc2f..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/SearchFunctionFactory.java +++ /dev/null @@ -1,71 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Map; - -import org.apache.log4j.Logger; -import org.openrdf.model.URI; -import org.openrdf.query.QueryEvaluationException; - -import com.google.common.collect.Maps; - -public abstract class SearchFunctionFactory { - - private static final Logger logger = Logger.getLogger(SearchFunctionFactory.class); - - private final Map<URI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap(); - - - /** - * Get a {@link GeoSearchFunction} for a give URI. - * - * @param searchFunction - * @return - */ - public SearchFunction getSearchFunction(final URI searchFunction) { - - SearchFunction geoFunc = null; - - try { - geoFunc = getSearchFunctionInternal(searchFunction); - } catch (QueryEvaluationException e) { - e.printStackTrace(); - } - - return geoFunc; - } - - private SearchFunction getSearchFunctionInternal(final URI searchFunction) throws QueryEvaluationException { - SearchFunction sf = SEARCH_FUNCTION_MAP.get(searchFunction); - - if (sf != null) { - return sf; - } else { - throw new QueryEvaluationException("Unknown Search Function: " + searchFunction.stringValue()); - } - - - } - - -} - http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/StatementConstraints.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/StatementConstraints.java b/extras/indexing/src/main/java/mvm/rya/indexing/StatementConstraints.java deleted file mode 100644 index e8f1d4e..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/StatementConstraints.java +++ /dev/null @@ -1,73 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - - -import java.util.Set; - -import org.openrdf.model.Resource; -import org.openrdf.model.URI; - -public class StatementConstraints { - private Resource context = null; - private Resource subject = null; - private Set<URI> predicates = null; - - public StatementConstraints setContext(Resource context) { - this.context = context; - return this; - } - - public StatementConstraints setPredicates(Set<URI> predicates) { - this.predicates = predicates; - return this; - } - - public StatementConstraints setSubject(Resource subject) { - this.subject = subject; - return this; - } - - public Resource getContext() { - return context; - } - - public Set<URI> getPredicates() { - return predicates; - } - - public Resource getSubject() { - return subject; - } - - public boolean hasSubject() { - return subject != null; - } - - public boolean hasPredicates() { - return predicates != null && !predicates.isEmpty(); - } - - public boolean hasContext() { - return context != null; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/StatementSerializer.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/StatementSerializer.java b/extras/indexing/src/main/java/mvm/rya/indexing/StatementSerializer.java deleted file mode 100644 index 107f69d..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/StatementSerializer.java +++ /dev/null @@ -1,225 +0,0 @@ -package mvm.rya.indexing; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - - -import java.io.IOException; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; -import org.openrdf.model.Literal; -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.ContextStatementImpl; -import org.openrdf.model.impl.StatementImpl; -import org.openrdf.model.impl.ValueFactoryImpl; - -/** - * A set of Utilities to serialize {@link Statement}s to/from {@link String}s. - */ -public class StatementSerializer { - private static String SEP = "\u0000"; - - private static ValueFactory VALUE_FACTORY = new ValueFactoryImpl(); - - /** - * Read a {@link Statement} from a {@link String} - * - * @param in - * the {@link String} to parse - * @return a {@link Statement} - */ - public static Statement readStatement(String in) throws IOException { - String[] parts = in.split(SEP); - - if (parts.length != 4) { - throw new IOException("Not a valid statement: " + in); - } - - String contextString = parts[0]; - String subjectString = parts[1]; - String predicateString = parts[2]; - String objectString = parts[3]; - return readStatement(subjectString, predicateString, objectString, contextString); - } - - public static Statement readStatement(String subjectString, String predicateString, String objectString) { - return readStatement(subjectString, predicateString, objectString, ""); - } - - public static Statement readStatement(String subjectString, String predicateString, String objectString, String contextString) { - Resource subject = createResource(subjectString); - URI predicate = VALUE_FACTORY.createURI(predicateString); - - boolean isObjectLiteral = objectString.startsWith("\""); - - Value object = null; - if (isObjectLiteral) { - object = parseLiteral(objectString); - } else { - object = createResource(objectString); - } - - if (contextString == null || contextString.isEmpty()) { - return new StatementImpl(subject, predicate, object); - } else { - Resource context = VALUE_FACTORY.createURI(contextString); - return new ContextStatementImpl(subject, predicate, object, context); - } - } - - private static Resource createResource(String str) { - if (str.startsWith("_")) { - return VALUE_FACTORY.createBNode(str.substring(2)); - } - return VALUE_FACTORY.createURI(str); - - } - - private static Literal parseLiteral(String fullLiteralString) { - Validate.notNull(fullLiteralString); - Validate.isTrue(fullLiteralString.length() > 1); - - if (fullLiteralString.endsWith("\"")) { - String fullLiteralWithoutQuotes = fullLiteralString.substring(1, fullLiteralString.length() - 1); - return VALUE_FACTORY.createLiteral(fullLiteralWithoutQuotes, (String) null); - } else { - - // find the closing quote - int labelEnd = fullLiteralString.lastIndexOf("\""); - - String label = fullLiteralString.substring(1, labelEnd); - - String data = fullLiteralString.substring(labelEnd + 1); - - if (data.startsWith("@")) { - // the data is "language" - String lang = data.substring(1); - return VALUE_FACTORY.createLiteral(label, lang); - } else if (data.startsWith("^^<")) { - // the data is a "datatype" - String datatype = data.substring(3, data.length() - 1); - URI datatypeUri = VALUE_FACTORY.createURI(datatype); - return VALUE_FACTORY.createLiteral(label, datatypeUri); - } - } - return null; - - } - - public static String writeSubject(Statement statement) { - return statement.getSubject().toString(); - } - - public static String writeObject(Statement statement) { - return statement.getObject().toString(); - } - - public static String writePredicate(Statement statement) { - return statement.getPredicate().toString(); - } - - public static String writeSubjectPredicate(Statement statement) { - Validate.notNull(statement); - Validate.notNull(statement.getSubject()); - Validate.notNull(statement.getPredicate()); - return statement.getSubject().toString() + SEP + statement.getPredicate().toString(); - } - - public static String writeContext(Statement statement) { - if (statement.getContext() == null) { - return ""; - } - return statement.getContext().toString(); - } - - /** - * Write a {@link Statement} to a {@link String} - * - * @param statement - * the {@link Statement} to write - * @return a {@link String} representation of the statement - */ - public static String writeStatement(Statement statement) { - Resource subject = statement.getSubject(); - Resource context = statement.getContext(); - URI predicate = statement.getPredicate(); - Value object = statement.getObject(); - - Validate.notNull(subject); - Validate.notNull(predicate); - Validate.notNull(object); - - String s = ""; - if (context == null) { - s = SEP + subject.toString() + SEP + predicate.toString() + SEP + object.toString(); - } else { - s = context.toString() + SEP + subject.toString() + SEP + predicate.toString() + SEP + object.toString(); - } - return s; - } - - /** - * Creates a Regular Expression to match serialized statements meeting these constraints. A <code>null</code> or empty parameters imply - * no constraint. A <code>null</code> return value implies no constraints. - * - * @param context - * context constraint - * @param subject - * subject constraint - * @param predicates - * list of predicate constraints - * @return a regular expression that can be used to match serialized statements. A <code>null</code> return value implies no - * constraints. - */ - public static String createStatementRegex(StatementConstraints contraints) { - Resource context = contraints.getContext(); - Resource subject = contraints.getSubject(); - Set<URI> predicates = contraints.getPredicates(); - if (context == null && subject == null && (predicates == null || predicates.isEmpty())) { - return null; - } - - // match on anything but a separator - String anyReg = "[^" + SEP + "]*"; - - // if context is empty, match on any context - String contextReg = (context == null) ? anyReg : context.stringValue(); - - // if subject is empty, match on any subject - String subjectReg = (subject == null) ? anyReg : subject.stringValue(); - - // if the predicates are empty, match on any predicate. Otherwise, "or" the predicates. - String predicateReg = ""; - if (predicates == null || predicates.isEmpty()) { - predicateReg = anyReg; - } else { - predicateReg = "(" + StringUtils.join(predicates, "|") + ")"; - } - - return "^" + contextReg + SEP + subjectReg + SEP + predicateReg + SEP + ".*"; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/44a2dcf0/extras/indexing/src/main/java/mvm/rya/indexing/TemporalIndexer.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/TemporalIndexer.java b/extras/indexing/src/main/java/mvm/rya/indexing/TemporalIndexer.java deleted file mode 100644 index 3f6858c..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/TemporalIndexer.java +++ /dev/null @@ -1,166 +0,0 @@ -package mvm.rya.indexing; - -import org.openrdf.model.Statement; -import org.openrdf.query.QueryEvaluationException; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import info.aduna.iteration.CloseableIteration; -import mvm.rya.api.persist.index.RyaSecondaryIndexer; - -/** - * A repository to store, index, and retrieve {@link Statement}s based on time. - * Instants: - * Instant {before, equals, after} Instant - * Instant {before, after, inside} Interval - * Instant {hasBeginning, hasEnd} Interval - * - * OWL-Time provides the interval relations: - * <pre> - * intervalEquals, - * intervalBefore, - * intervalMeets, - * intervalOverlaps, - * intervalStarts, - * intervalDuring, - * intervalFinishes, - * - * and their reverse interval relations: - * intervalAfter, - * intervalMetBy, - * intervalOverlappedBy, - * intervalStartedBy, - * intervalContains, - * intervalFinishedBy. - * - * from Allen paper in 1983 - * - * Relation Y Symbol Inverse Y - * before Y < > X - * equal Y = = X - * meets Y m mi X - * overlaps Y o oi X - * during Y d di X - * starts Y s si X - * finishes Y f fi X - * </pre> - * - */ - -public interface TemporalIndexer extends RyaSecondaryIndexer { - - /* consider ParseException here */ - - /*- - * - * And Now, what you you've all been waiting for, the queries: - * the instant versions: - * format: x {relation} y - * read: Given literal y, find all statements where the date object x is ( x relation y ) - * Instant {before, equals, after} Instant - * Instant {before, after, inside} Interval - * Instant {hasBeginning, hasEnd} Interval - * - * the Allen interval relations, as described above. - * intervalEquals, - * intervalBefore, - * intervalMeets, - * intervalOverlaps, - * intervalStarts, - * intervalDuring, - * intervalFinishes - * and then the inverses, including after. - */ - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantEqualsInstant( - TemporalInstant queryInstant, StatementConstraints contraints) - throws QueryEvaluationException;; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInstant( - TemporalInstant queryInstant, StatementConstraints contraints) - throws QueryEvaluationException;; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInstant( - TemporalInstant queryInstant, StatementConstraints contraints) - throws QueryEvaluationException;; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInterval( - TemporalInterval givenInterval, StatementConstraints contraints) - throws QueryEvaluationException;; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInterval( - TemporalInterval givenInterval, StatementConstraints contraints) - throws QueryEvaluationException; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantInsideInterval( - TemporalInterval givenInterval, StatementConstraints contraints) - throws QueryEvaluationException; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantHasBeginningInterval( - TemporalInterval queryInterval, StatementConstraints contraints) - throws QueryEvaluationException; - - public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantHasEndInterval( - TemporalInterval queryInterval, StatementConstraints contraints) - throws QueryEvaluationException; - - /** - * Returns statements that contain a time instance that is equal to the - * queried time and meet the {@link StatementConstraints}. - * - * @param query - * the queried time instance - * @param contraints - * the {@link StatementConstraints} - * @return - * @throws QueryEvaluationException - */ - public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalEquals( - TemporalInterval query, StatementConstraints contraints) - throws QueryEvaluationException; - - /** - * Returns statements that contain a time instances that are before the - * queried {@link TemporalInterval} and meet the {@link StatementConstraints} - * - * @param query - * the queried time instance - * @param contraints - * the {@link StatementConstraints} - * @return - */ - public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalBefore( - TemporalInterval query, StatementConstraints contraints) - throws QueryEvaluationException; - - /** - * Returns statements that contain a time instance that is after the queried {@link TemporalInterval} and meet the {@link StatementConstraints}. - * - * @param query - * the queried time instance - * @param contraints - * the {@link StatementConstraints} - * @return - */ - public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalAfter( - TemporalInterval query, StatementConstraints contraints) - throws QueryEvaluationException; -}