001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.backends.jeb; 028 029 import java.util.ArrayList; 030 import java.util.BitSet; 031 import java.util.List; 032 033 /** 034 * This is a class used by the index merge thread. It merges the data 035 * for one index key from multiple intermediate files. 036 */ 037 public class MergeValue 038 { 039 /** 040 * The value of the index key. 041 */ 042 byte[] key; 043 044 /** 045 * The entry IDs to be added, where each set comes from a different file. 046 */ 047 List<Longs> addData; 048 049 /** 050 * The entry IDs to be deleted, where each set comes from a different file. 051 */ 052 ArrayList<Longs> delData; 053 054 /** 055 * A bit set indicating which files have contributed data for this key. 056 * Each file reader is identified by an array index. If bit n is set, 057 * it means that the reader with index n contributed data. 058 */ 059 BitSet readers; 060 061 /** 062 * The index entry limit. 063 */ 064 int entryLimit; 065 066 /** 067 * Create a new merge value. 068 * @param numReaders The total number of file readers that could be 069 * contributing to this value. Reader identifiers are in the range 070 * 0 .. numReaders-1. 071 * @param entryLimit The configured index entry limit. 072 */ 073 public MergeValue(int numReaders, int entryLimit) 074 { 075 this.key = null; 076 addData = new ArrayList<Longs>(numReaders); 077 delData = new ArrayList<Longs>(numReaders); 078 readers = new BitSet(numReaders); 079 this.entryLimit = entryLimit; 080 } 081 082 083 /** 084 * Get the value of the key. 085 * @return The key value. 086 */ 087 public byte[] getKey() 088 { 089 return key; 090 } 091 092 093 /** 094 * Set the value of the key. 095 * @param key The key value . 096 */ 097 public void setKey(byte[] key) 098 { 099 this.key = key; 100 } 101 102 103 104 /** 105 * Provide data for the key from one of the file readers. 106 * @param reader The reader providing the data. 107 * @param addData A set of entry IDs to be added. 108 * @param delData A set of entry IDs to be deleted. 109 */ 110 public void mergeData(int reader, Longs addData, Longs delData) 111 { 112 this.addData.add(addData); 113 if (delData.size() > 0) 114 { 115 this.delData.add(delData); 116 } 117 readers.set(reader); 118 } 119 120 121 /** 122 * Get the readers that provided data to be merged. 123 * @return An array of identifiers of readers that provided data. 124 */ 125 public int[] getReaders() 126 { 127 int[] ret = new int[readers.cardinality()]; 128 129 for (int i = readers.nextSetBit(0), j = 0; i != -1; 130 i = readers.nextSetBit(i+1)) 131 { 132 ret[j++] = i; 133 } 134 return ret; 135 } 136 137 138 /** 139 * Get the list of arrays of IDs to be added. 140 * @return The list of arrays of IDs to be added. 141 */ 142 public List<Longs> getAddValues() 143 { 144 return addData; 145 } 146 147 148 /** 149 * Get the list of arrays of IDs to be deleted. 150 * @return The list of arrays of IDs to be deleted. 151 */ 152 public List<Longs> getDelValues() 153 { 154 return delData; 155 } 156 157 }