Mapping expression. @author BaseX Team, BSD License @author Christian Gruen
| 19 | * @author Christian Gruen |
| 20 | */ |
| 21 | public abstract class Mapping extends Arr { |
| 22 | /** |
| 23 | * Constructor. |
| 24 | * @param info input info (can be {@code null}) |
| 25 | * @param seqType sequence type |
| 26 | * @param exprs expressions |
| 27 | */ |
| 28 | Mapping(final InputInfo info, final SeqType seqType, final Expr... exprs) { |
| 29 | super(info, seqType, exprs); |
| 30 | } |
| 31 | |
| 32 | @Override |
| 33 | public final void checkUp() throws QueryException { |
| 34 | final int el = exprs.length; |
| 35 | for(int e = 0; e < el - 1; e++) checkNoUp(exprs[e]); |
| 36 | exprs[el - 1].checkUp(); |
| 37 | } |
| 38 | |
| 39 | @Override |
| 40 | public final boolean vacuous() { |
| 41 | return exprs[exprs.length - 1].vacuous(); |
| 42 | } |
| 43 | |
| 44 | @Override |
| 45 | public final Expr compile(final CompileContext cc) throws QueryException { |
| 46 | final int el = exprs.length; |
| 47 | final boolean items = items(); |
| 48 | for(int e = 0; e < el; e++) { |
| 49 | final Expr expr = cc.compileOrError(exprs[e], e == 0); |
| 50 | if(e == 0) cc.pushFocus(expr, items); |
| 51 | else cc.updateFocus(expr, items); |
| 52 | exprs[e] = expr; |
| 53 | } |
| 54 | cc.removeFocus(); |
| 55 | return optimize(cc); |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * Indicates if the expression maps items or values. |
| 60 | * @return result of check |
| 61 | */ |
| 62 | abstract boolean items(); |
| 63 | |
| 64 | @Override |
| 65 | public final boolean has(final Flag... flags) { |
| 66 | // Context dependency, positional access: only check first expression. |
| 67 | // Examples: . ! abc, position() ! a |
| 68 | return Flag.FCS.oneOf(flags) || |
| 69 | Flag.CTX.oneOf(flags) && exprs[0].has(Flag.CTX) || |
| 70 | Flag.POS.oneOf(flags) && exprs[0].has(Flag.POS) || |
| 71 | super.has(Flag.remove(flags, Flag.POS, Flag.CTX)); |
| 72 | } |
| 73 | |
| 74 | @Override |
| 75 | public final boolean accept(final ASTVisitor visitor) { |
| 76 | visitor.enterFocus(); |
| 77 | if(!visitAll(visitor, exprs)) return false; |
| 78 | visitor.exitFocus(); |
nothing calls this directly
no outgoing calls
no test coverage detected