package org.basex.util.ft;
import org.basex.data.ExprInfo;
import org.basex.data.MetaData;
import org.basex.io.serial.Serializer;
import static org.basex.query.QueryText.*;
import org.basex.query.ft.ThesQuery;
import static org.basex.util.Token.TRUE;
import static org.basex.util.Token.token;
import static org.basex.util.ft.FTFlag.*;
import java.io.IOException;
import java.util.EnumMap;
import java.util.Map.Entry;
/**
* This class contains all full-text options.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class FTOpt extends ExprInfo {
/** Flag values. */
private final EnumMap<FTFlag, Boolean> map =
new EnumMap<FTFlag, Boolean>(FTFlag.class);
/** Stemming dictionary. */
public StemDir sd;
/** Stop words. */
public StopWords sw;
/** Thesaurus. */
public ThesQuery th;
/** Language. */
public Language ln;
/**
* Initializes the full-text options, inheriting the options of the argument.
* @param opt parent full-text options
* @return self reference
*/
public FTOpt copy(final FTOpt opt) {
for(final Entry<FTFlag, Boolean> f : opt.map.entrySet()) {
final FTFlag fl = f.getKey();
if(map.get(fl) == null) map.put(fl, f.getValue());
}
if(sw == null) sw = opt.sw;
if(sd == null) sd = opt.sd;
if(ln == null) ln = opt.ln;
if(th == null) th = opt.th;
else if(opt.th != null) th.merge(opt.th);
return this;
}
/**
* Copies the full-text options from the specified database meta data.
* @param md meta data
* @return self reference
*/
public FTOpt copy(final MetaData md) {
set(CS, md.casesens);
set(DC, md.diacritics);
set(ST, md.stemming);
ln = md.language;
return this;
}
/**
* Sets the specified flag.
* @param f flag to be set
* @param v value
* @return self reference
*/
public FTOpt set(final FTFlag f, final boolean v) {
map.put(f, v);
return this;
}
/**
* Tests if the specified flag has been set.
* @param f flag index
* @return true if flag has been set
*/
public boolean isSet(final FTFlag f) {
return map.get(f) != null;
}
/**
* Returns the specified flag.
* @param f flag index
* @return flag
*/
public boolean is(final FTFlag f) {
final Boolean b = map.get(f);
return b != null && b;
}
@Override
public void plan(final Serializer ser) throws IOException {
if(is(WC)) ser.attribute(token(WILDCARDS), TRUE);
if(is(FZ)) ser.attribute(token(FUZZY), TRUE);
if(is(UC)) ser.attribute(token(UPPERCASE), TRUE);
if(is(LC)) ser.attribute(token(LOWERCASE), TRUE);
if(is(DC)) ser.attribute(token(DIACRITICS), TRUE);
if(is(ST)) ser.attribute(token(STEMMING), TRUE);
if(ln != null) ser.attribute(token(LANGUAGE), token(ln.toString()));
if(th != null) ser.attribute(token(THESAURUS), TRUE);
}
@Override
public String toString() {
final StringBuilder s = new StringBuilder();
if(is(WC)) s.append(' ' + USING + ' ' + WILDCARDS);
if(is(FZ)) s.append(' ' + USING + ' ' + FUZZY);
if(is(UC)) s.append(' ' + USING + ' ' + UPPERCASE);
if(is(LC)) s.append(' ' + USING + ' ' + LOWERCASE);
if(is(DC)) s.append(' ' + USING + ' ' + DIACRITICS + ' ' + SENSITIVE);
if(is(ST) || sd != null) s.append(' ' + USING + ' ' + STEMMING);
if(ln != null) s.append(' ' + USING + ' ' + LANGUAGE + " '" + ln + '\'');
if(th != null) s.append(' ' + USING + ' ' + THESAURUS);
return s.toString();
}
}