/*
* This file is part of the HyperGraphDB source distribution. This is copyrighted
* software. For permitted uses, licensing options and redistribution, please see
* the LicensingInformation file at the root level of the distribution.
*
* Copyright (c) 2005-2010 Kobrix Software, Inc. All rights reserved.
*/
package org.hypergraphdb.query.impl;
import org.hypergraphdb.HGException;
import org.hypergraphdb.HGOrderedSearchable;
import org.hypergraphdb.HGSearchable;
import org.hypergraphdb.HGSearchResult;
import org.hypergraphdb.query.ComparisonOperator;
import org.hypergraphdb.util.Ref;
/**
* <p>
* A simple query that operates on a single <code>HGSearchable</code> entity, usually
* a <code>HGIndex</code>.
* </p>
*
* @author Borislav Iordanov
*/
public class SearchableBasedQuery<Key, Value> extends KeyBasedQuery<Key, Value>
{
protected HGSearchable<Key, Value> searchable;
protected Ref<Key> key;
private ComparisonOperator operator = ComparisonOperator.EQ;
/**
* <p>
* Construct a new <code>HGSearchable</code> based query.
* </p>
*
* @param searchable The instance that will be searched.
* @param key The search key.
* @param operator A <code>ComparisonOperator</code> for the search. If it is
* something else than a <code>ComparisonOperator.EQ</code> operator, it must be
* supported by the concrete <code>HGSearchable</code> object passed. For instance,
* an order operator like <code>ComparisonOperator.LT</code> and the like requires
* a <code>HGOrderedSearchable</code> instance.
*/
public SearchableBasedQuery(HGSearchable<Key, Value> searchable, Key key, ComparisonOperator operator)
{
this(searchable, hg.constant(key), operator);
}
public SearchableBasedQuery(HGSearchable<Key, Value> searchable, Ref<Key> key, ComparisonOperator operator)
{
this.searchable = searchable;
this.key = key;
this.operator = operator;
}
public HGSearchResult<Value> execute()
{
switch (operator)
{
case EQ:
return searchable.find(key.get());
case LT:
return ((HGOrderedSearchable<Key, Value>)searchable).findLT(key.get());
case GT:
return ((HGOrderedSearchable<Key, Value>)searchable).findGT(key.get());
case LTE:
return ((HGOrderedSearchable<Key, Value>)searchable).findLTE(key.get());
case GTE:
return ((HGOrderedSearchable<Key, Value>)searchable).findGTE(key.get());
default:
throw new HGException("Wrong operator code [" + operator + "] passed to IndexBasedQuery.");
}
}
public void setKeyReference(Ref<Key> key)
{
this.key = key;
}
public Ref<Key> getKeyReference()
{
return key;
}
public void setKey(Key key)
{
this.key = hg.constant(key);
}
public Key getKey()
{
return key.get();
}
public void setOperator(ComparisonOperator operator)
{
this.operator = operator;
}
public ComparisonOperator getOperator()
{
return operator;
}
public void setSearchable(HGSearchable<Key, Value> searchable)
{
this.searchable = searchable;
}
public HGSearchable<Key, Value> getSearchable()
{
return searchable;
}
}