/**
*/
package com.sleepycat.je.dbi;
import java.io.PrintStream;
import java.util.HashSet;
import java.util.Set;
import com.sleepycat.je.BtreeStats;
import com.sleepycat.je.DatabaseStats;
import com.sleepycat.je.tree.BIN;
import com.sleepycat.je.tree.DBIN;
import com.sleepycat.je.tree.DIN;
import com.sleepycat.je.tree.DupCountLN;
import com.sleepycat.je.tree.IN;
import com.sleepycat.je.tree.Node;
import com.sleepycat.je.tree.TreeWalkerStatsAccumulator;
import de.ovgu.cide.jakutil.*;
class StatsAccumulator implements TreeWalkerStatsAccumulator {
private Set inNodeIdsSeen=new HashSet();
private Set binNodeIdsSeen=new HashSet();
private Set dinNodeIdsSeen=new HashSet();
private Set dbinNodeIdsSeen=new HashSet();
private Set dupCountLNsSeen=new HashSet();
private long[] insSeenByLevel=null;
private long[] binsSeenByLevel=null;
private long[] dinsSeenByLevel=null;
private long[] dbinsSeenByLevel=null;
private long lnCount=0;
private long deletedLNCount=0;
private int mainTreeMaxDepth=0;
private int duplicateTreeMaxDepth=0;
private DatabaseStats useStats;
PrintStream progressStream;
int progressInterval;
private static final int MAX_LEVELS=100;
StatsAccumulator( PrintStream progressStream, int progressInterval, DatabaseStats useStats){
this.progressStream=progressStream;
this.progressInterval=progressInterval;
insSeenByLevel=new long[MAX_LEVELS];
binsSeenByLevel=new long[MAX_LEVELS];
dinsSeenByLevel=new long[MAX_LEVELS];
dbinsSeenByLevel=new long[MAX_LEVELS];
this.useStats=useStats;
}
public void processIN( IN node, Long nid, int level){
if (inNodeIdsSeen.add(nid)) {
tallyLevel(level,insSeenByLevel);
this.hook363(node);
}
}
public void processBIN( BIN node, Long nid, int level){
if (binNodeIdsSeen.add(nid)) {
tallyLevel(level,binsSeenByLevel);
this.hook364(node);
}
}
public void processDIN( DIN node, Long nid, int level){
if (dinNodeIdsSeen.add(nid)) {
tallyLevel(level,dinsSeenByLevel);
this.hook365(node);
}
}
public void processDBIN( DBIN node, Long nid, int level){
if (dbinNodeIdsSeen.add(nid)) {
tallyLevel(level,dbinsSeenByLevel);
this.hook366(node);
}
}
public void processDupCountLN( DupCountLN node, Long nid){
dupCountLNsSeen.add(nid);
this.hook367(node);
}
private void tallyLevel( int levelArg, long[] nodesSeenByLevel){
int level=levelArg;
if (level >= IN.DBMAP_LEVEL) {
return;
}
if (level >= IN.MAIN_LEVEL) {
level&=~IN.MAIN_LEVEL;
if (level > mainTreeMaxDepth) {
mainTreeMaxDepth=level;
}
}
else {
if (level > duplicateTreeMaxDepth) {
duplicateTreeMaxDepth=level;
}
}
nodesSeenByLevel[level]++;
}
public void incrementLNCount(){
lnCount++;
if (progressInterval != 0) {
if ((lnCount % progressInterval) == 0) {
copyToStats(useStats);
progressStream.println(useStats);
}
}
}
public void incrementDeletedLNCount(){
deletedLNCount++;
}
Set getINNodeIdsSeen(){
return inNodeIdsSeen;
}
Set getBINNodeIdsSeen(){
return binNodeIdsSeen;
}
Set getDINNodeIdsSeen(){
return dinNodeIdsSeen;
}
Set getDBINNodeIdsSeen(){
return dbinNodeIdsSeen;
}
long[] getINsByLevel(){
return insSeenByLevel;
}
long[] getBINsByLevel(){
return binsSeenByLevel;
}
long[] getDINsByLevel(){
return dinsSeenByLevel;
}
long[] getDBINsByLevel(){
return dbinsSeenByLevel;
}
long getLNCount(){
return lnCount;
}
Set getDupCountLNCount(){
return dupCountLNsSeen;
}
long getDeletedLNCount(){
return deletedLNCount;
}
int getMainTreeMaxDepth(){
return mainTreeMaxDepth;
}
int getDuplicateTreeMaxDepth(){
return duplicateTreeMaxDepth;
}
void copyToStats( DatabaseStats stats){
BtreeStats bStats=(BtreeStats)stats;
bStats.setInternalNodeCount(getINNodeIdsSeen().size());
bStats.setBottomInternalNodeCount(getBINNodeIdsSeen().size());
bStats.setDuplicateInternalNodeCount(getDINNodeIdsSeen().size());
bStats.setDuplicateBottomInternalNodeCount(getDBINNodeIdsSeen().size());
bStats.setLeafNodeCount(getLNCount());
bStats.setDeletedLeafNodeCount(getDeletedLNCount());
bStats.setDupCountLeafNodeCount(getDupCountLNCount().size());
bStats.setMainTreeMaxDepth(getMainTreeMaxDepth());
bStats.setDuplicateTreeMaxDepth(getDuplicateTreeMaxDepth());
bStats.setINsByLevel(getINsByLevel());
bStats.setBINsByLevel(getBINsByLevel());
bStats.setDINsByLevel(getDINsByLevel());
bStats.setDBINsByLevel(getDBINsByLevel());
}
protected void hook363( IN node){
}
protected void hook364( BIN node){
}
protected void hook365( DIN node){
}
protected void hook366( DBIN node){
}
protected void hook367( DupCountLN node){
}
}