/* * 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.storage.bje; import org.hypergraphdb.HGException; import org.hypergraphdb.storage.ByteArrayConverter; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.LockMode; import com.sleepycat.je.OperationStatus; /** * <p> * Implements a BerkeleyDB <code>Cursor</code> based result set that iterates over all duplicates of a given * key. * </p> * * @author Borislav Iordanov */ public class SingleKeyResultSet<T> extends IndexResultSet<T> { private boolean ordered = false; public SingleKeyResultSet(BJETxCursor cursor, DatabaseEntry key, ByteArrayConverter<T> converter) { super(cursor, key, converter); try { ordered = cursor.cursor().getDatabase().getConfig().getSortedDuplicates(); } catch (Throwable t) { throw new HGException(t); } } protected T advance() { try { OperationStatus status = cursor.cursor().getNextDup(key, data, LockMode.DEFAULT); if (status == OperationStatus.SUCCESS) return converter.fromByteArray(data.getData(), data.getOffset(), data.getSize()); else return null; } catch (Throwable t) { closeNoException(); throw new HGException(t); } } protected T back() { try { OperationStatus status = cursor.cursor().getPrevDup(key, data, LockMode.DEFAULT); if (status == OperationStatus.SUCCESS) return converter.fromByteArray(data.getData(), data.getOffset(), data.getSize()); else return null; } catch (Throwable t) { closeNoException(); throw new HGException(t); } } public boolean isOrdered() { return ordered; } }