macrofish

hashjoin

Aug 11th, 2014
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. #include <iostream>
  2. #include "HashTable.h"
  3.  
  4.  
  5. HashTable::HashTable(int serverCount, int playerCount,int numberOfServersInArray)
  6. {
  7.     this->numberOfBuckets = 0;
  8.     this->numberOfErrors= 0;
  9.     this->serverCount = serverCount;
  10.     this->playerCount = playerCount;
  11.     this->numberOfServersInArray=numberOfServersInArray;
  12.  
  13.     numberOfBuckets = this->serverCount/this->numberOfServersInArray;//pocet prihradek serveru
  14.     numberOfBuckets+=1;
  15.    
  16.     srvArray = new int*[numberOfBuckets];
  17.  
  18.     for(int i = 0; i<numberOfBuckets;i++)
  19.     {
  20.         srvArray[i]= new int[numberOfServersInArray]; //pole serveru ktere ma X (pocet prihradek) radku a srvCount/x sloupcu
  21.     }
  22.  
  23.     indexArray = new int*[numberOfBuckets];// pomocne pole, druhy rozmer aktualni mozna velikost radku totozneho s indexem radku v srvArray,
  24.     //aby se vedelo, kdy se ma udelat resize
  25.     //prvni rozmer, aktualni pocet serveru v prihradce
  26.    
  27.     for(int i = 0;i<numberOfBuckets;i++)
  28.     {
  29.         indexArray[i]=new int[2];
  30.     }
  31.  
  32.     serverIDs = new int[serverCount]; //pole vsech ID serveru
  33.     playerIDs = new int[playerCount]; //pole vsech ID playeru
  34.     playerSRV = new int[playerCount]; //pole IDserveru vsech playeru
  35. }
  36.  
  37. HashTable::~HashTable()
  38. {
  39.     for(int i = 0;i<this->numberOfBuckets;i++)
  40.     {
  41.         delete []srvArray[i];
  42.     }
  43.     delete []srvArray;
  44.  
  45.     for(int i = 0;i<this->numberOfBuckets;i++)
  46.     {
  47.         delete []indexArray[i];
  48.     }
  49.     delete []indexArray;
  50.  
  51.  
  52.     delete[]serverIDs;
  53.     delete[]playerIDs;
  54.     delete[]playerSRV;
  55. }
  56.  
  57. int HashTable::getErrors()
  58. {
  59.     return this->numberOfErrors;
  60. }
  61.  
  62. void HashTable::setErrors(int errors)
  63. {
  64.     this->numberOfErrors = errors;
  65. }
  66.  
  67. void HashTable::checkIfCorrect(int serverID, int playerID)
  68. {
  69.     for(int i = 0; i < playerCount;i++)
  70.     {
  71.         if(playerIDs[i]==playerID)
  72.         {
  73.             if(serverID!=playerSRV[i])
  74.             {
  75.                 std::cout << i << std::endl;
  76.             }
  77.         }
  78.     }
  79. }
  80.  
  81. void HashTable::prepareDateForNonPartition(Server **servers, Player **players)
  82. {
  83.     for(int i = 0;i<serverCount;i++)
  84.     {
  85.         serverIDs[i]=servers[i]->getId();
  86.     }
  87.  
  88.     for(int i = 0; i <playerCount;i++)
  89.     {
  90.         playerIDs[i]=players[i]->getId();
  91.         playerSRV[i]=players[i]->getServerID();
  92.     }
  93.  
  94.  
  95.     for(int i = 0;i<this->numberOfBuckets;i++)
  96.     {
  97.         indexArray[i][0]=0;
  98.         indexArray[i][1]=this->numberOfServersInArray;
  99.     }
  100.  
  101.     int pocet = 0;
  102.     int line;
  103.     for(int i =0;i<serverCount;i++)
  104.     {
  105.         line = serverIDs[i]/this->numberOfServersInArray;
  106.         srvArray[line][indexArray[line][0]]=serverIDs[i];//rozdelovani serveru do jednotlivych prihradek
  107.         indexArray[line][0]+=1;
  108.  
  109.        
  110.         if(indexArray[line][0]==indexArray[line][1])
  111.         {
  112.             srvArray[line]=enlarge(srvArray[line],line,indexArray[line][1],indexArray[line][1]*2);//pripadny enlarge
  113.         }
  114.     }
  115. }
  116.  
  117. void HashTable::Hash()
  118. {
  119.     int tuples = 0;//pocet nalezenych shod
  120.     int lineToSearch;//radek ve kterem se ma vyhledavat
  121.     for(int i = 0; i<playerCount;i++)
  122.     {
  123.         lineToSearch = playerSRV[i]/this->numberOfServersInArray;
  124.         for(int j =0;j< indexArray[lineToSearch][0];j++)
  125.         {
  126.             if(playerSRV[i]==srvArray[lineToSearch][j])
  127.             {
  128.                 //checkIfCorrect(srvArray[lineToSearch][j],playerIDs[i]);
  129.                 tuples++;
  130.                 break;
  131.             }
  132.         }
  133.     }
  134.     std::cout<<"finished partitioned hash join, tuples found: " << tuples <<std::endl;
  135. }
  136.  
  137. int* HashTable::enlarge(int *pole,int line, const unsigned int currentLength, const unsigned int newLength)
  138. {
  139.         int *tmp = new int[newLength];
  140.  
  141.         for (unsigned int i=0; i<currentLength; i++)
  142.         {
  143.                 tmp[i] = pole[i];
  144.         }
  145.         this->indexArray[line][1] = newLength;
  146.  
  147.         delete []pole;
  148.         return tmp;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment