* @param a_id
* @return
*/
protected static long getDataId(long a_id, AbstractRandomGenerator rng, ExecutionType type, Catalog catalog, Map<String, Long> table_sizes) {
long a_id2 = -1;
Cluster catalog_clus = CatalogUtil.getCluster(catalog);
long temp = LocalityConstants.TABLESIZE_TABLEA / catalog_clus.getNum_partitions();
int num_aids_per_partition = (int) (Math.floor(temp));
int random_int = rng.nextInt(num_aids_per_partition);
switch (type) {
case SAME_PARTITION: {
int partition_num = TheHashinator.hashToPartition(a_id, catalog_clus.getNum_partitions());
System.out.println("Total number of partitions: " + catalog_clus.getNum_partitions());
a_id2 = random_int * catalog_clus.getNum_partitions() + partition_num;
break;
}
case SAME_SITE: {
int partition_num = TheHashinator.hashToPartition(a_id, catalog_clus.getNum_partitions());
Site site = CatalogUtil.getPartitionById(catalog, partition_num).getParent();
int num_sites_per_host = CatalogUtil.getSitesPerHost(site).get(site.getHost()).size();
int num_partitions_per_site = site.getPartitions().size();
double a_id_site_num = Math.floor((double) partition_num / (double) num_partitions_per_site);
double a_id_host_num = Math.floor((double) a_id_site_num / (double) num_sites_per_host);
// determine the partition range for the cluster (with a random
// host and random sites)
// and pick partition randomly from this range
int lowerbound = (int) a_id_host_num * num_sites_per_host * num_partitions_per_site + (int) a_id_site_num * num_partitions_per_site;
int upperbound = (int) a_id_host_num * num_sites_per_host * num_partitions_per_site + (int) a_id_site_num * num_partitions_per_site + (num_partitions_per_site - 1);
int a_id2_partition_num = rng.numberExcluding(lowerbound, upperbound, partition_num);
// get a random partition
a_id2 = random_int * catalog_clus.getNum_partitions() + a_id2_partition_num;
break;
}
case SAME_HOST: {
int partition_num = TheHashinator.hashToPartition(a_id, catalog_clus.getNum_partitions());
Site site = CatalogUtil.getPartitionById(catalog, partition_num).getParent();
int num_sites_per_host = CatalogUtil.getSitesPerHost(site).get(site.getHost()).size();
int num_partitions_per_site = site.getPartitions().size();
double a_id_site_num = Math.floor((double) partition_num / (double) num_partitions_per_site);
double a_id_host_num = Math.floor((double) a_id_site_num / (double) num_sites_per_host);
int lowerboundsite = (int) a_id_host_num * num_sites_per_host;
int upperboundsite = (int) a_id_host_num * num_sites_per_host + (num_sites_per_host - 1);
int new_site = rng.numberExcluding(lowerboundsite, upperboundsite, (int) a_id_site_num);
int lowerbound = new_site * num_partitions_per_site;
int upperbound = new_site * num_partitions_per_site + (num_partitions_per_site - 1);
int a_id2_partition_num = rng.number(lowerbound, upperbound);
// get a random partition
a_id2 = random_int * catalog_clus.getNum_partitions() + a_id2_partition_num;
break;
}
case REMOTE_HOST: {
int total_number_of_hosts = catalog_clus.getHosts().size();
int partition_num = TheHashinator.hashToPartition(a_id, catalog_clus.getNum_partitions());
Site site = CatalogUtil.getPartitionById(catalog, partition_num).getParent();
int num_sites_per_host = CatalogUtil.getSitesPerHost(site).get(site.getHost()).size();
int num_partitions_per_site = site.getPartitions().size();
// get the site number the partition exists on
double a_id_site_num = Math.floor((double) partition_num / (double) num_partitions_per_site);
double a_id_host_num = Math.floor((double) a_id_site_num / (double) num_sites_per_host);
int new_host = (int) a_id_host_num;
if (total_number_of_hosts > 1) {
new_host = rng.numberExcluding(0, total_number_of_hosts - 1, (int) a_id_host_num);
}
int new_site = rng.number(0, num_sites_per_host - 1);
// determine the partition range for the cluster (with a random
// host and random sites)
// and pick partition randomly from this range
int lowerbound = new_host * num_sites_per_host * num_partitions_per_site + new_site * num_partitions_per_site;
int upperbound = new_host * num_sites_per_host * num_partitions_per_site + new_site * num_partitions_per_site + (num_partitions_per_site - 1);
int a_id2_partition_num = rng.number(lowerbound, upperbound);
a_id2 = random_int * catalog_clus.getNum_partitions() + a_id2_partition_num;
break;
}
case RANDOM: {
a_id2 = rng.nextInt(table_sizes.get(LocalityConstants.TABLENAME_TABLEA).intValue());
break;