const int64_t HASH_MULTIPLIER = 1000003; // prime number, optimal for astronomy RA/DECL->integer conversion
const size_t HASH_TABLE_RESERVE = 1009; // for overlap area
scidb::CrossJoinChunkIterator::operator++
void CrossJoinChunkIterator::operator ++()
{if (!hasCurrent)
throw USER_EXCEPTION(SCIDB_SE_EXECUTION, SCIDB_LE_NO_CURRENT_ELEMENT);
if( ++currentIndex >= (ssize_t) currentBucket->size())
{
Coordinates joinKey(array.nJoinDims);
++(*leftIterator);
while (!leftIterator->end())
{
array.decomposeLeftCoordinates(leftIterator->getPosition(), joinKey);
ChunkHash::const_iterator it = rightHash.find(joinKey);
if (it!=rightHash.end())
{
currentBucket = &(it->second);
currentIndex = 0;
return;
}
++(*leftIterator);
}
hasCurrent = false;
}
}
scidb::CrossJoinChunkIterator::setPosition
bool CrossJoinChunkIterator::setPosition(Coordinates const& pos)
{
Coordinates left(array.nLeftDims);
Coordinates joinKey(array.nJoinDims);
Coordinates rightLeftover(array.nRightDims - array.nJoinDims);
array.decomposeOutCoordinates(pos, left, joinKey, rightLeftover);
if(!leftIterator->setPosition(left))
{
return hasCurrent = false;
}
ChunkHash::const_iterator it = rightHash.find(joinKey);
if (it==rightHash.end())
{
return hasCurrent = false;
}
currentBucket = &(it->second);
currentIndex = findValueInBucket(currentBucket, rightLeftover);
return hasCurrent = (currentIndex!=-1);
}
scidb::CrossJoinChunkIterator::reset
void CrossJoinChunkIterator::reset()
{
hasCurrent = false;
leftIterator->reset();
Coordinates joinKey(array.nJoinDims);
while (!leftIterator->end())
{
array.decomposeLeftCoordinates(leftIterator->getPosition(), joinKey);
ChunkHash::const_iterator it = rightHash.find(joinKey);
if (it!=rightHash.end())
{
currentBucket = &(it->second);
currentIndex = 0;
hasCurrent = true;
return;
}
++(*leftIterator);
}
}