/**
*
*/
package ivory.lsh.data;
/**
* @author Tamer
*
*/
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.lang.reflect.Array;
import org.apache.hadoop.io.Writable;
public class BitsSignatureTable implements Writable{
Signature[] signaturesArray = null;
int[] docNosArray = null;
int nSignatures = 0;
public BitsSignatureTable (){
}
public void set(Signature[] signs, int[] nos, int nElements){
if(signs.length == 0) throw new RuntimeException("invalid size of signatures: "+signs.length);
if(nos.length == 0) throw new RuntimeException("invalid size of docnos: "+nos.length);
if(signs.length != nos.length)
throw new RuntimeException("size mismatch: "+signs.length+"\t"+nos.length);
if(nElements <= 0 || nElements > signs.length) throw new RuntimeException("invalid size: "+nElements);
signaturesArray = signs;
docNosArray = nos;
nSignatures = nElements;
}
public void add(SixtyFourBitSignature sign, int docno){
throw new UnsupportedOperationException();
}
@SuppressWarnings("unchecked")
public void readFields(DataInput in) throws IOException {
String className = in.readUTF();
try {
Class c = Class.forName(className);
nSignatures = in.readInt();
if(signaturesArray== null || signaturesArray.length < nSignatures)
signaturesArray = (Signature[]) Array.newInstance(c, nSignatures);
for(int i = 0; i < nSignatures; i++){
signaturesArray[i] = (Signature) c.newInstance();
signaturesArray[i].readFields(in);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Signature class not found");
}
if(docNosArray== null || docNosArray.length < nSignatures)
docNosArray = new int[nSignatures];
for(int i = 0; i < nSignatures; i++){
docNosArray[i] = in.readInt();
}
}
/*public void readFields(DataInput in) throws IOException {
nSignatures = in.readInt();
if(signaturesArray== null || signaturesArray.length < nSignatures)
signaturesArray = new SixtyFourBitSignature[nSignatures];
for(int i = 0; i < nSignatures; i++){
signaturesArray[i] = new SixtyFourBitSignature();
signaturesArray[i].readFields(in);
}
if(docNosArray== null || docNosArray.length < nSignatures)
docNosArray = new int[nSignatures];
for(int i = 0; i < nSignatures; i++){
docNosArray[i] = in.readInt();
}
}*/
public void clear(){
nSignatures = 0;
}
public void free(){
nSignatures = 0;
signaturesArray = null;
docNosArray = null;
}
public void write(DataOutput out) throws IOException {
if(signaturesArray == null)
throw new RuntimeException("invalid NULL signaturesArray!");
if(docNosArray == null)
throw new RuntimeException("invalid NULL docNosArray!");
out.writeUTF(signaturesArray[0].getClass().getCanonicalName());
out.writeInt(nSignatures);
for(int i = 0; i < nSignatures; i++) signaturesArray[i].write(out);
for(int i = 0; i < nSignatures; i++) out.writeInt(docNosArray[i]);
}
public Signature[] getSignatures(){
return signaturesArray;
}
public int[] getDocNos(){
return docNosArray;
}
public int getNumOfSignatures(){
return nSignatures;
}
public String toString(){
String s ="";
for(int i=0;i<nSignatures;i++){
s+="("+docNosArray[i]+","+signaturesArray[i]+");";
}
return s;
}
}