package edu.brown.hashing;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.voltdb.CatalogContext;
import org.voltdb.catalog.CatalogType;
import org.voltdb.catalog.Database;
import edu.brown.utils.JSONSerializable;
import edu.brown.utils.JSONUtil;
public abstract class AbstractHasher implements JSONSerializable {
protected static final Logger LOG = Logger.getLogger(AbstractHasher.class.getName());
protected final int num_partitions;
protected final CatalogContext catalogContext;
public AbstractHasher(CatalogContext catalogContext, int num_partitions) {
this.catalogContext = catalogContext;
this.num_partitions = num_partitions;
}
/**
* Combine multiple values into a single key and get the hash of that
* Should be uniformly distributed (or at least good enough for what we need)
* @param values
* @return
*/
public int multiValueHash(Object values[]) {
assert(values.length > 0);
int combined = 31 * Arrays.deepHashCode(values);
return (this.hash(combined));
}
public int multiValueHash(Object val0, Object val1) {
return (this.multiValueHash(new Object[]{ val0, val1 }));
}
public int multiValueHash(int...values) {
Object o[] = new Object[values.length];
for (int i = 0; i < o.length; i++) {
o[i] = values[i];
}
return this.multiValueHash(o);
}
/**
* Return the number of partitions that this hasher can map values to
* @return
*/
public final int getNumPartitions() {
return (this.num_partitions);
}
// -----------------------------------------------------------------
// ABSTRACT INTERFACE
// -----------------------------------------------------------------
public abstract void init(CatalogContext catalogContext);
/**
* Hash the given value based on the partition count
* @param value
* @return
*/
public abstract int hash(Object value);
/**
* Hash the given value that is derived from a particular catalog object
* @param value
* @param catalog_item
* @return
*/
public abstract int hash(Object value, CatalogType catalog_item);
/**
* Hash the given value using a specific partition count
* @param value
* @param num_partitions
* @return
*/
public abstract int hash(Object value, int num_partitions);
// -----------------------------------------------------------------
// SERIALIZATION
// -----------------------------------------------------------------
@Override
public void load(File input_path, Database catalog_db) throws IOException {
JSONUtil.load(this, catalog_db, input_path);
}
@Override
public void save(File output_path) throws IOException {
JSONUtil.save(this, output_path);
}
@Override
public String toJSONString() {
return (JSONUtil.toJSONString(this));
}
}