diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java b/src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java index ef2374cc..5ff2c6e9 100644 --- a/src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java +++ b/src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.database; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -43,8 +43,8 @@ import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.datasource.bundle.SingleObjectBundle; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; import de.lmu.ifi.dbs.elki.distance.similarityfunction.SimilarityFunction; +import de.lmu.ifi.dbs.elki.index.DistanceIndex; import de.lmu.ifi.dbs.elki.index.Index; import de.lmu.ifi.dbs.elki.index.IndexFactory; import de.lmu.ifi.dbs.elki.index.KNNIndex; @@ -155,15 +155,30 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @Override - public <O, D extends Distance<D>> DistanceQuery<O, D> getDistanceQuery(Relation<O> objQuery, DistanceFunction<? super O, D> distanceFunction, Object... hints) { + public <O> DistanceQuery<O> getDistanceQuery(Relation<O> objQuery, DistanceFunction<? super O> distanceFunction, Object... hints) { if(distanceFunction == null) { throw new AbortException("Distance query requested for 'null' distance!"); } + ListIterator<Index> iter = indexes.listIterator(indexes.size()); + while(iter.hasPrevious()) { + Index idx = iter.previous(); + if(idx instanceof DistanceIndex) { + if(getLogger().isDebuggingFinest()) { + getLogger().debugFinest("Considering index for kNN Query: " + idx); + } + @SuppressWarnings("unchecked") + final DistanceIndex<O> distanceIndex = (DistanceIndex<O>) idx; + DistanceQuery<O> q = distanceIndex.getDistanceQuery(distanceFunction, hints); + if(q != null) { + return q; + } + } + } return distanceFunction.instantiate(objQuery); } @Override - public <O, D extends Distance<D>> SimilarityQuery<O, D> getSimilarityQuery(Relation<O> objQuery, SimilarityFunction<? super O, D> similarityFunction, Object... hints) { + public <O> SimilarityQuery<O> getSimilarityQuery(Relation<O> objQuery, SimilarityFunction<? super O> similarityFunction, Object... hints) { if(similarityFunction == null) { throw new AbortException("Similarity query requested for 'null' similarity!"); } @@ -171,7 +186,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @Override - public <O, D extends Distance<D>> KNNQuery<O, D> getKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) { + public <O> KNNQuery<O> getKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) { if(distanceQuery == null) { throw new AbortException("kNN query requested for 'null' distance!"); } @@ -184,7 +199,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @SuppressWarnings("unchecked") final KNNIndex<O> knnIndex = (KNNIndex<O>) idx; - KNNQuery<O, D> q = knnIndex.getKNNQuery(distanceQuery, hints); + KNNQuery<O> q = knnIndex.getKNNQuery(distanceQuery, hints); if(q != null) { return q; } @@ -201,7 +216,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @Override - public <O, D extends Distance<D>> RangeQuery<O, D> getRangeQuery(DistanceQuery<O, D> distanceQuery, Object... hints) { + public <O> RangeQuery<O> getRangeQuery(DistanceQuery<O> distanceQuery, Object... hints) { if(distanceQuery == null) { throw new AbortException("Range query requested for 'null' distance!"); } @@ -214,7 +229,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @SuppressWarnings("unchecked") final RangeIndex<O> rangeIndex = (RangeIndex<O>) idx; - RangeQuery<O, D> q = rangeIndex.getRangeQuery(distanceQuery, hints); + RangeQuery<O> q = rangeIndex.getRangeQuery(distanceQuery, hints); if(q != null) { return q; } @@ -231,7 +246,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @Override - public <O, D extends Distance<D>> RKNNQuery<O, D> getRKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) { + public <O> RKNNQuery<O> getRKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) { if(distanceQuery == null) { throw new AbortException("RKNN query requested for 'null' distance!"); } @@ -244,7 +259,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem } @SuppressWarnings("unchecked") final RKNNIndex<O> rknnIndex = (RKNNIndex<O>) idx; - RKNNQuery<O, D> q = rknnIndex.getRKNNQuery(distanceQuery, hints); + RKNNQuery<O> q = rknnIndex.getRKNNQuery(distanceQuery, hints); if(q != null) { return q; } @@ -261,7 +276,7 @@ public abstract class AbstractDatabase extends AbstractHierarchicalResult implem maxk = (Integer) hint; } } - KNNQuery<O, D> knnQuery = getKNNQuery(distanceQuery, DatabaseQuery.HINT_BULK, maxk); + KNNQuery<O> knnQuery = getKNNQuery(distanceQuery, DatabaseQuery.HINT_BULK, maxk); return new LinearScanRKNNQuery<>(distanceQuery, knnQuery, maxk); } |