/** * Checks if the predicates are successful for the specified item. * * @param it item to be checked * @param qc query context * @return result of check * @throws QueryException query exception */ protected final boolean preds(final Item it, final QueryContext qc) throws QueryException { if (preds.length == 0) return true; // set context value and position final Value cv = qc.value; try { if (qc.scoring) { double s = 0; for (final Expr p : preds) { qc.value = it; final Item i = p.test(qc, info); if (i == null) return false; s += i.score(); } it.score(Scoring.avg(s, preds.length)); } else { for (final Expr p : preds) { qc.value = it; if (p.test(qc, info) == null) return false; } } return true; } finally { qc.value = cv; } }
/** * Checks two keys for equality. * * @param its1 first keys * @param its2 second keys * @param coll collations * @return {@code true} if the compare as equal, {@code false} otherwise * @throws QueryException query exception */ private boolean eq(final Item[] its1, final Item[] its2, final Collation[] coll) throws QueryException { final int il = its1.length; for (int i = 0; i < il; i++) { final Item it1 = its1[i], it2 = its2[i]; if (it1 == null ^ it2 == null || it1 != null && !it1.equiv(it2, coll[i], info)) return false; } return true; }
@Override public B64 item(final QueryContext qc, final InputInfo ii) throws QueryException { checkCreate(qc); final IOFile root = new IOFile(toPath(0, qc).toString()); final ArchOptions opts = toOptions(1, Q_OPTIONS, new ArchOptions(), qc); final Iter entries; if (exprs.length > 2) { entries = qc.iter(exprs[2]); } else { final TokenList tl = new TokenList(); for (final String file : root.descendants()) tl.add(file); entries = StrSeq.get(tl).iter(); } final String format = opts.get(ArchOptions.FORMAT); final int level = level(opts); if (!root.isDir()) throw FILE_NO_DIR_X.get(info, root); try (final ArchiveOut out = ArchiveOut.get(format.toLowerCase(Locale.ENGLISH), info)) { out.level(level); try { while (true) { Item en = entries.next(); if (en == null) break; en = checkElemToken(en); final IOFile file = new IOFile(root, string(en.string(info))); if (!file.exists()) throw FILE_NOT_FOUND_X.get(info, file); if (file.isDir()) throw FILE_IS_DIR_X.get(info, file); add(en, new B64(file.read()), out, level, qc); } } catch (final IOException ex) { throw ARCH_FAIL_X.get(info, ex); } return new B64(out.finish()); } }
@Override public final Item atomItem(final QueryContext qc, final InputInfo ii) throws QueryException { final Item it1 = item(qc, info); return it1 == null ? null : it1.atomItem(info); }
/** * Checks if the specified item is a string or binary item. * * @param it item to be checked * @return byte array * @throws QueryException query exception */ protected final byte[] toBytes(final Item it) throws QueryException { if (checkNoEmpty(it).type.isStringOrUntyped()) return it.string(info); if (it instanceof Bin) return ((Bin) it).binary(info); throw STRBIN_X_X.get(info, it.type, it); }
/** * Checks if the specified item yields a node or item. Returns the item or throws an exception. * * @param it item to be checked (can be {@code null}) * @return node or atomized item * @throws QueryException query exception */ protected final Item toNodeOrAtomItem(final Item it) throws QueryException { return it == null || it instanceof ANode ? it : it.atomItem(info); }
@Override public Iter iter(final QueryContext qc) throws QueryException { final Item it = item(qc, info); return it != null ? it.iter() : Empty.ITER; }
/** * Checks if the specified item is a number. Returns a token representation or throws an * exception. * * @param it item to be checked * @return number * @throws QueryException query exception */ protected final long toLong(final Item it) throws QueryException { final Type ip = checkNoEmpty(it, AtomType.ITR).type; if (ip.instanceOf(AtomType.ITR) || ip.isUntyped()) return it.itr(info); throw castError(it, AtomType.ITR, info); }
/** * Checks if the specified expression yields a float. Returns the float or throws an exception. * * @param ex expression to be evaluated * @param qc query context * @return float * @throws QueryException query exception */ protected final float toFloat(final Expr ex, final QueryContext qc) throws QueryException { final Item it = ex.atomItem(qc, info); if (checkNoEmpty(it, AtomType.FLT).type.isNumberOrUntyped()) return it.flt(info); throw numberError(this, it); }
/** * Checks if the specified, non-empty item is a double. Returns the double or throws an exception. * * @param it item to be checked * @return number * @throws QueryException query exception */ private ANum toNumber(final Item it) throws QueryException { if (it.type.isUntyped()) return Dbl.get(it.dbl(info)); if (it instanceof ANum) return (ANum) it; throw numberError(this, it); }
/** * Checks if the specified item is a double. Returns the double or throws an exception. * * @param it item * @return double * @throws QueryException query exception */ protected final double toDouble(final Item it) throws QueryException { if (checkNoEmpty(it, AtomType.DBL).type.isNumberOrUntyped()) return it.dbl(info); throw numberError(this, it); }
/** * Checks if the specified item is a boolean. Returns the boolean or throws an exception. * * @param it item be checked * @return boolean * @throws QueryException query exception */ protected final boolean toBoolean(final Item it) throws QueryException { final Type ip = checkNoEmpty(it, AtomType.BLN).type; if (ip == AtomType.BLN) return it.bool(info); if (ip.isUntyped()) return Bln.parse(it.string(info), info); throw castError(it, AtomType.BLN, info); }
/** * Checks if the specified non-empty item is a string. Returns its value as token or throws an * exception. * * @param it item to be checked * @return token * @throws QueryException query exception */ protected final byte[] toToken(final Item it) throws QueryException { final Type ip = it.type; if (ip.isStringOrUntyped()) return it.string(info); throw it instanceof FItem ? FIATOM_X.get(info, it.type) : castError(it, AtomType.STR, info); }
@Override public final Item test(final QueryContext qc, final InputInfo ii) throws QueryException { final Item it = ebv(qc, info); return (it instanceof ANum ? it.dbl(info) == qc.pos : it.bool(info)) ? it : null; }