org.basex.query.expr.And Maven / Gradle / Ivy
package org.basex.query.expr;
import static org.basex.query.QueryText.*;
import org.basex.query.*;
import org.basex.query.util.index.*;
import org.basex.query.util.list.*;
import org.basex.query.value.item.*;
import org.basex.query.var.*;
import org.basex.util.*;
import org.basex.util.hash.*;
/**
* And expression.
*
* @author BaseX Team 2005-22, BSD License
* @author Christian Gruen
*/
public final class And extends Logical {
/**
* Constructor.
* @param info input info
* @param exprs expressions
*/
public And(final InputInfo info, final Expr... exprs) {
super(info, exprs);
}
@Override
public Expr optimize(final CompileContext cc) throws QueryException {
flatten(cc);
return optimize(cc, false);
}
@Override
public Item item(final QueryContext qc, final InputInfo ii) throws QueryException {
for(final Expr expr : exprs) {
if(!expr.ebv(qc, info).bool(info)) return Bln.FALSE;
}
return Bln.TRUE;
}
@Override
public And copy(final CompileContext cc, final IntObjMap vm) {
return copyType(new And(info, copyAll(cc, vm, exprs)));
}
@Override
public boolean indexAccessible(final IndexInfo ii) throws QueryException {
IndexCosts costs = IndexCosts.ZERO;
final ExprList list = new ExprList(exprs.length);
for(final Expr expr : exprs) {
// check if expression can be rewritten, and if access is not sequential
if(!expr.indexAccessible(ii)) return false;
// skip queries with no results
if(ii.costs.results() == 0) return true;
// summarize costs
costs = IndexCosts.add(costs, ii.costs);
list.add(ii.expr);
}
// use summarized costs for estimation
ii.costs = costs;
// create intersection of all index requests
ii.expr = new Intersect(info, list.finish());
return true;
}
@Override
public boolean equals(final Object obj) {
return this == obj || obj instanceof And && super.equals(obj);
}
@Override
public void toString(final QueryString qs) {
qs.tokens(exprs, ' ' + AND + ' ', true);
}
}