blob: eeacccde276e9b11eea383ceeb0f95b524831dc9 [file] [log] [blame]
package edu.uci.ics.hyracks.storage.am.common.util;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.hyracks.storage.am.common.api.IFreePageManager;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexMetaDataFrame;
import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
import edu.uci.ics.hyracks.storage.common.file.BufferedFileHandle;
public class TreeIndexStatsGatherer {
private final TreeIndexStats treeIndexStats = new TreeIndexStats();
private final IBufferCache bufferCache;
private final IFreePageManager freePageManager;
private final int fileId;
private final int rootPage;
public TreeIndexStatsGatherer(IBufferCache bufferCache,
IFreePageManager freePageManager, int fileId, int rootPage) {
this.bufferCache = bufferCache;
this.freePageManager = freePageManager;
this.fileId = fileId;
this.rootPage = rootPage;
}
public TreeIndexStats gatherStats(ITreeIndexFrame leafFrame,
ITreeIndexFrame interiorFrame, ITreeIndexMetaDataFrame metaFrame)
throws HyracksDataException {
bufferCache.openFile(fileId);
treeIndexStats.begin();
int maxPageId = freePageManager.getMaxPage(metaFrame);
for (int pageId = 0; pageId <= maxPageId; pageId++) {
ICachedPage page = bufferCache.pin(
BufferedFileHandle.getDiskPageId(fileId, pageId), false);
page.acquireReadLatch();
try {
metaFrame.setPage(page);
leafFrame.setPage(page);
interiorFrame.setPage(page);
if (leafFrame.isLeaf()) {
if (pageId == rootPage) {
treeIndexStats.addRoot(leafFrame);
} else {
treeIndexStats.add(leafFrame);
}
} else if (interiorFrame.isInterior()) {
if (pageId == rootPage) {
treeIndexStats.addRoot(interiorFrame);
} else {
treeIndexStats.add(interiorFrame);
}
} else {
treeIndexStats.add(metaFrame, freePageManager);
}
} finally {
page.releaseReadLatch();
bufferCache.unpin(page);
}
}
treeIndexStats.end();
bufferCache.closeFile(fileId);
return treeIndexStats;
}
}