Пример #1
0
 @Override
 public Expr copy(final QueryContext ctx, final VarScope scp, final IntObjMap<Var> vs) {
   final Expr[] copy = copyAll(ctx, scp, vs, expr);
   final int last = copy.length - 1;
   final Expr[] args = Arrays.copyOf(copy, last);
   final DynFuncCall call = new DynFuncCall(info, sc, updating, copy[last], args);
   if (inlinedFrom != null) call.inlinedFrom = inlinedFrom.clone();
   return copyType(call);
 }
Пример #2
0
  @Override
  public Expr optimize(final QueryContext ctx, final VarScope scp) throws QueryException {
    final int ar = expr.length - 1;
    final Expr f = expr[ar];
    final Type t = f.type().type;
    if (t instanceof FuncType) {
      final FuncType ft = (FuncType) t;
      if (ft.args != null && ft.args.length != ar) throw INVARITY.get(info, f, ar);
      if (ft.ret != null) type = ft.ret;
    }

    if (f instanceof XQFunctionExpr) {
      // maps can only contain fully evaluated Values, so this is safe
      if (allAreValues() && f instanceof Map) return optPre(value(ctx), ctx);

      // try to inline the function
      if (!(f instanceof FuncItem && comesFrom((FuncItem) f)) && !updating) {
        final Expr[] args = Arrays.copyOf(expr, expr.length - 1);
        final Expr inl = ((XQFunctionExpr) f).inlineExpr(args, ctx, scp, info);
        if (inl != null) return inl;
      }
    }
    return this;
  }
Пример #3
0
 @Override
 public void checkUp() throws QueryException {
   checkNoneUp(Arrays.copyOf(expr, expr.length - 1));
 }