/**
* GeDBIT.index.KNNQuery 2006.07.09
*
* Copyright Information:
*
* Change Log:
* 2006.07.09: created by Weijia Xu
*/
package GeDBIT.index;
import GeDBIT.type.IndexObject;
/**
* This class contains implmentation for K nearest neighbor search (KNN) and
* approximate K nearest neighbor search (AKNN) queries. A KNN query is in the
* form of (q, k). Given (q, k), the search returns the k closest objects to
* query object q. An aproximate KNN query is in the form of (q, k, r, sp),
* where r is a limiting radius and sp is the approximation policy. The search
* proceed accroding to the value of r and sp. 1) When both r and sp is omit,
* the search proceeds as KNN search 2) When r is given and sp is omit or sp is
* the value of KNNQuery.RADIUSLIMIRED, the search returns upto k objects that
* are the closest ones to query q within radius r. 3) When a non-negative value
* is given for sp, an approximate set of k objects is returned. Only those
* objects within spsmallest distance to query q are gurantee to be returned in
* the result set. The results of search with larger sp value have better
* accuracy than those of search with lower sp value and take longer to compute.
* When a radius value is also given, the results are further limited to those
* within distance r to query q.
*
* @author Weijia Xu
* @version 2006.07.09
*/
public class KNNQuery implements Query {
final static int KNNSEARCH = -1;
final static int RADIUSLIMITED = -2;
final static int RANGESEARCH = -3;
int max_result;
int search_policy;
/**
* Initializes the strict KNN query object
*
* @param center
* the {@link Object} that serves as the query object
* @param k
* the number of nearest neighbors to return
**/
public KNNQuery(IndexObject center, int k) {
this(center, k, Double.MAX_VALUE, KNNSEARCH, 0);
}
public KNNQuery(IndexObject center, int k, double radius) {
this(center, k, radius, RADIUSLIMITED, 0);
}
public KNNQuery(IndexObject center, int k, double radius, int sp) {
this(center, k, radius, sp, 0);
}
public KNNQuery(IndexObject center, int k, double radius, int sp,
int listSize) {
if (radius < 0.0)
throw new IllegalArgumentException("radius < 0: " + radius);
if (listSize < 0)
throw new IllegalArgumentException("max distance list size < 0: "
+ listSize);
this.radius = radius;
this.center = center;
this.listSize = listSize;
this.max_result = k;
this.search_policy = sp;
}
/**
* Return a reference to the query object
*
* @return a reference to the query object
*/
public IndexObject getQueryObject() {
return center;
}
/**
* Returns the search radius of the proximity query.
*/
final public double getRadius() {
return radius;
}
public int getMaxDistanceListSize() {
return listSize;
}
public int getK() {
return max_result;
}
public int getSearchPolicy() {
return search_policy;
}
private double radius;
private IndexObject center;
private int listSize;
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("KNNQUERY: ");
buffer.append(center.toString());
buffer.append(" Search_Policy:" + search_policy);
buffer.append(" Max_Results:" + max_result);
buffer.append(" Max_Radius:" + radius);
return buffer.toString();
}
}