package org.basex.tests.w3c; import java.io.*; import java.util.*; import org.basex.io.*; import org.basex.query.*; import org.basex.query.expr.ft.*; import org.basex.query.value.item.*; import org.basex.query.value.node.*; import org.basex.util.*; import org.basex.util.ft.*; /** * XQuery Full Text Test Suite wrapper. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public final class XQFTTS extends W3CTS { /** Cached stop word files. */ private final HashMap<String, IO> stop = new HashMap<>(); /** Cached stop word files. */ private final HashMap<String, IO> stop2 = new HashMap<>(); /** Cached stemming dictionaries. */ private final HashMap<String, IO> stem = new HashMap<>(); /** Cached thesaurus. */ private final HashMap<String, IO> thes = new HashMap<>(); /** Cached thesaurus. */ private final HashMap<String, IO> thes2 = new HashMap<>(); /** * Main method of the test class. * @param args command-line arguments * @throws Exception exception */ public static void main(final String... args) throws Exception { new XQFTTS(args).run(); } /** * Constructor. * @param args command-line arguments */ public XQFTTS(final String[] args) { super(args, Util.className(XQFTTS.class)); } @Override protected void init(final DBNode root) throws QueryException { Util.outln("Caching Full-text Structures..."); for(final Item node : nodes("//*:stopwords", root)) { final String val = (path + text("@FileName", node)).replace('\\', '/'); stop.put(text("@uri", node), IO.get(val)); stop2.put(text("@ID", node), IO.get(val)); } for(final Item node : nodes("//*:stemming-dictionary", root)) { final String val = (path + text("@FileName", node)).replace('\\', '/'); stem.put(text("@ID", node), IO.get(val)); } for(final Item node : nodes("//*:thesaurus", root)) { final String val = (path + text("@FileName", node)).replace('\\', '/'); thes.put(text("@uri", node), IO.get(val)); thes2.put(text("@ID", node), IO.get(val)); } } @Override protected void parse(final QueryProcessor qp, final Item root) throws QueryException { final QueryContext qc = qp.qc; qc.resources.ftmaps(stop, thes); final FTOpt opt = qc.ftOpt(); for(final String s : aux("stopwords", root)) { final IO fn = stop2.get(s); if(fn != null) { if(opt.sw == null) opt.sw = new StopWords(); try { opt.sw.read(fn, false); } catch(final IOException ex) { throw new QueryException(ex); } } } for(final String s : aux("stemming-dictionary", root)) { final IO fn = stem.get(s); if(fn != null) { if(opt.sd == null) opt.sd = new StemDir(); opt.sd.read(fn); } } for(final String s : aux("thesaurus", root)) { final IO fn = thes2.get(s); if(fn != null) { if(opt.th == null) opt.th = new ThesQuery(); opt.th.add(new Thesaurus(fn, context)); } } } /** * Returns the resulting auxiliary uri in multiple strings. * @param role role * @param root root node * @return attribute value * @throws QueryException query exception */ private String[] aux(final String role, final Item root) throws QueryException { return Strings.split(text("*:aux-URI[@role = '" + role + "']", root), '/'); } }