/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2006-2008 Sun Microsystems, Inc.
|
*/
|
package org.opends.server.backends.jeb;
|
|
import java.util.ArrayList;
|
import java.util.BitSet;
|
import java.util.List;
|
|
/**
|
* This is a class used by the index merge thread. It merges the data
|
* for one index key from multiple intermediate files.
|
*/
|
public class MergeValue
|
{
|
/**
|
* The value of the index key.
|
*/
|
byte[] key;
|
|
/**
|
* The entry IDs to be added, where each set comes from a different file.
|
*/
|
List<Longs> addData;
|
|
/**
|
* The entry IDs to be deleted, where each set comes from a different file.
|
*/
|
ArrayList<Longs> delData;
|
|
/**
|
* A bit set indicating which files have contributed data for this key.
|
* Each file reader is identified by an array index. If bit n is set,
|
* it means that the reader with index n contributed data.
|
*/
|
BitSet readers;
|
|
/**
|
* The index entry limit.
|
*/
|
int entryLimit;
|
|
/**
|
* Create a new merge value.
|
* @param numReaders The total number of file readers that could be
|
* contributing to this value. Reader identifiers are in the range
|
* 0 .. numReaders-1.
|
* @param entryLimit The configured index entry limit.
|
*/
|
public MergeValue(int numReaders, int entryLimit)
|
{
|
this.key = null;
|
addData = new ArrayList<Longs>(numReaders);
|
delData = new ArrayList<Longs>(numReaders);
|
readers = new BitSet(numReaders);
|
this.entryLimit = entryLimit;
|
}
|
|
|
/**
|
* Get the value of the key.
|
* @return The key value.
|
*/
|
public byte[] getKey()
|
{
|
return key;
|
}
|
|
|
/**
|
* Set the value of the key.
|
* @param key The key value .
|
*/
|
public void setKey(byte[] key)
|
{
|
this.key = key;
|
}
|
|
|
|
/**
|
* Provide data for the key from one of the file readers.
|
* @param reader The reader providing the data.
|
* @param addData A set of entry IDs to be added.
|
* @param delData A set of entry IDs to be deleted.
|
*/
|
public void mergeData(int reader, Longs addData, Longs delData)
|
{
|
this.addData.add(addData);
|
if (delData.size() > 0)
|
{
|
this.delData.add(delData);
|
}
|
readers.set(reader);
|
}
|
|
|
/**
|
* Get the readers that provided data to be merged.
|
* @return An array of identifiers of readers that provided data.
|
*/
|
public int[] getReaders()
|
{
|
int[] ret = new int[readers.cardinality()];
|
|
for (int i = readers.nextSetBit(0), j = 0; i != -1;
|
i = readers.nextSetBit(i+1))
|
{
|
ret[j++] = i;
|
}
|
return ret;
|
}
|
|
|
/**
|
* Get the list of arrays of IDs to be added.
|
* @return The list of arrays of IDs to be added.
|
*/
|
public List<Longs> getAddValues()
|
{
|
return addData;
|
}
|
|
|
/**
|
* Get the list of arrays of IDs to be deleted.
|
* @return The list of arrays of IDs to be deleted.
|
*/
|
public List<Longs> getDelValues()
|
{
|
return delData;
|
}
|
|
}
|