package com.thinkaurelius.faunus.formats.titan.hbase; import com.google.common.base.Preconditions; import com.thinkaurelius.faunus.FaunusVertex; import com.thinkaurelius.faunus.formats.titan.FaunusTitanGraph; import com.thinkaurelius.titan.diskstorage.keycolumnvalue.Entry; import com.thinkaurelius.titan.diskstorage.keycolumnvalue.StaticBufferEntry; import com.thinkaurelius.titan.diskstorage.util.StaticByteBuffer; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import java.nio.ByteBuffer; import java.util.Iterator; import java.util.Map; import java.util.NavigableMap; /** * (c) Matthias Broecheler (me@matthiasb.com) */ public class FaunusTitanHBaseGraph extends FaunusTitanGraph { public FaunusTitanHBaseGraph(final String configFile) throws ConfigurationException { this(new PropertiesConfiguration(configFile)); } public FaunusTitanHBaseGraph(final Configuration configuration) { super(configuration); } public FaunusVertex readFaunusVertex(byte[] key, final NavigableMap<byte[], NavigableMap<Long, byte[]>> rowMap) { return super.readFaunusVertex(ByteBuffer.wrap(key), new HBaseMapIterable(rowMap)); } private static class HBaseMapIterable implements Iterable<Entry> { private final NavigableMap<byte[], NavigableMap<Long, byte[]>> columnValues; public HBaseMapIterable(final NavigableMap<byte[], NavigableMap<Long, byte[]>> columnValues) { Preconditions.checkNotNull(columnValues); this.columnValues = columnValues; } @Override public Iterator<Entry> iterator() { return new HBaseMapIterator(columnValues.entrySet().iterator()); } } private static class HBaseMapIterator implements Iterator<Entry> { private final Iterator<Map.Entry<byte[], NavigableMap<Long, byte[]>>> iterator; public HBaseMapIterator(final Iterator<Map.Entry<byte[], NavigableMap<Long, byte[]>>> iterator) { this.iterator = iterator; } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public Entry next() { final Map.Entry<byte[], NavigableMap<Long, byte[]>> entry = iterator.next(); return new StaticBufferEntry(new StaticByteBuffer(entry.getKey()), new StaticByteBuffer(entry.getValue().lastEntry().getValue())); } @Override public void remove() { throw new UnsupportedOperationException(); } } }