package org.basex.index;
import static org.basex.core.Text.*;
import java.io.IOException;
import org.basex.core.BaseXException;
import org.basex.core.Progress;
import org.basex.data.Data;
import org.basex.util.Performance;
import org.basex.util.Util;
/**
* This interface defines the functions which are needed for building
* new index structures.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public abstract class IndexBuilder extends Progress {
/** Data reference. */
protected final Data data;
/** Total parsing value. */
protected final int size;
/** Current parsing value. */
protected int pre;
/** Merge flag. */
protected boolean merge;
/** Number of cached index structures. */
protected int csize;
/** Runtime for memory consumption. */
private final Runtime rt = Runtime.getRuntime();
/** Maximum memory to consume. */
private final long maxMem = (long) (rt.maxMemory() * 0.8);
/** Free memory threshold. */
private int cc;
/**
* Builds the index structure and returns an index instance.
* @return index instance
* @throws IOException I/O Exception
*/
public abstract Index build() throws IOException;
/**
* Checks if the command was interrupted, and prints some debug output.
*/
protected final void check() {
checkStop();
if(Util.debug && (pre & 0x1FFFFF) == 0) Util.err(".");
}
/**
* Checks if enough memory is left to continue index building.
* @return result of check
* @throws IOException I/O exception
*/
protected final boolean memFull() throws IOException {
final boolean full = rt.totalMemory() - rt.freeMemory() >= maxMem;
if(full) {
if(cc >= 0) throw new BaseXException(OUT_OF_MEM + HELP_OUT_OF_MEM);
if(Util.debug) Util.err("!");
merge = true;
cc = 30;
} else {
--cc;
}
return full;
}
/**
* Constructor.
* @param d reference
*/
protected IndexBuilder(final Data d) {
data = d;
size = data.meta.size;
if(rt.totalMemory() - rt.freeMemory() >= rt.maxMemory() >> 1)
Performance.gc(2);
}
@Override
public final String tit() {
return CREATING_INDEXES;
}
@Override
public final double prog() {
return (double) pre / (size + (merge ? size / 50 : 0));
}
}