/*
* 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.HGHandle;
import org.hypergraphdb.HGQuery;
import org.hypergraphdb.HGSearchResult;
import org.hypergraphdb.algorithms.HGTraversal;
import org.hypergraphdb.util.Mapping;
import org.hypergraphdb.util.Pair;
public class TraversalBasedQuery extends HGQuery
{
private HGTraversal traversal;
private ReturnType returnType = ReturnType.both;
public static enum ReturnType
{
targets,
links,
both
};
public TraversalBasedQuery(HGTraversal traversal)
{
this.traversal = traversal;
}
public TraversalBasedQuery(HGTraversal traversal, ReturnType returnType)
{
this(traversal);
this.returnType = returnType;
}
public HGTraversal getTraversal()
{
return traversal;
}
@Override
public HGSearchResult<?> execute()
{
switch (returnType)
{
case both:
return new TraversalResult(traversal);
case targets:
return new MappedResult(new TraversalResult(traversal),
new Mapping<Pair<HGHandle, HGHandle>, HGHandle>()
{
public HGHandle eval(Pair<HGHandle, HGHandle> p) { return p.getSecond(); }
}
);
case links:
return new MappedResult(new TraversalResult(traversal),
new Mapping<Pair<HGHandle, HGHandle>, HGHandle>()
{
public HGHandle eval(Pair<HGHandle, HGHandle> p) { return p.getFirst(); }
}
);
default:
throw new HGException("This should never happen ;)");
}
}
public ReturnType getReturnType()
{
return returnType;
}
public void setReturnType(ReturnType returnType)
{
this.returnType = returnType;
}
}