package org.basex.core.cmd;
import static org.basex.core.Text.*;
import java.io.IOException;
import org.basex.core.CommandBuilder;
import org.basex.core.User;
import org.basex.core.Commands.Cmd;
import org.basex.core.Commands.CmdIndexInfo;
import org.basex.core.Commands.CmdInfo;
import org.basex.data.Data;
import org.basex.index.IndexToken.IndexType;
import org.basex.util.Token;
import org.basex.util.TokenBuilder;
/**
* Evaluates the 'info index' command and returns information on the indexes
* of the currently opened database.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class InfoIndex extends AInfo {
/**
* Default constructor.
*/
public InfoIndex() {
this(null);
}
/**
* Default constructor.
* @param type optional index type, defined in {@link CmdIndexInfo}
*/
public InfoIndex(final Object type) {
super(DATAREF | User.READ, type != null && type != CmdIndexInfo.NULL ?
type.toString() : null);
}
@Override
protected boolean run() throws IOException {
final Data data = context.data();
if(args[0] != null) {
final CmdIndexInfo ci = getOption(CmdIndexInfo.class);
if(ci == null) return error(UNKNOWN_CMD_X, this);
final byte[] inf = info(ci, data);
out.print(inf);
return inf.length != 0;
}
final TokenBuilder tb = new TokenBuilder();
tb.add(info(CmdIndexInfo.TAG, data));
tb.add(info(CmdIndexInfo.ATTNAME, data));
tb.add(info(CmdIndexInfo.TEXT, data));
tb.add(info(CmdIndexInfo.ATTRIBUTE, data));
tb.add(info(CmdIndexInfo.FULLTEXT, data));
tb.add(info(CmdIndexInfo.PATH, data));
out.print(tb.finish());
return true;
}
/**
* Prints information on the specified index.
* @param idx index type
* @param data data reference
* @return success flag
*/
private static byte[] info(final CmdIndexInfo idx, final Data data) {
switch(idx) {
case TAG: return info(ELEMENTS, IndexType.TAG, data, true);
case ATTNAME: return info(ATTRIBUTES, IndexType.ATTNAME, data, true);
case TEXT: return info(TEXT_INDEX, IndexType.TEXT, data,
data.meta.textindex);
case ATTRIBUTE: return info(ATTRIBUTE_INDEX, IndexType.ATTRIBUTE, data,
data.meta.attrindex);
case FULLTEXT: return info(FULLTEXT_INDEX, IndexType.FULLTEXT, data,
data.meta.ftxtindex);
case PATH: return info(PATH_INDEX, IndexType.PATH, data,
data.meta.pathindex);
default: return Token.token(LI + NOT_AVAILABLE);
}
}
/**
* Returns the specified index information.
* @param ds index description
* @param it index type
* @param data data reference
* @param avl states if index is available
* @return information
*/
private static byte[] info(final String ds, final IndexType it,
final Data data, final boolean avl) {
final TokenBuilder tb = new TokenBuilder(ds).add(NL);
if(avl) tb.add(data.info(it));
else tb.add(LI).addExt(NOT_AVAILABLE, it).add(NL);
return tb.add(NL).finish();
}
@Override
public void build(final CommandBuilder cb) {
cb.init(Cmd.INFO + " " + CmdInfo.INDEX).args();
}
}