package com.bigdata.rdf.load; import java.util.UUID; import com.bigdata.btree.IndexMetadata; import com.bigdata.journal.IIndexManager; import com.bigdata.service.IBigdataFederation; import com.bigdata.util.BytesUtil; /** * Class permits specification of a pre-assigned index partition splits onto * data services. * * @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a> * @version $Id$ */ public class AssignedSplits { /** * The array of separator keys. Each separator key is interpreted as an * <em>unsigned byte[]</em>. The first entry MUST be an empty byte[]. The * entries MUST be in sorted order. */ final byte[][] separatorKeys; /** * The array of data services onto which each partition defined by a * separator key will be mapped (optional). When given, the #of entries in * this array MUST agree with the #of entries in the <i>separatorKeys</i> * array and all entries must be non-<code>null</code>. When not given, * the index partitions will be auto-assigned to the discovered data * services. */ final UUID[] dataServiceUUIDs; /** * Register the index against the federation using the index partitions and * data services described by this instance. if the {@link IIndexManager} is * NOT an {@link IBigdataFederation} then the indices will be registered * normally using {@link IIndexManager#registerIndex(IndexMetadata)}. * * @param indexManager * The {@link IIndexManager} and ideally an * {@link IBigdataFederation}. * @param indexMetadata * The metadata describing the index to be registered. */ public void registerIndex(final IIndexManager indexManager, final IndexMetadata indexMetadata) { if (indexManager == null) throw new IllegalArgumentException(); if (indexMetadata == null) throw new IllegalArgumentException(); if (indexManager instanceof IBigdataFederation) { ((IBigdataFederation) indexManager).registerIndex(indexMetadata, separatorKeys, dataServiceUUIDs); } else { indexManager.registerIndex(indexMetadata); } } /** * @param separatorKeys * The array of separator keys. Each separator key is interpreted * as an <em>unsigned byte[]</em>. The first entry MUST be an * empty byte[]. The entries MUST be in sorted order. * @param dataServiceUUIDs * The array of data services onto which each partition defined * by a separator key will be mapped (optional). When given, the * #of entries in this array MUST agree with the #of entries in * the <i>separatorKeys</i> array and all entries must be non-<code>null</code>. * When not given, the index partitions will be auto-assigned to * the discovered data services. */ public AssignedSplits(final byte[][] separatorKeys, final UUID[] dataServiceUUIDs) { if (separatorKeys == null) throw new IllegalArgumentException(); // if (dataServiceUUIDs == null) // throw new IllegalArgumentException(); if (dataServiceUUIDs != null && separatorKeys.length != dataServiceUUIDs.length) throw new IllegalArgumentException(); if (separatorKeys.length == 0) throw new IllegalArgumentException(); for (int i = 0; i < separatorKeys.length; i++) { if (separatorKeys[i] == null) throw new IllegalArgumentException(); if (dataServiceUUIDs != null && dataServiceUUIDs[i] == null) throw new IllegalArgumentException(); if(i == 0 && separatorKeys[i].length != 0) throw new IllegalArgumentException(); if (i > 0 && BytesUtil.compareBytes(separatorKeys[i - 1], separatorKeys[i]) >= 0) { throw new IllegalArgumentException(); } } this.separatorKeys = separatorKeys; this.dataServiceUUIDs = dataServiceUUIDs; } }