/* * 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.indexing; import java.util.Comparator; import org.hypergraphdb.HGHandle; import org.hypergraphdb.HGPersistentHandle; import org.hypergraphdb.HyperGraph; import org.hypergraphdb.storage.BAUtils; import org.hypergraphdb.storage.BAtoBA; import org.hypergraphdb.storage.ByteArrayConverter; import org.hypergraphdb.util.HGUtils; public class CompositeIndexer extends HGKeyIndexer<byte[]> { private HGKeyIndexer<Object>[] indexerParts = null; public CompositeIndexer() { } public CompositeIndexer(HGHandle type, HGKeyIndexer<Object>[] indexerParts) { this(null, type, indexerParts); } public CompositeIndexer(String name, HGHandle type, HGKeyIndexer<Object>[] indexerParts) { super(name, type); if (indexerParts == null || indexerParts.length == 0) throw new IllegalArgumentException( "Attempt to construct CompositeIndexer with null or empty parts."); this.indexerParts = indexerParts; } public boolean equals(Object other) { if (!(other instanceof CompositeIndexer)) return false; return HGUtils.eq(indexerParts, ((CompositeIndexer) other).indexerParts); } public Comparator<byte[]> getComparator(HyperGraph graph) { return null; } public ByteArrayConverter<byte[]> getConverter(HyperGraph graph) { return BAtoBA.getInstance(); } public byte[] getKey(HyperGraph graph, Object atom) { byte[][] keys = new byte[indexerParts.length][]; int size = 1; for (int i = 0; i < indexerParts.length; i++) { HGKeyIndexer<Object> ind = indexerParts[i]; Object key = ind.getKey(graph, atom); if (key == null) keys[i] = new byte[]{}; else keys[i] = ind.getConverter(graph).toByteArray(key); size += keys[i].length + 4; } byte[] B = new byte[size]; B[0] = (byte) keys.length; int pos = 1; for (byte[] curr : keys) { BAUtils.writeInt(curr.length, B, pos); pos += 4; System.arraycopy(curr, 0, B, pos, curr.length); pos += curr.length; } return B; } public int hashCode() { if (indexerParts == null) return 0; int x = indexerParts.length; for (HGIndexer<Object, HGPersistentHandle> ind : indexerParts) x ^= ind.hashCode() >> 16; return x; } public HGKeyIndexer<Object>[] getIndexerParts() { return indexerParts; } public void setIndexerParts(HGKeyIndexer<Object>[] indexerParts) { this.indexerParts = indexerParts; } }