summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/database/AbstractDatabase.java37
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);
}