package org.basex.query.ft; import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; import java.io.IOException; import org.basex.io.serial.Serializer; import org.basex.query.QueryContext; import org.basex.query.QueryException; import org.basex.query.expr.Expr; import org.basex.query.expr.Simple; import org.basex.query.func.Function; import org.basex.query.item.FTNode; import org.basex.query.item.ANode; import org.basex.query.item.Str; import org.basex.query.iter.FTIter; import org.basex.query.iter.NodeIter; import org.basex.query.util.IndexContext; import org.basex.query.util.Var; import org.basex.util.InputInfo; /** * FTContains expression with index access. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class FTIndexAccess extends Simple { /** Full-text expression. */ private final FTExpr ftexpr; /** Index context. */ private final IndexContext ictx; /** * Constructor. * @param ii input info * @param ex contains, select and optional ignore expression * @param ic index context */ public FTIndexAccess(final InputInfo ii, final FTExpr ex, final IndexContext ic) { super(ii); ftexpr = ex; ictx = ic; } @Override public NodeIter iter(final QueryContext ctx) throws QueryException { final FTIter ir = ftexpr.iter(ctx); return new NodeIter() { @Override public ANode next() throws QueryException { final FTNode it = ir.next(); if(it != null) { // add entry to visualization if(ctx.ftpos != null) ctx.ftpos.add(it.data, it.pre, it.all); // assign scoring, if not done yet it.score(); // remove matches reference to save memory it.all = null; } return it; } }; } @Override public boolean uses(final Use u) { return ftexpr.uses(u); } @Override public int count(final Var v) { return ftexpr.count(v); } @Override public boolean removable(final Var v) { return ftexpr.removable(v); } @Override public Expr remove(final Var v) { ftexpr.remove(v); return this; } @Override public void plan(final Serializer ser) throws IOException { ser.openElement(this, DATA, token(ictx.data.meta.name)); ftexpr.plan(ser); ser.closeElement(); } @Override public boolean iterable() { return ictx.iterable; } @Override public String toString() { return Function._DB_FULLTEXT.get(input, Str.get(ictx.data.meta.name), ftexpr).toString(); } }