diff -Nru basex-9.7.1/basex-core/pom.xml basex-9.7.2/basex-core/pom.xml --- basex-9.7.1/basex-core/pom.xml 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/pom.xml 2022-05-14 08:34:33.000000000 +0000 @@ -7,7 +7,7 @@ org.basex basex-parent - 9.7.1 + 9.7.2 .. diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/api/client/Session.java basex-9.7.2/basex-core/src/main/java/org/basex/api/client/Session.java --- basex-9.7.1/basex-core/src/main/java/org/basex/api/client/Session.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/api/client/Session.java 2022-05-14 08:34:33.000000000 +0000 @@ -83,7 +83,7 @@ public abstract void replace(String path, InputStream input) throws IOException; /** - * Stores raw data in an open database. + * Stores binary data in an open database. * @param path target path * @param input binary input * @throws IOException I/O exception diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/BaseXGUI.java basex-9.7.2/basex-core/src/main/java/org/basex/BaseXGUI.java --- basex-9.7.1/basex-core/src/main/java/org/basex/BaseXGUI.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/BaseXGUI.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,4 +1,3 @@ - package org.basex; import static org.basex.core.Text.*; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/BaseXServer.java basex-9.7.2/basex-core/src/main/java/org/basex/BaseXServer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/BaseXServer.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/BaseXServer.java 2022-05-14 08:34:33.000000000 +0000 @@ -63,7 +63,7 @@ public BaseXServer(final String... args) throws IOException { this(new Context(), args); - // start persistent jobs + // initialize persistent jobs new Jobs(context).init(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/build/Builder.java basex-9.7.2/basex-core/src/main/java/org/basex/build/Builder.java --- basex-9.7.1/basex-core/src/main/java/org/basex/build/Builder.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/build/Builder.java 2022-05-14 08:34:33.000000000 +0000 @@ -55,7 +55,7 @@ private int level; /** Optional path to binary files. */ - private IOFile binDir; + private IOFile binaryDir; /** * Constructor. @@ -88,13 +88,13 @@ } /** - * Sets the path to the raw database files. The path might differ from the actual database path + * Sets the path to the binary database files. The path might differ from the actual database path * if XML data is written to a temporary instance. * @param dir database directory (can be {@code null}) * @return self reference */ public final Builder binaryDir(final IOFile dir) { - if(dir != null) binDir = new IOFile(dir, IO.RAW); + if(dir != null) binaryDir = new IOFile(dir, IO.RAW); return this; } @@ -200,7 +200,7 @@ * @throws IOException I/O exception */ public final void binary(final String target, final IO data) throws IOException { - Store.store(data.inputSource(), new IOFile(binDir, target)); + Store.store(data.inputSource(), new IOFile(binaryDir, target)); } // PROGRESS INFORMATION ========================================================================= diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/build/DirParser.java basex-9.7.2/basex-core/src/main/java/org/basex/build/DirParser.java --- basex-9.7.1/basex-core/src/main/java/org/basex/build/DirParser.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/build/DirParser.java 2022-05-14 08:34:33.000000000 +0000 @@ -37,12 +37,12 @@ private final boolean archives; /** Skip corrupt files in directories. */ private final boolean skipCorrupt; - /** Add ignored files as raw files. */ - private final boolean addRaw; + /** Add ignored files as binary files. */ + private final boolean addBinary; /** DTD parsing. */ private final boolean dtd; - /** Raw parsing. */ - private final boolean rawParser; + /** Binary parsing. */ + private final boolean binaryParser; /** Archive name. */ private final boolean archiveName; @@ -61,7 +61,7 @@ public DirParser(final IO source, final MainOptions options) { super(source, options); - final boolean isDir = source.isDir(); + final boolean isDir = source instanceof IOFile && source.isDir(); if(isDir) { dir = source.path().replaceAll("/$", "") + '/'; original = dir; @@ -72,9 +72,9 @@ skipCorrupt = options.get(MainOptions.SKIPCORRUPT); archives = options.get(MainOptions.ADDARCHIVES); archiveName = options.get(MainOptions.ARCHIVENAME); - addRaw = options.get(MainOptions.ADDRAW); + addBinary = options.get(MainOptions.ADDRAW); dtd = options.get(MainOptions.DTD); - rawParser = options.get(MainOptions.PARSER) == MainParser.RAW; + binaryParser = options.get(MainOptions.PARSER) == MainParser.RAW; filter = !isDir && !source.isArchive() ? null : Pattern.compile(IOFile.regex(options.get(MainOptions.CREATEFILTER))); } @@ -176,8 +176,8 @@ final boolean include = filter == null || filter.matcher(Prop.CASE ? name : name.toLowerCase(Locale.ENGLISH)).matches(); - if(include ? rawParser : addRaw) { - // store input in raw format if raw parser was chosen, or if file was included otherwise + if(include ? binaryParser : addBinary) { + // store input in binary format if binary parser was chosen, or if file was included otherwise builder.binary(targ + name, source); } else if(include) { // store input as XML diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/Cache.java basex-9.7.2/basex-core/src/main/java/org/basex/core/Cache.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/Cache.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/Cache.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,322 @@ +package org.basex.core; + +import java.io.*; +import java.lang.invoke.*; +import java.util.*; +import java.util.regex.*; + +import org.basex.io.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; +import org.basex.query.*; +import org.basex.query.value.*; +import org.basex.query.value.item.*; +import org.basex.query.value.seq.*; +import org.basex.query.value.type.*; +import org.basex.util.*; +import org.basex.util.hash.*; +import org.basex.util.list.*; + +/** + * This class provides a global key/value cache. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class Cache implements Closeable { + /** File pattern. */ + private static final Pattern PATTERN = Pattern.compile("cache-(.*)\\" + IO.BASEXSUFFIX); + + /** Cache entries. */ + private final TokenObjMap map = new TokenObjMap<>(); + /** Database context. */ + private final Context context; + + /** Name of current cache. */ + private String cache = ""; + /** Dirty flag. */ + private boolean dirty = true; + /** Initialization flag. */ + private boolean init; + + /** + * Constructor. + * @param context database context + */ + public Cache(final Context context) { + this.context = context; + } + + /** + * Returns all keys. + * @return keys + */ + public synchronized Value keys() { + init(); + final TokenList list = new TokenList(map.size()); + for(final byte[] key : map) list.add(key); + return StrSeq.get(list); + } + + /** + * Returns a value. + * @param key key + * @return value or empty sequence + */ + public synchronized Value get(final byte[] key) { + init(); + final Value value = map.get(key); + return value != null ? value : Empty.VALUE; + } + + /** + * Stores a value. + * @param key key + * @param value value + */ + public synchronized void put(final byte[] key, final Value value) { + init(); + dirty = true; + if(value == Empty.VALUE) map.remove(key); + else map.put(key, value); + } + + /** + * Removes a value. + * @param key key + */ + public synchronized void remove(final byte[] key) { + init(); + dirty = true; + map.remove(key); + } + + /** + * Clears the map. + */ + public synchronized void clear() { + init = true; + dirty = true; + map.clear(); + } + + /** + * Returns the names of all caches. + * @return keys + */ + public synchronized Value list() { + final TokenList list = new TokenList(); + for(final IOFile file : context.soptions.dbPath().children()) { + final Matcher m = PATTERN.matcher(file.name()); + if(m.matches()) list.add(m.group(1)); + } + return StrSeq.get(list); + } + + /** + * Reads a cache from disk. + * @param name name (empty for standard cache) + * @param qc query context + * @throws IOException I/O exception + * @return success flag (also {@code true} if standard cache is requested and does not exist) + * @throws QueryException query exception + */ + public synchronized boolean read(final String name, final QueryContext qc) + throws IOException, QueryException { + + final IOFile file = file(name); + final boolean exists = file.exists(); + if(!exists && !standard(name)) return false; + + cache = name; + init = true; + dirty = false; + map.clear(); + if(exists) { + try(DataInput in = new DataInput(file)) { + for(int s = in.readNum() - 1; s >= 0; s--) { + map.put(in.readToken(), read(in, qc)); + } + } + } + return true; + } + + /** + * Writes the current cache to disk. + * @param name name (empty for standard cache) + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public synchronized void write(final String name) throws IOException, QueryException { + init(); + cache = name; + dirty = false; + + final IOFile file = file(name); + if(standard(name) && map.isEmpty()) { + // standard cache: delete standard cache if it is empty + file.delete(); + } else { + // write cache to disk + file.parent().md(); + try(DataOutput out = new DataOutput(file)) { + out.writeNum(map.size()); + for(final byte[] key : map) { + out.writeToken(key); + write(out, map.get(key)); + } + } + } + } + + /** + * Deletes a cache on disk. + * @param name name (empty for standard cache) + * @return success flag + */ + public synchronized boolean delete(final String name) { + final IOFile file = file(name); + return file.exists() && file.delete(); + } + + @Override + public synchronized void close() { + // skip write if cache has not been used or cache is not standard cache + try { + if(init && cache.isEmpty() && dirty) write(""); + } catch(final IOException | QueryException ex) { + Util.stack(ex); + } + } + + // PRIVATE FUNCTIONS ============================================================================ + + /** + * Initializes the cache. + */ + private synchronized void init() { + if(init) return; + try(QueryContext qc = new QueryContext(context)) { + read("", qc); + } catch(final IOException | QueryException ex) { + Util.stack(ex); + } + } + + /** + * Reads a file reference for the specified file name. + * @param name name (empty for standard cache) + * @return file + */ + private IOFile file(final String name) { + final TokenBuilder tb = new TokenBuilder(); + tb.add(Util.className(this).toLowerCase(Locale.ENGLISH)); + if(!standard(name)) tb.add('-').add(name); + return context.soptions.dbPath(tb.add(IO.BASEXSUFFIX).toString()); + } + + /** + * Checks if the specified name refers to the standard cache. + * @param name name (empty for standard cache) + * @return result of check + */ + private boolean standard(final String name) { + return name.isEmpty(); + } + + // STATIC FUNCTIONS ============================================================================= + + /** Sequence flag. */ + private static final int SEQUENCE = 0x3f; + /** Class methods. */ + private static final MethodHandle[] METHODS; + /** IDs of data classes. */ + private static final Map, Integer> CLASS_IDS = new HashMap<>(); + + static { + try { + // ORDER MUST NOT BE CHANGED. MAXIMUM: 63 ENTRIES + final Class[] classes = { + BlnSeq.class, BytSeq.class, DblSeq.class, DecSeq.class, FltSeq.class, IntSeq.class, + ShrSeq.class, StrSeq.class, SingletonSeq.class, RangeSeq.class + }; + METHODS = new MethodHandle[classes.length]; + + final MethodHandles.Lookup lookup = MethodHandles.publicLookup(); + final MethodType mt = MethodType.methodType(Value.class, DataInput.class, Type.class, + QueryContext.class); + for(int c = classes.length - 1; c >= 0; c--) { + CLASS_IDS.put(classes[c], c); + METHODS[c] = lookup.findStatic(classes[c], "read", mt); + } + } catch(NoSuchMethodException | IllegalAccessException ex) { + Util.stack(ex); + throw Util.notExpected(ex); + } + } + + /** + * Writes the specified value to an output stream. + * @param out data output + * @param value value to write + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public static synchronized void write(final DataOutput out, final Value value) + throws IOException, QueryException { + out.writeNum(value.seqType().type.id().asByte()); + final long size = value.size(); + out.writeLong(size); + if(size == 1) { + value.write(out); + } else if(size > 1) { + final Integer classId = CLASS_IDS.get(value.getClass()); + if(classId == null) { + out.writeNum(SEQUENCE); + final boolean same = value.sameType(); + out.writeBool(same); + for(final Item item : value) { + if(!same) out.writeNum(item.type.id().asByte()); + item.write(out); + } + } else { + out.writeNum(classId); + value.write(out); + } + } + } + + /** + * Reads a cache from disk. + * @param in input stream + * @param qc query context + * @return value or {@code null} if data could not be read + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public static synchronized Value read(final DataInput in, final QueryContext qc) + throws IOException, QueryException { + qc.checkStop(); + final int id = in.readNum(); + final Type type = Type.ID.getType(id); + final long size = in.readLong(); + if(size == 0) return Empty.VALUE; + if(size == 1) return type.read(in, qc); + final int classId = in.readNum(); + if(classId == SEQUENCE) { + final ValueBuilder vb = new ValueBuilder(qc); + final boolean same = in.readBool(); + for(long s = 0; s < size; s++) { + final Type tp = same ? type : Type.ID.getType(in.readNum()); + vb.add(tp.read(in, qc)); + } + return vb.value(type); + } + try { + return (Value) METHODS[classId].invoke(in, type, qc); + } catch(final Throwable th) { + throw new IOException(th); + } + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/ACreate.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/ACreate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/ACreate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/ACreate.java 2022-05-14 08:34:33.000000000 +0000 @@ -132,12 +132,12 @@ * @author BaseX Team 2005-22, BSD License * @author Christian Gruen */ - abstract static class Code { + interface Code { /** * Runs the update. * @return success flag * @throws IOException I/O exception */ - abstract boolean run() throws IOException; + boolean run() throws IOException; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Add.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Add.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Add.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Add.java 2022-05-14 08:34:33.000000000 +0000 @@ -53,18 +53,15 @@ if(!build()) return false; try { final Data data = context.data(); - return update(data, new Code() { - @Override - boolean run() { - // skip update if fragment is empty - if(tmpData.meta.size > 1) { - context.invalidate(); - final AtomicUpdateCache auc = new AtomicUpdateCache(data); - auc.addInsert(data.meta.size, -1, new DataClip(tmpData)); - auc.execute(false); - } - return info(RES_ADDED_X, jc().performance); + return update(data, () -> { + // skip update if fragment is empty + if(tmpData.meta.size > 1) { + context.invalidate(); + final AtomicUpdateCache auc = new AtomicUpdateCache(data); + auc.addInsert(data.meta.size, -1, new DataClip(tmpData)); + auc.execute(false); } + return info(RES_ADDED_X, jc().performance); }); } finally { finish(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/AQuery.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/AQuery.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/AQuery.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/AQuery.java 2022-05-14 08:34:33.000000000 +0000 @@ -189,9 +189,6 @@ return qp.qc.serParams().toString(); } catch(final QueryException ex) { error(Util.message(ex)); - } finally { - qp = null; - popJob(); } return SerializerMode.DEFAULT.get().toString(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateBackup.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateBackup.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateBackup.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateBackup.java 2022-05-14 08:34:33.000000000 +0000 @@ -66,7 +66,7 @@ ok = false; } else { try { - backup(db, comment, soptions, this); + backup(db, comment, true, soptions, this); // backup was successful info(DB_BACKUP_X, db, jc().performance); } catch(final IOException ex) { @@ -83,12 +83,13 @@ * Backups the specified database. * @param db name of the database * @param comment comment (can be {@code null}) + * @param compress compress flag * @param sopts static options * @param cmd calling command instance * @throws IOException I/O Exception */ - public static void backup(final String db, final String comment, final StaticOptions sopts, - final CreateBackup cmd) throws IOException { + public static void backup(final String db, final String comment, final boolean compress, + final StaticOptions sopts, final CreateBackup cmd) throws IOException { final IOFile dbpath = sopts.dbPath(db); final StringList files = dbpath.descendants(); @@ -100,8 +101,8 @@ if(comment != null) { out.setComment(comment.length() > 100 ? comment.substring(0, 100) + DOTS : comment); } - // use simple, fast compression - out.setLevel(1); + // use simple, fast compression or no compression at all + out.setLevel(compress ? 1 : 0); final byte[] data = new byte[IO.BLOCKSIZE]; for(final String file : files) { // skip update file (generated when using XQuery) diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateDB.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateDB.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateDB.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateDB.java 2022-05-14 08:34:33.000000000 +0000 @@ -111,12 +111,9 @@ data = context.data(); } - if(!update(data, new Code() { - @Override - boolean run() throws IOException { - CreateIndex.create(data, CreateDB.this); - return info(parser.info() + DB_CREATED_X_X, name, jc().performance); - } + if(!update(data, () -> { + CreateIndex.create(data, CreateDB.this); + return info(parser.info() + DB_CREATED_X_X, name, jc().performance); })) return false; if(options.get(MainOptions.CREATEONLY)) Close.close(context); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateIndex.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateIndex.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/CreateIndex.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/CreateIndex.java 2022-05-14 08:34:33.000000000 +0000 @@ -61,12 +61,9 @@ data.meta.names(type, options); data.meta.splitsize = options.get(MainOptions.SPLITSIZE); - return update(data, new Code() { - @Override - boolean run() throws IOException { - create(type, data, CreateIndex.this); - return info(INDEX_CREATED_X_X, type, jc().performance); - } + return update(data, () -> { + create(type, data, CreateIndex.this); + return info(INDEX_CREATED_X_X, type, jc().performance); }); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Delete.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Delete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Delete.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Delete.java 2022-05-14 08:34:33.000000000 +0000 @@ -27,27 +27,22 @@ protected boolean run() { final Data data = context.data(); final String target = args[0]; - return update(data, new Code() { - @Override - boolean run() { - // delete XML documents - final IntList docs = data.resources.docs(target); - final AtomicUpdateCache auc = new AtomicUpdateCache(data); - int size = docs.size(); - for(int d = 0; d < size; d++) auc.addDelete(docs.get(d)); - auc.execute(false); - context.invalidate(); + return update(data, () -> { + // delete XML documents + final IntList docs = data.resources.docs(target); + final AtomicUpdateCache auc = new AtomicUpdateCache(data); + int size = docs.size(); + for(int d = 0; d < size; d++) auc.addDelete(docs.get(d)); + auc.execute(false); + context.invalidate(); - // delete binaries - if(!data.inMemory()) { - final IOFile path = data.meta.binary(target); - if(path.exists()) { - size += path.isDir() ? path.descendants().size() : 1; - path.delete(); - } - } - return info(RES_DELETED_X_X, size, jc().performance); + // delete binary resources + final IOFile bin = data.meta.binary(target); + if(bin != null && bin.exists()) { + size += bin.isDir() ? bin.descendants().size() : 1; + bin.delete(); } + return info(RES_DELETED_X_X, size, jc().performance); }); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/DropIndex.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/DropIndex.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/DropIndex.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/DropIndex.java 2022-05-14 08:34:33.000000000 +0000 @@ -48,12 +48,9 @@ } data.meta.names(type, options); - return update(data, new Code() { - @Override - boolean run() throws IOException { - drop(type, data); - return info(INDEX_DROPPED_X_X, type, jc().performance); - } + return update(data, () -> { + drop(type, data); + return info(INDEX_DROPPED_X_X, type, jc().performance); }); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Export.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Export.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Export.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Export.java 2022-05-14 08:34:33.000000000 +0000 @@ -86,7 +86,7 @@ // XML documents final IntList docs = data.resources.docs(); - // raw files + // binary resources final IOFile source; final StringList files; if(data.inMemory()) { @@ -126,7 +126,7 @@ if(export != null) export.progPos++; } - // export raw files + // export binary resources for(final String file : files) { final IOFile io = new IOFile(root.path(), file); if(export != null) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/InfoDB.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/InfoDB.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/InfoDB.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/InfoDB.java 2022-05-14 08:34:33.000000000 +0000 @@ -50,8 +50,6 @@ info(tb, MetaProp.NAME, meta); info(tb, MetaProp.SIZE.name(), Performance.format(meta.dbSize())); info(tb, MetaProp.NODES, meta); - - // count number of raw files info(tb, MetaProp.DOCUMENTS, meta); info(tb, MetaProp.BINARIES, meta); info(tb, MetaProp.TIMESTAMP, meta); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/JobsList.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/JobsList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/JobsList.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/JobsList.java 2022-05-14 08:34:33.000000000 +0000 @@ -49,8 +49,8 @@ table.header.add(TIME); final JobPool jobs = context.jobs; - for(final byte[] key : ids(context)) { - final TokenList entry = entry(key, jobs, 0); + for(final byte[] id : ids(context)) { + final TokenList entry = entry(id, jobs, 0); if(entry != null) table.contents.add(entry); } out.println(table.sort().finish()); @@ -83,9 +83,9 @@ public static TokenList entry(final byte[] key, final JobPool jobs, final int max) { final String id = string(key); Job job = jobs.active.get(id); - final QueryJobTask jt = jobs.tasks.get(id); final QueryJobResult jr = jobs.results.get(id); if(job == null && jr != null) job = jr.job; + final QueryJobTask jt = jobs.tasks.get(id); if(job == null && jt != null) job = jt.job; if(job == null) return null; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/List.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/List.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/List.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/List.java 2022-05-14 08:34:33.000000000 +0000 @@ -83,7 +83,7 @@ meta.read(); dbsize = meta.dbSize(); file = meta.original; - // add number of raw files + // add number of binary resources count = meta.ndocs + meta.binaryDir().descendants().size(); } catch(final IOException ex) { Util.debug(ex); @@ -134,7 +134,7 @@ table.contents.add(tl); } // add binary resources - for(final byte[] file : resources.binaries(path)) { + for(final byte[] file : resources.binaryPaths(path)) { final String bin = string(file); final TokenList tl = new TokenList(4); tl.add(file); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/OptimizeAll.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/OptimizeAll.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/OptimizeAll.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/OptimizeAll.java 2022-05-14 08:34:33.000000000 +0000 @@ -35,15 +35,12 @@ @Override protected boolean run() { final Data data = context.data(); - if(!update(data, new Code() { - @Override - boolean run() throws IOException { - try { - optimizeAll(data, context, options, OptimizeAll.this); - return true; - } finally { - context.closeDB(); - } + if(!update(data, () -> { + try { + optimizeAll(data, context, options, OptimizeAll.this); + return true; + } finally { + context.closeDB(); } })) return false; @@ -145,9 +142,9 @@ ndata.close(); } - // move binary files - final IOFile bin = ometa.binaryDir(); - if(bin.exists()) bin.rename(nmeta.binaryDir()); + // move binary resources + final IOFile dir = ometa.binaryDir(); + if(dir.exists()) dir.rename(nmeta.binaryDir()); // drop old database, rename temporary database if(!DropDB.drop(name, sopts)) throw new BaseXException(DB_NOT_DROPPED_X, name); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Optimize.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Optimize.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Optimize.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Optimize.java 2022-05-14 08:34:33.000000000 +0000 @@ -38,18 +38,15 @@ final MetaData meta = data.meta; size = meta.size; - return update(data, new Code() { - @Override - boolean run() throws IOException { - // reassign autooptimize flag - final boolean autooptimize = options.get(MainOptions.AUTOOPTIMIZE); - if(autooptimize != data.meta.autooptimize) { - data.meta.autooptimize = autooptimize; - data.meta.dirty = true; - } - optimize(data, Optimize.this); - return info(DB_OPTIMIZED_X, meta.name, jc().performance); + return update(data, () -> { + // reassign autooptimize flag + final boolean autooptimize = options.get(MainOptions.AUTOOPTIMIZE); + if(autooptimize != data.meta.autooptimize) { + data.meta.autooptimize = autooptimize; + data.meta.dirty = true; } + optimize(data, Optimize.this); + return info(DB_OPTIMIZED_X, meta.name, jc().performance); }); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Rename.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Rename.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Rename.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Rename.java 2022-05-14 08:34:33.000000000 +0000 @@ -33,12 +33,7 @@ final String trg = MetaData.normPath(args[1]); if(trg == null) return error(NAME_INVALID_X, args[1]); - return update(data, new Code() { - @Override - boolean run() { - return rename(data, src, trg); - } - }); + return update(data, () -> rename(data, src, trg)); } /** @@ -51,25 +46,28 @@ private boolean rename(final Data data, final String src, final String trg) { boolean ok = true; int c = 0; - final IntList docs = data.resources.docs(src); - final int ds = docs.size(); - for(int i = 0; i < ds; i++) { - final int pre = docs.get(i); - final String target = target(data, pre, src, trg); - if(target.isEmpty()) { - ok = !info(NAME_INVALID_X, target); - } else { - data.update(pre, Data.DOC, token(target)); - c++; + if(!(Prop.CASE ? src.equals(trg) : src.equalsIgnoreCase(trg))) { + final IntList docs = data.resources.docs(src); + final int ds = docs.size(); + for(int i = 0; i < ds; i++) { + final int pre = docs.get(i); + final String target = target(data, pre, src, trg); + if(target.isEmpty()) { + ok = !info(NAME_INVALID_X, target); + } else { + data.update(pre, Data.DOC, token(target)); + c++; + } } - } - final IOFile file = data.inMemory() ? null : data.meta.binary(src); - if(file != null && file.exists()) { - final IOFile target = data.meta.binary(trg); - final IOFile trgdir = target.parent(); - if(!trgdir.md() || !file.rename(target)) ok = !info(NAME_INVALID_X, trg); - c++; + final IOFile source = data.meta.binary(src); + if(source != null && source.exists()) { + final IOFile target = data.meta.binary(trg), trgdir = target.parent(); + if(!trgdir.md() || !source.rename(target)) { + ok = !info(NAME_INVALID_X, trg); + } + c++; + } } // return info message return info(RES_RENAMED_X_X, c, jc().performance) && ok; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Replace.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Replace.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Replace.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Replace.java 2022-05-14 08:34:33.000000000 +0000 @@ -50,15 +50,7 @@ if(path == null) return error(PATH_INVALID_X, args[0]); final Data data = context.data(); - final IOFile bin = data.meta.binary(path); - if(!data.inMemory() && bin == null) return error(PATH_INVALID_X, args[0]); - - return update(data, new Code() { - @Override - boolean run() { - return replace(data, bin, path); - } - }); + return update(data, () -> replace(data, data.meta.binary(path), path)); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Retrieve.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Retrieve.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Retrieve.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Retrieve.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,7 +34,7 @@ if(data.inMemory()) return error(NO_MAINMEM); final IOFile bin = data.meta.binary(path); - if(bin == null || !bin.exists() || bin.isDir()) return error(RES_NOT_FOUND_X, path); + if(!bin.exists() || bin.isDir()) return error(RES_NOT_FOUND_X, path); try(BufferInput bi = BufferInput.get(bin)) { for(int b; (b = bi.read()) != -1;) out.write(b); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Store.java basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Store.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/cmd/Store.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/cmd/Store.java 2022-05-14 08:34:33.000000000 +0000 @@ -57,17 +57,12 @@ // ensure that the name is not empty and contains no trailing dots final Data data = context.data(); if(data.inMemory()) return error(NO_MAINMEM); + if(path.isEmpty()) return error(PATH_INVALID_X, create ? path : args[0]); - final IOFile file = data.meta.binary(path); - if(path.isEmpty() || Strings.endsWith(path, '.') || file == null) - return error(PATH_INVALID_X, create ? path : args[0]); - - return update(data, new Code() { - @Override - boolean run() throws IOException { - store(in, file); - return info(QUERY_EXECUTED_X_X, "", jc().performance); - } + final IOFile bin = data.meta.binary(path); + return update(data, () -> { + store(in, bin); + return info(QUERY_EXECUTED_X_X, "", jc().performance); }); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/Context.java basex-9.7.2/basex-core/src/main/java/org/basex/core/Context.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/Context.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/Context.java 2022-05-14 08:34:33.000000000 +0000 @@ -45,6 +45,8 @@ public final Log log; /** Locking. */ public final Locking locking; + /** Blocked clients. */ + public final Cache cache; /** External objects (HTTP context, HTTP requests). */ private final HashSet external; @@ -111,6 +113,7 @@ repo = ctx.repo; log = ctx.log; jobs = ctx.jobs; + cache = ctx.cache; external = new HashSet<>(ctx.external); } @@ -132,6 +135,7 @@ user = users.get(UserText.ADMIN); jobs = new JobPool(soptions); external = new HashSet<>(); + cache = new Cache(this); client = null; } @@ -159,6 +163,7 @@ public synchronized void close() { if(closed) return; closed = true; + cache.close(); jobs.close(); sessions.close(); datas.close(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/jobs/QueryJob.java basex-9.7.2/basex-core/src/main/java/org/basex/core/jobs/QueryJob.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/jobs/QueryJob.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/jobs/QueryJob.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,7 @@ import static org.basex.query.QueryError.*; import static org.basex.util.Token.*; +import java.util.*; import java.util.Map.*; import java.util.function.*; @@ -129,6 +130,14 @@ } /** + * Returns the bindings for a query. + * @return bindings + */ + public HashMap bindings() { + return job.bindings; + } + + /** * Returns a delay. * @param start start (integer, dayTimeDuration, dateTime, time) * @param min minimum time @@ -203,8 +212,8 @@ register(ctx); if(remove) ctx.jobs.tasks.remove(id); - // retrieve result - result.value = qp.value().materialize(qp.qc, BASEX_FUNCTION_X, null); + // retrieve result; copy persistent database nodes + result.value = qp.value().materialize(d -> d == null || d.inMemory(), null, qp.qc); } catch(final JobException ex) { // query was interrupted: remove cached result diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/MainOptions.java basex-9.7.2/basex-core/src/main/java/org/basex/core/MainOptions.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/MainOptions.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/MainOptions.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,7 +34,7 @@ public static final BooleanOption ARCHIVENAME = new BooleanOption("ARCHIVENAME", false); /** Flag for skipping corrupt files. */ public static final BooleanOption SKIPCORRUPT = new BooleanOption("SKIPCORRUPT", false); - /** Flag for adding remaining files as raw files. */ + /** Flag for adding remaining files as binary files. */ public static final BooleanOption ADDRAW = new BooleanOption("ADDRAW", false); /** Define CSV parser options. */ public static final OptionsOption CSVPARSER = diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/Text.java basex-9.7.2/basex-core/src/main/java/org/basex/core/Text.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/Text.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/Text.java 2022-05-14 08:34:33.000000000 +0000 @@ -1137,8 +1137,8 @@ String PARSE_ARCHIVES = lang("parse_archives"); /** Include name of archive in database path. */ String ADD_ARCHIVE_NAME = lang("add_archive_name"); - /** Add remaining files as raw files. */ - String ADD_RAW_FILES = lang("add_raw_files"); + /** Add remaining files as binary files. */ + String ADD_BINARY_FILES = lang("add_binary_files"); /** "Add Resources". */ String ADD_RESOURCES = lang("add_resources"); /** Skip corrupt files. */ diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/users/User.java basex-9.7.2/basex-core/src/main/java/org/basex/core/users/User.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/users/User.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/users/User.java 2022-05-14 08:34:33.000000000 +0000 @@ -96,10 +96,11 @@ /** * Returns user information as XML. * @param qc query context ({@code null} if element will only be created for serialization) + * @param ii input info * @return user element * @throws QueryException query exception */ - public synchronized FElem toXML(final QueryContext qc) throws QueryException { + public synchronized FElem toXML(final QueryContext qc, final InputInfo ii) throws QueryException { final FElem user = new FElem(USER).add(NAME, name).add(PERMISSION, perm.toString()); passwords.forEach((key, value) -> { final FElem pw = new FElem(PASSWORD).add(ALGORITHM, key.toString()); @@ -113,7 +114,7 @@ if(info != null) { if(qc != null) { // create copy of the info node if query context is available - user.add(info.materialize(qc, true)); + user.add(info.materialize(n -> false, ii, qc)); } else { // otherwise, referenced original info node and invalidate parent reference user.add(info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/core/users/Users.java basex-9.7.2/basex-core/src/main/java/org/basex/core/users/Users.java --- basex-9.7.1/basex-core/src/main/java/org/basex/core/users/Users.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/core/users/Users.java 2022-05-14 08:34:33.000000000 +0000 @@ -92,7 +92,7 @@ file.parent().md(); final FElem root = new FElem(USERS); for(final User user : users.values()) { - root.add(user.toXML(null)); + root.add(user.toXML(null, null)); } if(info != null) { root.add(info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/data/MetaData.java basex-9.7.2/basex-core/src/main/java/org/basex/data/MetaData.java --- basex-9.7.1/basex-core/src/main/java/org/basex/data/MetaData.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/data/MetaData.java 2022-05-14 08:34:33.000000000 +0000 @@ -185,19 +185,21 @@ } /** - * Adds a path segment. + * Adds a segment to the path if it is valid. * @param sb string builder * @param list list of segments * @return result flag */ private static boolean addToPath(final StringBuilder sb, final StringList list) { if(sb.length() != 0) { - final String seg = sb.toString(); - if(seg.equals("..")) { + final String segment = sb.toString(); + if(segment.endsWith(".")) { + if(!segment.equals(".")) return false; + } else if(segment.equals("..")) { if(list.isEmpty()) return false; list.remove(list.size() - 1); - } else if(!seg.equals(".")) { - list.add(seg); + } else { + list.add(segment); } sb.setLength(0); } @@ -282,16 +284,17 @@ } /** - * Returns a reference to the specified binary file. + * Returns a reference to the specified binary resource. * @param path internal file path - * @return path, or {@code null} if this is a main-memory database of + * @return path, or {@code null} if this is a main-memory database or * if the resource path cannot be resolved (e.g. because it points to a parent directory). */ public IOFile binary(final String path) { - if(dir == null) return null; - final IOFile bin = binaryDir(); - final IOFile file = new IOFile(bin, path); - return file.path().startsWith(bin.path()) ? file : null; + if(dir != null) { + final IOFile bin = binaryDir(), file = new IOFile(bin, path); + if(file.path().startsWith(bin.path())) return file; + } + return null; } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/dialog/DialogImport.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/dialog/DialogImport.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/dialog/DialogImport.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/dialog/DialogImport.java 2022-05-14 08:34:33.000000000 +0000 @@ -50,8 +50,8 @@ private final BaseXCheckBox archiveName; /** Skip corrupt files. */ private final BaseXCheckBox skipCorrupt; - /** Add remaining files as raw files. */ - private final BaseXCheckBox addRaw; + /** Add remaining files as binary files. */ + private final BaseXCheckBox addBinary; /** Document filter. */ private final BaseXTextField createFilter; @@ -100,7 +100,7 @@ createFilter = new BaseXTextField(dialog, opts.get(MainOptions.CREATEFILTER)); createFilter.setColumns(30); - addRaw = new BaseXCheckBox(dialog, ADD_RAW_FILES, MainOptions.ADDRAW, opts); + addBinary = new BaseXCheckBox(dialog, ADD_BINARY_FILES, MainOptions.ADDRAW, opts); skipCorrupt = new BaseXCheckBox(dialog, SKIP_CORRUPT_FILES, MainOptions.SKIPCORRUPT, opts); addArchives = new BaseXCheckBox(dialog, PARSE_ARCHIVES, MainOptions.ADDARCHIVES, opts); archiveName = new BaseXCheckBox(dialog, ADD_ARCHIVE_NAME, MainOptions.ARCHIVENAME, opts); @@ -112,7 +112,7 @@ p.add(createFilter); add(p); add(Box.createVerticalStrut(8)); - add(addRaw); + add(addBinary); add(skipCorrupt); add(addArchives); add(archiveName); @@ -157,13 +157,13 @@ archiveName.setEnabled(addArchives.isSelected()); final MainParser parser = MainParser.valueOf(parsers.getSelectedItem()); - final boolean raw = parser == MainParser.RAW; - addRaw.setEnabled(multi && !raw && !gui.context.options.get(MainOptions.MAINMEM)); - skipCorrupt.setEnabled(!raw); + final boolean binary = parser == MainParser.RAW; + addBinary.setEnabled(multi && !binary && !gui.context.options.get(MainOptions.MAINMEM)); + skipCorrupt.setEnabled(!binary); if(comp == parsers) { parsing.setType(parser); - if(multi) createFilter.setText(raw ? "*" : "*." + parser); + if(multi) createFilter.setText(binary ? "*" : "*." + parser); } ok &= empty ? in.isEmpty() || io.exists() : !in.isEmpty() && io.exists(); @@ -182,7 +182,7 @@ gui.set(MainOptions.ADDARCHIVES, addArchives.isSelected()); gui.set(MainOptions.ARCHIVENAME, archiveName.isSelected()); gui.set(MainOptions.SKIPCORRUPT, skipCorrupt.isSelected()); - gui.set(MainOptions.ADDRAW, addRaw.isSelected()); + gui.set(MainOptions.ADDRAW, addBinary.isSelected()); input.updateHistory(); parsing.setOptions(); } @@ -254,7 +254,7 @@ if(b == '<') return MainParser.XML; for(int c = 0; b >= 0 && ++c < IO.BLOCKSIZE;) { - // treat as raw data if characters are no ascii + // treat as binary data if characters are no ascii if(b < ' ' && !Token.ws(b) || b >= 128) return MainParser.RAW; b = bi.read(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/dialog/DialogResources.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/dialog/DialogResources.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/dialog/DialogResources.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/dialog/DialogResources.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,8 +17,8 @@ import org.basex.gui.layout.*; /** - * Combination of a JTree and a text field. The tree visualizes the database content including raw - * files and documents. The search field allows to quickly access specific files/documents. + * Combination of a JTree and a text field. The tree visualizes the database contents. + * The search field allows to quickly access specific resources. * * @author BaseX Team 2005-22, BSD License * @author Lukas Kircher @@ -176,7 +176,7 @@ int cmax = ResourceFolder.MAXC; // check if there's a directory - // create a folder if there's either a raw or document folder + // create a folder if there's either a binary or document folder if(data.resources.isDir(filterPath)) { root.add(new ResourceFolder(ResourceFolder.name(filterPath), ResourceFolder.path(filterPath), tree, context)); @@ -225,7 +225,7 @@ } /** - * Custom tree cell renderer to distinguish between raw and xml leaf nodes. + * Custom tree cell renderer to distinguish between resource types. * @author BaseX Team 2005-22, BSD License * @author Lukas Kircher */ @@ -236,7 +236,7 @@ final boolean focus) { super.getTreeCellRendererComponent(tree, val, sel, exp, leaf, row, focus); - if(leaf) setIcon(BaseXImages.text(((ResourceLeaf) val).raw)); + if(leaf) setIcon(BaseXImages.text(((ResourceLeaf) val).binary)); return this; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/BaseXImages.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/BaseXImages.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/BaseXImages.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/BaseXImages.java 2022-05-14 08:34:33.000000000 +0000 @@ -108,11 +108,11 @@ /** * Returns an icon for the specified text. - * @param raw raw/xml text + * @param binary resource type * @return icon */ - public static Icon text(final boolean raw) { - return raw ? RAWTEXT : XMLTEXT; + public static Icon text(final boolean binary) { + return binary ? RAWTEXT : XMLTEXT; } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceFolder.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceFolder.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceFolder.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceFolder.java 2022-05-14 08:34:33.000000000 +0000 @@ -47,7 +47,7 @@ int cmax = MAXC; // add folders final byte[] sub = subfolder(); - final TokenSet set = context.data().resources.children(subfolder(), true); + final TokenSet set = context.data().resources.children(string(sub), true); for(final byte[] f : new TokenList(set).sort(Prop.CASE)) { add(new ResourceFolder(f, sub, tree, context)); if(--cmax == 0) break; @@ -72,7 +72,7 @@ * @return number of remaining nodes that can be added */ public final int addLeaves(final byte[] filter, final int cmax, final ResourceFolder target) { - final TokenBoolMap tbm = context.data().resources.children(subfolder(), false); + final TokenBoolMap tbm = context.data().resources.children(string(subfolder()), false); final List keys = new ArrayList<>(tbm.size()); // get desired leaves, depending on the given filter diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceLeaf.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceLeaf.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceLeaf.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceLeaf.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,15 +3,14 @@ import org.basex.core.*; /** - * JTree node which represents a leaf (which represents either a raw file - * or a document). + * JTree node which represents a leaf. * * @author BaseX Team 2005-22, BSD License * @author Lukas Kircher */ public final class ResourceLeaf extends ResourceNode { - /** Represents raw file (true) or document (false). */ - public final boolean raw; + /** Represents binary resource or document. */ + public final boolean binary; /** This leaf is a dummy node displaying that node listing is abbreviated. */ public final boolean abbr; @@ -19,15 +18,15 @@ * Constructor. * @param name name of content node * @param path node path - * @param raw represented node is raw file + * @param binary represented node is binary * @param abbr abbreviated node listing * @param tree tree reference * @param context database context */ - public ResourceLeaf(final byte[] name, final byte[] path, final boolean raw, final boolean abbr, - final BaseXTree tree, final Context context) { + public ResourceLeaf(final byte[] name, final byte[] path, final boolean binary, + final boolean abbr, final BaseXTree tree, final Context context) { super(name, path, tree, context); - this.raw = raw; + this.binary = binary; this.abbr = abbr; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceNode.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceNode.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/layout/ResourceNode.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/layout/ResourceNode.java 2022-05-14 08:34:33.000000000 +0000 @@ -10,7 +10,7 @@ import org.basex.util.*; /** - * JTree node for representing database content (raw files / documents). + * JTree node for representing database resources. * * @author BaseX Team 2005-22, BSD License * @author Lukas Kircher diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/gui/view/project/ProjectCellRenderer.java basex-9.7.2/basex-core/src/main/java/org/basex/gui/view/project/ProjectCellRenderer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/gui/view/project/ProjectCellRenderer.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/gui/view/project/ProjectCellRenderer.java 2022-05-14 08:34:33.000000000 +0000 @@ -9,7 +9,7 @@ import org.basex.gui.layout.*; /** - * Custom tree cell renderer to distinguish between raw and xml leaf nodes. + * Custom tree cell renderer to distinguish between resource types. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Binaries.java basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Binaries.java --- basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Binaries.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Binaries.java 2022-05-14 08:34:33.000000000 +0000 @@ -11,7 +11,7 @@ import org.basex.util.list.*; /** - * This index organizes binary files in a database. + * This index organizes binary resources in a database. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen @@ -29,38 +29,41 @@ } /** - * Returns the database paths to all binary files that match the specified path. + * Returns the database paths to all binary resources that match the specified path. * All paths are relative to the filesystem. * @param path input path - * @return root nodes + * @return database paths of binary resources */ - synchronized TokenList bins(final String path) { + synchronized TokenList paths(final String path) { final TokenList tl = new TokenList(); - final String np = MetaData.normPath(path); - if(np == null || data.inMemory()) return tl; - - final String exct = Prop.CASE ? np : np.toLowerCase(Locale.ENGLISH); - final String pref = Strings.endsWith(exct, '/') ? exct : exct + '/'; - for(final String f : data.meta.binaryDir().descendants()) { - final String lc = Prop.CASE ? f : f.toLowerCase(Locale.ENGLISH); - if(exct.isEmpty() || lc.equals(exct) || lc.startsWith(pref)) tl.add(f); + final String norm = MetaData.normPath(path); + if(norm != null && !data.inMemory()) { + final IOFile bin = data.meta.binaryDir(), root = new IOFile(bin, norm); + if(root.exists()) { + final String exact = Prop.CASE ? norm : norm.toLowerCase(Locale.ENGLISH); + final String dir = root.isDir() ? ( + exact.isEmpty() || Strings.endsWith(exact, '/') ? exact : exact + '/') : null; + for(final String relative : bin.descendants()) { + final String rel = Prop.CASE ? relative : relative.toLowerCase(Locale.ENGLISH); + if(dir != null ? rel.startsWith(dir) : rel.equals(exact)) tl.add(relative); + } + } } return tl.sort(Prop.CASE); } /** - * Adds the database paths for the binaries of the given path to the given map. + * Adds the paths of binary resources to a map. * @param path path * @param dir returns directories instead of files - * @param tbm map; values will be {@code true} to indicate raw files + * @param tbm map; values will be {@code true} to indicate binary resources */ - synchronized void children(final byte[] path, final boolean dir, final TokenBoolMap tbm) { - if(data.inMemory()) return; - final IOFile file = data.meta.binary(string(path)); - if(file == null) return; - - for(final IOFile f : file.children()) { - if(dir == f.isDir()) tbm.put(token(f.name()), true); + synchronized void children(final String path, final boolean dir, final TokenBoolMap tbm) { + final IOFile bin = data.meta.binary(path); + if(bin != null) { + for(final IOFile child : bin.children()) { + if(dir == child.isDir()) tbm.put(token(child.name()), true); + } } } @@ -70,7 +73,6 @@ * @return result of check */ synchronized boolean isDir(final String path) { - if(data.inMemory()) return false; final IOFile bin = data.meta.binary(path); return bin != null && bin.isDir(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Docs.java basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Docs.java --- basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Docs.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Docs.java 2022-05-14 08:34:33.000000000 +0000 @@ -288,8 +288,8 @@ * @param dir returns directories instead of files * @param tbm map; values will be {@code false} to indicate documents */ - synchronized void children(final byte[] path, final boolean dir, final TokenBoolMap tbm) { - final String pth = MetaData.normPath(string(path)); + synchronized void children(final String path, final boolean dir, final TokenBoolMap tbm) { + final String pth = MetaData.normPath(path); if(pth == null) return; // normalize root path diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Resources.java basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Resources.java --- basex-9.7.1/basex-core/src/main/java/org/basex/index/resource/Resources.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/index/resource/Resources.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,7 @@ import org.basex.util.list.*; /** - *

This index organizes the resources of a database (XML documents and raw files).

+ * This index organizes the resources of a database. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen @@ -116,12 +116,12 @@ } /** - * Returns the database paths to all binary files that start with the specified path. + * Returns the database paths to all binary resources that start with the specified path. * @param path input path - * @return root nodes + * @return database paths of binary resources */ - public synchronized TokenList binaries(final String path) { - return bins.bins(path); + public synchronized TokenList binaryPaths(final String path) { + return bins.paths(path); } /** @@ -137,9 +137,9 @@ * Returns the child resources for the given path. * @param path path * @param dir returns directories - * @return paths; values of documents will be {@code false} + * @return paths with binary flags */ - public synchronized TokenBoolMap children(final byte[] path, final boolean dir) { + public synchronized TokenBoolMap children(final String path, final boolean dir) { final TokenBoolMap tbm = new TokenBoolMap(); docs.children(path, dir, tbm); bins.children(path, dir, tbm); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/io/in/DataInput.java basex-9.7.2/basex-core/src/main/java/org/basex/io/in/DataInput.java --- basex-9.7.1/basex-core/src/main/java/org/basex/io/in/DataInput.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/io/in/DataInput.java 2022-05-14 08:34:33.000000000 +0000 @@ -120,6 +120,16 @@ } /** + * Reads a long value. + * @return read value + * @throws IOException I/O Exception + */ + public long readLong() throws IOException { + final int v = readNum(); + return v == 0x3FFF ? read8() : v; + } + + /** * Reads an array of long values. * @param s array size * @return array of longs diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/io/IO.java basex-9.7.2/basex-core/src/main/java/org/basex/io/IO.java --- basex-9.7.1/basex-core/src/main/java/org/basex/io/IO.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/io/IO.java 2022-05-14 08:34:33.000000000 +0000 @@ -57,7 +57,7 @@ public static final String LOGSUFFIX = ".log"; /** Ignore suffix. */ public static final String IGNORESUFFIX = ".ignore"; - /** Directory for raw files. */ + /** Directory for binary files. */ public static final String RAW = "raw"; /** File prefix. */ public static final String FILEPREF = "file:/"; @@ -168,7 +168,7 @@ * @return result of check */ public boolean isDir() { - return false; + return Strings.endsWith(pth, '/'); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/io/IOUrl.java basex-9.7.2/basex-core/src/main/java/org/basex/io/IOUrl.java --- basex-9.7.1/basex-core/src/main/java/org/basex/io/IOUrl.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/io/IOUrl.java 2022-05-14 08:34:33.000000000 +0000 @@ -94,11 +94,6 @@ return conn; } - @Override - public boolean isDir() { - return Strings.endsWith(pth, '/'); - } - /** * Checks if the specified string is a valid URL. * @param url url string diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/io/out/DataOutput.java basex-9.7.2/basex-core/src/main/java/org/basex/io/out/DataOutput.java --- basex-9.7.1/basex-core/src/main/java/org/basex/io/out/DataOutput.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/io/out/DataOutput.java 2022-05-14 08:34:33.000000000 +0000 @@ -145,8 +145,21 @@ } /** - * Writes long values. - * NOTE: the long values are not compressed! + * Writes a long value. + * @param v value to be written + * @throws IOException I/O exception + */ + public void writeLong(final long v) throws IOException { + if(v < Integer.MIN_VALUE || v >= Integer.MAX_VALUE || v == 0x3FFF) { + writeNum(0x3FFF); + write8(v); + } else { + writeNum((int) v); + } + } + + /** + * Writes long values. The value will not be compressed * @param array array to be written * @throws IOException I/O exception */ diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/io/serial/json/JsonBasicSerializer.java basex-9.7.2/basex-core/src/main/java/org/basex/io/serial/json/JsonBasicSerializer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/io/serial/json/JsonBasicSerializer.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/io/serial/json/JsonBasicSerializer.java 2022-05-14 08:34:33.000000000 +0000 @@ -258,11 +258,11 @@ /** * Returns an unescaped representation of the value. * @param value value to escape - * @return raw token + * @return unescaped token * @throws QueryIOException I/O exception */ private static byte[] unescape(final byte[] value) throws QueryIOException { - final TokenBuilder raw = new TokenBuilder(); + final TokenBuilder tb = new TokenBuilder(); final TokenParser tp = new TokenParser(value); while(tp.more()) { int cp = tp.next(); @@ -279,28 +279,28 @@ throw ESCAPE_JSON_X.getIO(value); cp = (cp << 4) + c - (c >= 0x61 ? 0x57 : c >= 0x41 ? 0x37 : 0x30); } - raw.add(cp); + tb.add(cp); break; case '"': case '\\': case '/': - raw.add(cp); break; + tb.add(cp); break; case 'b': - raw.add('\b'); break; + tb.add('\b'); break; case 'f': - raw.add('\f'); break; + tb.add('\f'); break; case 'n': - raw.add('\n'); break; + tb.add('\n'); break; case 'r': - raw.add('\r'); break; + tb.add('\r'); break; case 't': - raw.add('\t'); break; + tb.add('\t'); break; default: throw ESCAPE_JSON_X.getIO(value); } } else { - raw.add(cp); + tb.add(cp); } } - return raw.finish(); + return tb.finish(); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/Arr.java basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/Arr.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/Arr.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/Arr.java 2022-05-14 08:34:33.000000000 +0000 @@ -75,24 +75,6 @@ } /** - * Inlines an expression (see {@link Expr#inline(InlineContext)}). - * @param ic inlining context - * @param context function for context inlining; yields {@code null} if no inlining is required - * @return resulting expression if something changed, {@code null} otherwise - * @throws QueryException query exception - */ - public Expr inline(final InlineContext ic, final QuerySupplier context) - throws QueryException { - - // inline arguments - final boolean changed = ic.inline(exprs); - // context reference: create new expression with inlined context - final Expr expr = ic.var == null && !(ic.expr instanceof ContextValue) ? context.get() : null; - // new expression exists and/or arguments were inlined: optimize expression - return expr != null ? expr.optimize(ic.cc) : changed ? optimize(ic.cc) : null; - } - - /** * Creates a deep copy of the given array. * @param element type * @param cc compilation context diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/constr/Constr.java basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/constr/Constr.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/constr/Constr.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/constr/Constr.java 2022-05-14 08:34:33.000000000 +0000 @@ -159,7 +159,8 @@ // add text node if(!text.isEmpty()) children.add(new FTxt(text.next())); - children.add(node.materialize(qc, qc.context.options.get(MainOptions.COPYNODE))); + final boolean keep = !qc.context.options.get(MainOptions.COPYNODE); + children.add(node.materialize(n -> keep, info, qc)); } more = false; } else { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/ParseExpr.java basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/ParseExpr.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/ParseExpr.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/ParseExpr.java 2022-05-14 08:34:33.000000000 +0000 @@ -279,6 +279,17 @@ } /** + * Checks if the specified expression yields a string. + * @param expr expression to be evaluated + * @param qc query context + * @return string + * @throws QueryException query exception + */ + protected final String toString(final Expr expr, final QueryContext qc) throws QueryException { + return Token.string(toToken(expr, qc)); + } + + /** * Checks if the specified expression yields a boolean. * @param expr expression to be evaluated * @param qc query context @@ -571,7 +582,7 @@ * @return function item * @throws QueryException query exception */ - protected final FItem toFunc(final Expr expr, final QueryContext qc) throws QueryException { + protected final FItem toFunction(final Expr expr, final QueryContext qc) throws QueryException { return (FItem) checkType(toItem(expr, qc, SeqType.FUNCTION), SeqType.FUNCTION); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/path/NameTest.java basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/path/NameTest.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/path/NameTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/path/NameTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -140,10 +140,22 @@ public Test intersect(final Test test) { if(test instanceof NameTest) { final NameTest nt = (NameTest) test; - return type == nt.type && qname.eq(nt.qname) ? this : null; + if(type == nt.type) { + if(part == nt.part || part == NamePart.FULL) { + if(nt.matches(qname)) return this; + } else if(nt.part == NamePart.FULL) { + return test.intersect(this); + } else { + final boolean lcl = part == NamePart.LOCAL; + final QNm qnm = new QNm(lcl ? local : nt.local, lcl ? nt.qname.uri() : qname.uri()); + return new NameTest(qnm, NamePart.FULL, type, defaultNs); + } + } + } else if(test instanceof KindTest) { + if(type.instanceOf(test.type)) return this; + } else if(test instanceof UnionTest) { + return test.intersect(this); } - if(test instanceof KindTest) return type.instanceOf(test.type) ? this : null; - if(test instanceof UnionTest) return test.intersect(this); // DocTest, InvDocTest return null; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/Preds.java basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/Preds.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/expr/Preds.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/expr/Preds.java 2022-05-14 08:34:33.000000000 +0000 @@ -144,29 +144,14 @@ private void simplify(final Expr pred, final ExprList list, final Expr root, final CompileContext cc) throws QueryException { - // AND expression - if(pred instanceof And && !pred.has(Flag.POS)) { - // E[A and B] -> E[A][B] - cc.info(OPTPRED_X, pred); - for(final Expr expr : pred.args()) { - simplify(expr.seqType().mayBeNumber() ? cc.function(Function.BOOLEAN, info, expr) : expr, - list, root, cc); - } - return; - } - - // comparisons Expr expr = pred; - if(expr instanceof CmpG || expr instanceof CmpV) { - // E[position() = 1] -> E[1] - expr = ((Cmp) expr).optPred(root, cc); - } - // map operator + // comparisons: E[position() = 1] -> E[1] + if(expr instanceof CmpG || expr instanceof CmpV) expr = ((Cmp) expr).optPred(root, cc); + + // map operator: E[. ! ...] -> E[...], E[E ! ...] -> E[...] final SeqType rst = root.seqType(); if(expr instanceof SimpleMap) { - // E[. ! ...] -> E[...] - // E[E ! ...] -> E[...] final SimpleMap map = (SimpleMap) expr; final Expr[] mexprs = map.exprs; final Expr first = mexprs[0], second = mexprs[1]; @@ -176,10 +161,8 @@ } } - // paths + // paths: E[./...] -> E[...], E[E/...] -> E[...] if(expr instanceof Path && rst.type instanceof NodeType) { - // E[./...] -> E[...] - // E[E/...] -> E[...] final Path path = (Path) expr; final Expr first = path.root; if((first instanceof ContextValue || root.equals(first) && root.isSimple() && rst.one()) && @@ -188,8 +171,7 @@ } } - // inline root item (ignore nodes) - // 1[. = 1] -> 1[1 = 1] + // inline root item (ignore nodes): 1[. = 1] -> 1[1 = 1] if(root instanceof Item && !(rst.type instanceof NodeType)) { try { expr = new InlineContext(null, root, cc).inline(expr); @@ -203,10 +185,14 @@ // E[count(nodes)] will not be rewritten expr = expr.simplifyFor(Simplify.PREDICATE, cc); - // rewrite number to positional test + // E[position()] -> E[true()] + if(Function.POSITION.is(expr)) expr = Bln.TRUE; + + // positional tests: E[1] -> E[position() = 1] if(expr instanceof ANum) expr = ItrPos.get(((ANum) expr).dbl(), info); // merge node tests with steps; remove redundant node tests + // child::node()[self:*] -> child::* if(expr instanceof SingleIterPath) { final Step predStep = (Step) ((Path) expr).steps[0]; if(predStep.axis == Axis.SELF && !predStep.mayBePositional() && root instanceof Step && @@ -214,45 +200,50 @@ final Step rootStep = (Step) root; final Test test = rootStep.test.intersect(predStep.test); if(test != null) { - // child::node()[self:*] -> child::* cc.info(OPTMERGE_X, predStep); rootStep.test = test; list.add(predStep.exprs); - return; + expr = Bln.TRUE; } } } - // context value + // context value: E[.] -> E if(expr instanceof ContextValue && rst.type instanceof NodeType) { - // E[.] -> E cc.info(OPTREMOVE_X_X, expr, (Supplier) this::description); - return; + expr = Bln.TRUE; } - // positional tests + // positional tests: + // /.[position() = 1] -> /.[true()] + // $child/..[position() = 2] -> $child/..[false()] if(root instanceof Step && expr instanceof ItrPos) { - // /.[1] -> /.[true()] - // $child/..[2] -> $child/..[false()] final Axis axis = ((Step) root).axis; if(axis == Axis.SELF || axis == Axis.PARENT) expr = Bln.get(((ItrPos) expr).min == 1); } - // positional tests with position() + // positional comparisons: E[position() = last() - 1] -> E[last() - 1] if(expr instanceof Cmp) { final Cmp cmp = (Cmp) expr; final Expr ex = cmp.exprs[1]; final SeqType st = ex.seqType(); if(cmp.positional() && cmp.opV() == OpV.EQ && st.one()) { - // E[position() = last() - 1] -> E[last() - 1] expr = new Cast(cc.sc(), info, ex, SeqType.NUMERIC_O).optimize(cc); } } - // E[position()] -> E - if(Function.POSITION.is(expr)) expr = Bln.TRUE; + // recursive optimization of AND expressions: E[A and [B and C]] -> E[A][B][C] + if(expr instanceof And && !expr.has(Flag.POS)) { + cc.info(OPTPRED_X, expr); + for(final Expr ex : expr.args()) { + final boolean numeric = ex.seqType().mayBeNumber(); + simplify(numeric ? cc.function(Function.BOOLEAN, info, ex) : ex, list, root, cc); + } + expr = Bln.TRUE; + } - list.add(cc.simplify(pred, expr)); + // add predicate to list + if(expr != Bln.TRUE) list.add(cc.simplify(pred, expr)); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminDeleteLogs.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminDeleteLogs.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminDeleteLogs.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminDeleteLogs.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,9 +17,7 @@ public final class AdminDeleteLogs extends AdminFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - - final String name = Token.string(toToken(exprs[0], qc)); + final String name = toString(exprs[0], qc); final LogFile file = qc.context.log.file(name); if(file == null) throw WHICHRES_X.get(info, name); if(file.current()) throw ADMIN_TODAY.get(info, name); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminLogs.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminLogs.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminLogs.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminLogs.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,13 +26,11 @@ public final class AdminLogs extends AdminFn { @Override public Iter iter(final QueryContext qc) throws QueryException { - checkAdmin(qc); return exprs.length == 0 ? list(qc).iter() : logs(qc); } @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); return exprs.length == 0 ? list(qc) : logs(qc).value(qc, this); } @@ -58,7 +56,7 @@ */ private Iter logs(final QueryContext qc) throws QueryException { // return content of single log file - final String name = Token.string(toToken(exprs[0], qc)); + final String name = toString(exprs[0], qc); final boolean merge = exprs.length > 1 && toBoolean(exprs[1], qc); final LinkedList list = logs(name, qc); @@ -81,7 +79,7 @@ if(entries.peekFirst() != entry) continue; entries.removeFirst(); - if(entry.type.equals(LogType.REQUEST.name())) { + if(entry.type != null && entry.type.equals(LogType.REQUEST.name())) { final Iterator iter = entries.iterator(); while(iter.hasNext()) { final LogEntry next = iter.next(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminSessions.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminSessions.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminSessions.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminSessions.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,8 +18,6 @@ public final class AdminSessions extends AdminFn { @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); - final ValueBuilder vb = new ValueBuilder(qc); for(final ClientListener cl : qc.context.sessions) { final Context ctx = cl.context(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminWriteLog.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminWriteLog.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/admin/AdminWriteLog.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/admin/AdminWriteLog.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.admin; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import org.basex.query.*; import org.basex.query.value.item.*; @@ -18,13 +17,11 @@ public final class AdminWriteLog extends AdminFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - - final String msg = string(toToken(exprs[0], qc)); - final String type = exprs.length > 1 ? string(toToken(exprs[1], qc)) : LogType.INFO.toString(); + final String message = toString(exprs[0], qc); + final String type = exprs.length > 1 ? toString(exprs[1], qc) : LogType.INFO.toString(); if(type.matches(".*\\s.*$")) throw ADMIN_TYPE_X.get(info, type); - qc.context.log.write(type, msg, null, qc.context); + qc.context.log.write(type, message, null, qc.context); return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreateFrom.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreateFrom.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreateFrom.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreateFrom.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,8 +24,6 @@ public class ArchiveCreateFrom extends ArchiveCreate { @Override public B64 item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - final IOFile root = new IOFile(toPath(0, qc).toString()); final CreateFromOptions opts = toOptions(1, new CreateFromOptions(), qc); final boolean recursive = opts.get(CreateFromOptions.RECURSIVE); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveCreate.java 2022-05-14 08:34:33.000000000 +0000 @@ -122,7 +122,7 @@ final byte[] mod = el.attribute(LAST_MODIFIED); if(mod != null) { try { - ze.setTime(dateTimeToMs(new Dtm(mod, info), qc)); + ze.setTime(toMilliseconds(new Dtm(mod, info), qc)); } catch(final QueryException qe) { Util.debug(qe); throw ARCHIVE_DESCRIPTOR3_X.get(info, mod); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveDelete.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveDelete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveDelete.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveDelete.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,8 +21,6 @@ public final class ArchiveDelete extends ArchiveFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - final B64 archive = toB64(exprs[0], qc, false); // entries to be deleted final TokenSet names = new TokenSet(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveExtractTo.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveExtractTo.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveExtractTo.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveExtractTo.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,8 +24,6 @@ public class ArchiveExtractTo extends ArchiveFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - final Path path = toPath(0, qc); final B64 archive = toB64(exprs[1], qc, false); final TokenSet hs = entries(2, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveUpdate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveUpdate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/archive/ArchiveUpdate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/archive/ArchiveUpdate.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,8 +20,6 @@ public final class ArchiveUpdate extends ArchiveCreate { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - // entries to be updated final B64 archive = toB64(exprs[0], qc, false); final Map map = toMap(1, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFilter.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFilter.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFilter.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFilter.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ @Override public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryException { final XQArray array = toArray(exprs[0], qc); - final FItem func = checkArity(exprs[1], 1, qc); + final FItem func = toFunction(exprs[1], 1, qc); final ArrayBuilder builder = new ArrayBuilder(); for(final Value value : array.members()) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,7 +21,7 @@ * @return specified position -1 * @throws QueryException query exception */ - final long checkPos(final XQArray array, final long pos, final boolean incl) + final long toPos(final XQArray array, final long pos, final boolean incl) throws QueryException { final long as = array.arraySize() + (incl ? 1 : 0); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldLeft.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldLeft.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldLeft.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldLeft.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ public Value value(final QueryContext qc) throws QueryException { final XQArray array = toArray(exprs[0], qc); Value result = exprs[1].value(qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); for(final Value value : array.members()) result = func.invoke(qc, info, result, value); return result; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldRight.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldRight.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldRight.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayFoldRight.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,7 @@ public Value value(final QueryContext qc) throws QueryException { final XQArray array = toArray(exprs[0], qc); Value result = exprs[1].value(qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); final ListIterator iter = array.iterator(array.arraySize()); while(iter.hasPrevious()) result = func.invoke(qc, info, iter.previous(), result); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayForEach.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayForEach.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayForEach.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayForEach.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ @Override public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryException { final XQArray array = toArray(exprs[0], qc); - final FItem func = checkArity(exprs[1], 1, qc); + final FItem func = toFunction(exprs[1], 1, qc); final ArrayBuilder builder = new ArrayBuilder(); for(final Value value : array.members()) builder.append(func.invoke(qc, info, value)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayForEachPair.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayForEachPair.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayForEachPair.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayForEachPair.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final XQArray array1 = toArray(exprs[0], qc), array2 = toArray(exprs[1], qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); final ArrayBuilder builder = new ArrayBuilder(); final Iterator as = array1.iterator(0), bs = array2.iterator(0); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayInsertBefore.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayInsertBefore.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayInsertBefore.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayInsertBefore.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,7 +17,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final XQArray array = toArray(exprs[0], qc); - final long pos = checkPos(array, toLong(exprs[1], qc), true); + final long pos = toPos(array, toLong(exprs[1], qc), true); final Value value = exprs[2].value(qc); return array.insertBefore(pos, value, qc); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayPut.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayPut.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayPut.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayPut.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,7 +17,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final XQArray array = toArray(exprs[0], qc); - return array.put(checkPos(array, toLong(exprs[1], qc), false), exprs[2].value(qc)); + return array.put(toPos(array, toLong(exprs[1], qc), false), exprs[2].value(qc)); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayRemove.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayRemove.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArrayRemove.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArrayRemove.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,7 @@ // collect positions, sort and remove duplicates final LongList list = new LongList(); final Iter pos = exprs[1].iter(qc); - for(Item item; (item = qc.next(pos)) != null;) list.add(checkPos(array, toLong(item), false)); + for(Item item; (item = qc.next(pos)) != null;) list.add(toPos(array, toLong(item), false)); list.ddo(); // delete entries backwards diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArraySort.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArraySort.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/array/ArraySort.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/array/ArraySort.java 2022-05-14 08:34:33.000000000 +0000 @@ -30,7 +30,7 @@ final byte[] token = toTokenOrNull(exprs[1], qc); if(token != null) coll = Collation.get(token, qc, sc, info, WHICHCOLL_X); } - final FItem key = exprs.length > 2 ? checkArity(exprs[2], 1, qc) : null; + final FItem key = exprs.length > 2 ? toFunction(exprs[2], 1, qc) : null; final ValueList values = new ValueList(array.arraySize()); for(final Value value : array.members()) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheClear.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheClear.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheClear.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheClear.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,19 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheClear extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + cache(qc).clear(); + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheDelete.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheDelete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheDelete.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheDelete.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,22 @@ +package org.basex.query.func.cache; + +import static org.basex.query.QueryError.*; + +import org.basex.query.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheDelete extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + final String name = toName(0, qc); + if(!cache(qc).delete(name)) throw CACHE_NOTFOUND_X.get(info, name); + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheFn.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,45 @@ +package org.basex.query.func.cache; + +import static org.basex.query.QueryError.*; + +import org.basex.core.*; +import org.basex.query.*; +import org.basex.query.func.*; + +/** + * Cache function. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public abstract class CacheFn extends StandardFunc { + /** + * Returns the key argument. + * @param qc query context + * @return key + * @throws QueryException query exception + */ + final byte[] toKey(final QueryContext qc) throws QueryException { + return toToken(exprs[0], qc); + } + + /** + * Checks if the specified expression is a valid user name. + * @param i expression index + * @param qc query context + * @return name + * @throws QueryException query exception + */ + final String toName(final int i, final QueryContext qc) throws QueryException { + return toName(i, CACHE_NAME_X, qc); + } + + /** + * Returns the state map. + * @param qc query context + * @return state map + */ + final Cache cache(final QueryContext qc) { + return qc.context.cache; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheGet.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheGet.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheGet.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheGet.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,18 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheGet extends CacheFn { + @Override + public Value value(final QueryContext qc) throws QueryException { + final byte[] key = toKey(qc); + return cache(qc).get(key); + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheGetOrPut.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheGetOrPut.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheGetOrPut.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheGetOrPut.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,27 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.*; +import org.basex.query.value.item.*; +import org.basex.query.value.seq.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheGetOrPut extends CacheFn { + @Override + public Value value(final QueryContext qc) throws QueryException { + final byte[] key = toKey(qc); + final FItem func = toFunction(exprs[1], 0, false, qc); + + Value value = cache(qc).get(key); + if(value == Empty.VALUE) { + value = func.invoke(qc, info); + cache(qc).put(key, value); + } + return value; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheKeys.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheKeys.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheKeys.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheKeys.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,17 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheKeys extends CacheFn { + @Override + public Value value(final QueryContext qc) throws QueryException { + return cache(qc).keys(); + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheList.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheList.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheList.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,17 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheList extends CacheFn { + @Override + public Value value(final QueryContext qc) throws QueryException { + return cache(qc).list(); + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CachePut.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CachePut.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CachePut.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CachePut.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,23 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CachePut extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + final byte[] key = toKey(qc); + final Value value = exprs[1].value(qc); + + cache(qc).put(key, value.materialize(n -> false, ii, qc)); + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheRead.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheRead.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheRead.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheRead.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,28 @@ +package org.basex.query.func.cache; + +import static org.basex.query.QueryError.*; + +import java.io.*; + +import org.basex.query.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheRead extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + final String name = exprs.length > 0 ? toName(0, qc) : ""; + try { + if(!cache(qc).read(name, qc)) throw CACHE_NOTFOUND_X.get(info, name); + } catch(final IOException ex) { + throw CACHE_IO_X.get(info, ex); + } + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheRemove.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheRemove.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheRemove.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheRemove.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,20 @@ +package org.basex.query.func.cache; + +import org.basex.query.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheRemove extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + final byte[] key = toKey(qc); + cache(qc).remove(key); + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheWrite.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheWrite.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/cache/CacheWrite.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/cache/CacheWrite.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,28 @@ +package org.basex.query.func.cache; + +import static org.basex.query.QueryError.*; + +import java.io.*; + +import org.basex.query.*; +import org.basex.query.value.seq.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CacheWrite extends CacheFn { + @Override + public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { + final String name = exprs.length > 0 ? toName(0, qc) : ""; + try { + cache(qc).write(name); + } catch(final IOException ex) { + throw CACHE_IO_X.get(info, ex); + } + return Empty.VALUE; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientClose.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientClose.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientClose.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientClose.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,6 @@ public final class ClientClose extends ClientFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); try { session(qc, true).close(); return Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientConnect.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientConnect.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientConnect.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientConnect.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,11 +18,9 @@ public final class ClientConnect extends ClientFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - - final String host = Token.string(toToken(exprs[0], qc)); - final String user = Token.string(toToken(exprs[2], qc)); - final String pass = Token.string(toToken(exprs[3], qc)); + final String host = toString(exprs[0], qc); + final String user = toString(exprs[2], qc); + final String pass = toString(exprs[3], qc); final int port = (int) toLong(exprs[1], qc); try { return sessions(qc).add(new ClientSession(host, port, user, pass)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientExecute.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientExecute.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientExecute.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientExecute.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,9 +20,8 @@ public final class ClientExecute extends ClientFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); final ClientSession cs = session(qc, false); - final String cmd = Token.string(toToken(exprs[1], qc)); + final String cmd = toString(exprs[1], qc); try { final ArrayOutput ao = new ArrayOutput(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientInfo.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientInfo.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientInfo.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientInfo.java 2022-05-14 08:34:33.000000000 +0000 @@ -13,7 +13,6 @@ public final class ClientInfo extends ClientFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); return Str.get(session(qc, false).info().replace("\r\n?", "\n").trim()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientQuery.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientQuery.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/client/ClientQuery.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/client/ClientQuery.java 2022-05-14 08:34:33.000000000 +0000 @@ -12,7 +12,6 @@ import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; -import org.basex.util.*; /** * Function implementation. @@ -26,9 +25,8 @@ @Override public Value value(final QueryContext qc) throws QueryException { - checkCreate(qc); final ClientSession cs = session(qc, false); - final String query = Token.string(toToken(exprs[1], qc)); + final String query = toString(exprs[1], qc); final ValueBuilder vb = new ValueBuilder(qc); try(org.basex.api.client.ClientQuery cq = cs.query(query)) { // bind variables and context value @@ -44,7 +42,7 @@ final String value = cq.next(); final Type type = cq.type(); if(type instanceof FuncType) throw CLIENT_FITEM_X.get(info, value); - vb.add(type.castString(value, qc, info)); + vb.add(type.cast(value, qc, info)); } return vb.value(); } catch(final QueryIOException ex) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/convert/ConvertDateTimeToInteger.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/convert/ConvertDateTimeToInteger.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/convert/ConvertDateTimeToInteger.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/convert/ConvertDateTimeToInteger.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,6 +14,6 @@ public final class ConvertDateTimeToInteger extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - return Int.get(dateTimeToMs(exprs[0], qc)); + return Int.get(toMilliseconds(exprs[0], qc)); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoDecrypt.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoDecrypt.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoDecrypt.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoDecrypt.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,9 +15,9 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] data = toBytes(exprs[0], qc); - final String type = Token.string(toToken(exprs[1], qc)); + final String type = toString(exprs[1], qc); final byte[] key = toBytes(exprs[2], qc); - final String algorithm = Token.string(toToken(exprs[3], qc)); + final String algorithm = toString(exprs[3], qc); return new Encryption(info).encryption(data, type, key, algorithm, false); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoEncrypt.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoEncrypt.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoEncrypt.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoEncrypt.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,9 +15,9 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] data = toBytes(exprs[0], qc); - final String type = Token.string(toToken(exprs[1], qc)); + final String type = toString(exprs[1], qc); final byte[] key = toBytes(exprs[2], qc); - final String algorithm = Token.string(toToken(exprs[3], qc)); + final String algorithm = toString(exprs[3], qc); return new Encryption(info).encryption(data, type, key, algorithm, true); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoHmac.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoHmac.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/crypto/CryptoHmac.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/crypto/CryptoHmac.java 2022-05-14 08:34:33.000000000 +0000 @@ -16,8 +16,8 @@ public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] data = toBytes(exprs[0], qc); final byte[] key = toBytes(exprs[1], qc); - final String algorithm = Token.string(toToken(exprs[2], qc)); - final String encoding = exprs.length == 4 ? Token.string(toToken(exprs[3], qc)) : null; + final String algorithm = toString(exprs[2], qc); + final String encoding = exprs.length == 4 ? toString(exprs[3], qc) : null; return new Encryption(info).hmac(data, key, algorithm, encoding); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/csv/CsvDoc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/csv/CsvDoc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/csv/CsvDoc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/csv/CsvDoc.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,6 +15,6 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] uri = toTokenOrNull(exprs[0], qc); - return uri != null ? parse(checkPath(uri), qc) : Empty.VALUE; + return uri != null ? parse(toIO(uri), qc) : Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/CreateBackupOptions.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/CreateBackupOptions.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/CreateBackupOptions.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/CreateBackupOptions.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,16 @@ +package org.basex.query.func.db; + +import org.basex.util.options.*; + +/** + * Options for processing archives. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class CreateBackupOptions extends Options { + /** Recursive parsing. */ + public static final StringOption COMMENT = new StringOption("comment"); + /** Include root directory. */ + public static final BooleanOption COMPRESS = new BooleanOption("compress", true); +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAccess.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAccess.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAccess.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAccess.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,7 +3,6 @@ import static org.basex.query.QueryError.*; import static org.basex.util.Token.*; -import org.basex.core.*; import org.basex.data.*; import org.basex.query.*; import org.basex.query.expr.index.*; @@ -48,17 +47,14 @@ } /** - * Returns the specified expression as database name. - * Throws an exception if the path is invalid. + * Checks if the specified expression is a valid database name. * @param i index of argument * @param qc query context - * @return normalized path + * @return database name * @throws QueryException query exception */ protected final String toName(final int i, final QueryContext qc) throws QueryException { - final String name = string(toToken(exprs[i], qc)); - if(Databases.validName(name)) return name; - throw DB_NAME_X.get(info, name); + return toName(i, DB_NAME_X, qc); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAdd.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAdd.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAdd.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAdd.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,13 +18,13 @@ public final class DbAdd extends DbNew { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); String path = ""; if(exprs.length > 2) { final byte[] token = toTokenOrNull(exprs[2], qc); if(token != null) path = toDbPath(token); } - final NewInput input = checkInput(toNodeOrAtomItem(1, qc), path); + final NewInput input = toNewInput(toNodeOrAtomItem(1, qc), path); final Options opts = toOptions(3, new Options(), qc); qc.updates().add(new DBAdd(data, input, opts, false, qc, info), qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAttribute.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAttribute.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAttribute.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAttribute.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public class DbAttribute extends DbText { @Override public final Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return attribute(data, valueAccess(data, qc), qc, 2); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAttributeRange.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAttributeRange.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbAttributeRange.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbAttributeRange.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class DbAttributeRange extends DbTextRange { @Override public Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return attribute(data, rangeAccess(data, qc), qc, 3); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbBackups.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbBackups.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbBackups.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbBackups.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,8 +34,7 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { - checkCreate(qc); - final String name = exprs.length == 0 ? null : string(toToken(exprs[0], qc)); + final String name = exprs.length == 0 ? null : toString(exprs[0], qc); final Context ctx = qc.context; final StringList backups = name == null ? ctx.databases.backups() : ctx.databases.backups(name); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbContentType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbContentType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbContentType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbContentType.java 2022-05-14 08:34:33.000000000 +0000 @@ -19,17 +19,18 @@ public final class DbContentType extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); - final int pre = data.resources.doc(path); + MediaType type = null; + final int pre = data.resources.doc(path); if(pre != -1) { // check media type; return application/xml if returned string is not of type xml type = MediaType.get(string(data.text(pre, true))); if(!type.isXML()) type = MediaType.APPLICATION_XML; - } else if(!data.inMemory()) { - final IOFile io = data.meta.binary(path); - if(io.exists() && !io.isDir()) type = MediaType.get(path); + } else { + final IOFile bin = data.meta.binary(path); + if(bin != null && bin.exists() && !bin.isDir()) type = MediaType.get(path); } if(type == null) throw WHICHRES_X.get(info, path); return Str.get(type.toString()); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbCreateBackup.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbCreateBackup.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbCreateBackup.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbCreateBackup.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,10 +18,12 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final String name = toName(0, qc); - final String comment = exprs.length > 1 ? Token.string(toToken(exprs[1], qc)) : null; + final CreateBackupOptions opts = toOptions(1, new CreateBackupOptions(), qc); if(!qc.context.soptions.dbExists(name)) throw DB_OPEN1_X.get(info, name); - qc.updates().add(new BackupCreate(name, comment, qc, info), qc); + final String comment = opts.get(CreateBackupOptions.COMMENT); + final boolean compress = opts.get(CreateBackupOptions.COMPRESS); + qc.updates().add(new BackupCreate(name, comment, compress, qc, info), qc); return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbCreate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbCreate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbCreate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbCreate.java 2022-05-14 08:34:33.000000000 +0000 @@ -40,7 +40,7 @@ inputs = new NewInput[(int) is]; for(int i = 0; i < is; i++) { qc.checkStop(); - inputs[i] = checkInput(value.itemAt(i), i < ps ? paths.get(i) : ""); + inputs[i] = toNewInput(value.itemAt(i), i < ps ? paths.get(i) : ""); } } else { inputs = new NewInput[0]; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbDelete.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbDelete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbDelete.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbDelete.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,5 @@ package org.basex.query.func.db; -import static org.basex.query.QueryError.*; - import org.basex.data.*; import org.basex.io.*; import org.basex.query.*; @@ -22,7 +20,7 @@ public final class DbDelete extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); // delete XML resources @@ -32,12 +30,11 @@ for(int d = 0; d < ds; d++) { updates.add(new DeleteNode(docs.get(d), data, info), qc); } - // delete raw resources - if(!data.inMemory()) { - final IOFile bin = data.meta.binary(path); - if(bin == null) throw DB_PATH_X.get(info, path); - updates.add(new DBDelete(data, bin, info), qc); - } + + // delete binary resources + final IOFile bin = data.meta.binary(path); + if(bin != null) updates.add(new DBDelete(data, bin, info), qc); + return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbDir.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbDir.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbDir.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbDir.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,13 +3,14 @@ import static org.basex.query.QueryError.*; import static org.basex.util.Token.*; +import java.util.*; + import org.basex.data.*; import org.basex.io.*; import org.basex.query.*; import org.basex.query.iter.*; import org.basex.query.value.*; import org.basex.util.*; -import org.basex.util.hash.*; import org.basex.util.http.*; import org.basex.util.list.*; @@ -39,7 +40,7 @@ * @throws QueryException query exception */ private Value resources(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); byte[] path = toToken(exprs[1], qc); String root = MetaData.normPath(string(path)); if(root == null) throw DB_PATH_X.get(info, path); @@ -48,33 +49,29 @@ path = token(root); final ValueBuilder vb = new ValueBuilder(qc); - final TokenSet map = new TokenSet(); + final HashSet set = new HashSet<>(); final IntList docs = data.resources.docs(root, false); final int ds = docs.size(); for(int d = 0; d < ds; d++) { - byte[] np = data.text(docs.get(d), true); - np = substring(np, path.length, np.length); - - final int i = indexOf(np, SLASH); + String np = string(data.text(docs.get(d), true)).substring(path.length); + final int i = np.indexOf('/'); final boolean dir = i >= 0; - if(dir) np = substring(np, 0, i); - if(map.contains(np)) continue; - - map.put(np); - vb.add(dir ? dir(np, data.meta.time) : - resource(np, false, MediaType.APPLICATION_XML, data.meta.time, null)); + if(dir) np = np.substring(0, i); + if(set.add(np)) { + vb.add(dir ? dir(np, data.meta.time) : + resource(np, false, MediaType.APPLICATION_XML, data.meta.time, null)); + } } - final IOFile file = data.meta.binary(string(path)); - if(file != null) { - for(final IOFile io : file.children()) { - final byte[] np = token(io.name()); - if(map.contains(np)) continue; - - map.put(np); - vb.add(io.isDir() ? dir(np, io.timeStamp()) : - resource(np, true, MediaType.get(io.path()), io.timeStamp(), io.length())); + final IOFile bin = data.meta.binary(string(path)); + if(bin != null) { + for(final IOFile io : bin.children()) { + final String np = io.name(); + if(set.add(np)) { + vb.add(io.isDir() ? dir(np, io.timeStamp()) : + resource(np, true, MediaType.get(io.path()), io.timeStamp(), io.length())); + } } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbExists.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbExists.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbExists.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbExists.java 2022-05-14 08:34:33.000000000 +0000 @@ -19,16 +19,16 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { try { - final Data data = checkData(qc); + final Data data = toData(qc); if(exprs.length == 1) return Bln.TRUE; - // check if raw file or XML document exists final String path = toDbPath(1, qc); - boolean raw = false; - if(!data.inMemory()) { - final IOFile io = data.meta.binary(path); - raw = io.exists() && !io.isDir(); - } - return Bln.get(raw || data.resources.doc(path) != -1); + + boolean exists = false; + final IOFile bin = data.meta.binary(path); + exists = bin != null && bin.exists() && !bin.isDir(); + + if(!exists) exists = data.resources.doc(path) != -1; + return Bln.get(exists); } catch(final QueryException ex) { if(ex.error() == DB_OPEN2_X) return Bln.FALSE; throw ex; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbExport.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbExport.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbExport.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbExport.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,8 +1,6 @@ package org.basex.query.func.db; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; - import java.io.*; import org.basex.core.cmd.*; @@ -23,9 +21,8 @@ public final class DbExport extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - final Data data = checkData(qc); - final String path = string(toToken(exprs[1], qc)); + final Data data = toData(qc); + final String path = toString(exprs[1], qc); final Item so = exprs.length > 2 ? exprs[2].item(qc, info) : Empty.VALUE; final SerializerOptions sopts = FuncOptions.serializer(so, info); try { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbFlush.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbFlush.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbFlush.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbFlush.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class DbFlush extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - qc.updates().add(new DBFlush(checkData(qc), qc, info), qc); + qc.updates().add(new DBFlush(toData(qc), qc, info), qc); return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbInfo.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbInfo.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbInfo.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbInfo.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return toNode(InfoDB.db(data.meta, false, true), DATABASE); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbIsRaw.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbIsRaw.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbIsRaw.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbIsRaw.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,10 +15,10 @@ public final class DbIsRaw extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); - if(data.inMemory()) return Bln.FALSE; - final IOFile io = data.meta.binary(path); - return Bln.get(io.exists() && !io.isDir()); + + final IOFile bin = data.meta.binary(path); + return Bln.get(bin != null && bin.exists() && !bin.isDir()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbIsXml.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbIsXml.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbIsXml.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbIsXml.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,7 @@ public final class DbIsXml extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); return Bln.get(data.resources.doc(path) != -1); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbListDetails.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbListDetails.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbListDetails.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbListDetails.java 2022-05-14 08:34:33.000000000 +0000 @@ -52,9 +52,9 @@ final MetaData meta = new MetaData(name, ctx.options, ctx.soptions); try { meta.read(); - // count number of raw files - final int bin = meta.binaryDir().descendants().size(); - database.add(RESOURCES, token(meta.ndocs + bin)); + // count number of binary files + final int binary = meta.binaryDir().descendants().size(); + database.add(RESOURCES, token(meta.ndocs + binary)); database.add(MODIFIED_DATE, DateTime.format(new Date(meta.dbTime()))); database.add(SIZE, token(meta.dbSize())); if(ctx.perm(Perm.CREATE, name)) database.add(PATH, meta.original); @@ -74,24 +74,24 @@ * @throws QueryException query exception */ private Iter resources(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = string(exprs.length == 1 ? EMPTY : toToken(exprs[1], qc)); final IntList docs = data.resources.docs(path); - final TokenList bins = data.resources.binaries(path); - final int ds = docs.size(), size = ds + bins.size(); + final TokenList binaries = data.resources.binaryPaths(path); + final int ds = docs.size(), size = ds + binaries.size(); return new BasicIter(size) { @Override public FNode get(final long i) { if(i < ds) { final int pre = docs.get((int) i); - final byte[] pt = data.text(pre, true); + final String pt = string(data.text(pre, true)); final int sz = data.size(pre, Data.DOC); return resource(pt, false, MediaType.APPLICATION_XML, data.meta.time, (long) sz); } if(i < size) { - final byte[] pt = bins.get((int) i - ds); - final IOFile io = data.meta.binary(string(pt)); - return resource(pt, true, MediaType.get(io.path()), io.timeStamp(), io.length()); + final String pt = string(binaries.get((int) i - ds)); + final IOFile bin = data.meta.binary(pt); + return resource(pt, true, MediaType.get(bin.path()), bin.timeStamp(), bin.length()); } return null; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbList.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbList.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbList.java 2022-05-14 08:34:33.000000000 +0000 @@ -75,23 +75,23 @@ * @throws QueryException query exception */ private Iter resources(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = string(exprs.length == 1 ? EMPTY : toToken(exprs[1], qc)); final IntList docs = data.resources.docs(path); - final TokenList bins = data.resources.binaries(path); + final TokenList binaries = data.resources.binaryPaths(path); final int ds = docs.size(); - return new BasicIter(ds + bins.size()) { + return new BasicIter(ds + binaries.size()) { @Override public Str get(final long i) { - return Str.get(i < ds ? data.text(docs.get((int) i), true) : bins.get((int) i - ds)); + return Str.get(i < ds ? data.text(docs.get((int) i), true) : binaries.get((int) i - ds)); } @Override public Value value(final QueryContext q, final Expr expr) throws QueryException { final TokenList tl = new TokenList(Seq.initialCapacity(size)); for(int d = 0; d < ds; d++) tl.add(data.text(docs.get(d), true)); - return StrSeq.get(tl.add(bins)); + return StrSeq.get(tl.add(binaries)); } }; } @@ -107,32 +107,30 @@ } /** - * Creates a directory node. + * Creates a directory element. * @param path path * @param mdate modified date * @return resource node */ - static FNode dir(final byte[] path, final long mdate) { - final FElem dir = new FElem(DIR); - dir.add(path).add(MODIFIED_DATE, DateTime.format(new Date(mdate))); - return dir; + static FElem dir(final String path, final long mdate) { + return new FElem(DIR).add(path).add(MODIFIED_DATE, DateTime.format(new Date(mdate))); } /** - * Creates a resource node. + * Creates a resource element. * @param path path - * @param raw raw flag - * @param type media type + * @param binary binary flag + * @param ct content type * @param mdate modified date * @param size size (can be {@code null}) * @return resource node */ - static FNode resource(final byte[] path, final boolean raw, final MediaType type, + static FElem resource(final String path, final boolean binary, final MediaType ct, final long mdate, final Long size) { final FElem resource = new FElem(RESOURCE).add(path); - resource.add(RAW, token(raw)); - resource.add(CONTENT_TYPE, type.toString()); + resource.add(RAW, token(binary)); + resource.add(CONTENT_TYPE, ct.toString()); resource.add(MODIFIED_DATE, DateTime.format(new Date(mdate))); if(size != null) resource.add(SIZE, token(size)); return resource; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbNew.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbNew.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbNew.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbNew.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,11 +26,11 @@ * @return input container * @throws QueryException query exception */ - final NewInput checkInput(final Item input, final String path) throws QueryException { + final NewInput toNewInput(final Item input, final String path) throws QueryException { final NewInput ni = new NewInput(); if(input instanceof ANode) { - if(Strings.endsWith(path, '.') || Strings.endsWith(path, '/')) throw RESINV_X.get(info, path); + if(Strings.endsWith(path, '/')) throw RESINV_X.get(info, path); // ensure that the final name is not empty final ANode node = (ANode) input; @@ -60,7 +60,6 @@ // add slash to the target if the addressed file is an archive or directory String name = path; - if(Strings.endsWith(name, '.')) throw RESINV_X.get(info, path); if(!Strings.endsWith(name, '/') && (io.isDir() || io.isArchive())) name += "/"; String target = ""; final int s = name.lastIndexOf('/'); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOpenId.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOpenId.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOpenId.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOpenId.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,7 @@ public class DbOpenId extends DbAccess { @Override public final Value value(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final Iter iter = exprs[1].atomIter(qc, info); final IntList list = new IntList(Seq.initialCapacity(iter.size())); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOpen.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOpen.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOpen.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOpen.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class DbOpen extends DbAccess { @Override public Value value(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = exprs.length < 2 ? "" : toDbPath(1, qc); return DBNodeSeq.get(data.resources.docs(path), data, true, path.isEmpty()); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOptimize.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOptimize.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbOptimize.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbOptimize.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,7 +17,7 @@ public final class DbOptimize extends DbNew { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final boolean all = exprs.length > 1 && toBoolean(exprs[1], qc); final Options opts = toOptions(2, new Options(), qc); qc.updates().add(new DBOptimize(data, all, opts, qc, info), qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbProperty.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbProperty.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbProperty.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbProperty.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.db; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import org.basex.data.*; import org.basex.query.*; @@ -17,8 +16,8 @@ public final class DbProperty extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); - final String name = string(toToken(exprs[1], qc)); + final Data data = toData(qc); + final String name = toString(exprs[1], qc); final MetaProp prop = MetaProp.get(name); if(prop == null) throw DB_PROPERTY_X.get(info, name); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbRename.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbRename.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbRename.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbRename.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,26 +24,22 @@ public final class DbRename extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String source = toDbPath(1, qc), target = toDbPath(2, qc); - - // rename XML resources - final Updates updates = qc.updates(); - final IntList docs = data.resources.docs(source); - final int ds = docs.size(); - for(int d = 0; d < ds; d++) { - final int pre = docs.get(d); - final String trg = Rename.target(data, pre, source, target); - if(trg.isEmpty() || Strings.endsWith(trg, '/') || Strings.endsWith(trg, '.')) - throw DB_PATH_X.get(info, trg); - updates.add(new ReplaceValue(pre, data, info, token(trg)), qc); - } - // rename XML resources - if(!data.inMemory()) { - final IOFile src = data.meta.binary(source); - final IOFile trg = data.meta.binary(target); - if(src == null || trg == null) throw DB_PATH_X.get(info, src); - if(!src.eq(trg)) { + if(!(Prop.CASE ? source.equals(target) : source.equalsIgnoreCase(target))) { + // rename XML resources + final Updates updates = qc.updates(); + final IntList docs = data.resources.docs(source); + final int ds = docs.size(); + for(int d = 0; d < ds; d++) { + final int pre = docs.get(d); + final String trg = Rename.target(data, pre, source, target); + if(trg.isEmpty() || Strings.endsWith(trg, '/')) throw DB_PATH_X.get(info, trg); + updates.add(new ReplaceValue(pre, data, info, token(trg)), qc); + } + // rename binary resources + final IOFile src = data.meta.binary(source), trg = data.meta.binary(target); + if(src != null && trg != null) { rename(data, src, trg, qc); updates.add(new DBDelete(data, src, info), qc); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbReplace.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbReplace.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbReplace.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbReplace.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,7 +24,7 @@ public final class DbReplace extends DbNew { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); final Item item = toNodeOrAtomItem(2, qc); final Options opts = toOptions(3, new Options(), qc); @@ -33,18 +33,16 @@ final IntList docs = data.resources.docs(path); int d = 0; - // delete binary resources - final IOFile bin = data.meta.binary(path); - final boolean disk = !data.inMemory(); - if(disk && (bin == null || bin.isDir())) throw DB_TARGET_X.get(info, path); - - if(disk && item instanceof Bin) { + if(item instanceof Bin) { + if(data.inMemory()) throw DB_MAINMEM_X.get(info, data.meta.name); updates.add(new DBStore(data, path, item, info), qc); } else { - if(disk && bin.exists()) { - updates.add(new DBDelete(data, bin, info), qc); + final IOFile bin = data.meta.binary(path); + if(bin != null) { + if(bin.isDir()) throw DB_TARGET_X.get(info, path); + if(bin.exists()) updates.add(new DBDelete(data, bin, info), qc); } - final NewInput input = checkInput(item, path); + final NewInput input = toNewInput(item, path); final Update update = docs.isEmpty() ? new DBAdd(data, input, opts, true, qc, info) : new ReplaceDoc(docs.get(d++), data, input, opts, qc, info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbRetrieve.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbRetrieve.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbRetrieve.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbRetrieve.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,12 +17,12 @@ public final class DbRetrieve extends DbAccess { @Override public B64Lazy item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); if(data.inMemory()) throw DB_MAINMEM_X.get(info, data.meta.name); - final IOFile file = data.meta.binary(path); - if(file == null || !file.exists() || file.isDir()) throw WHICHRES_X.get(info, path); - return new B64Lazy(file, IOERR_X); + final IOFile bin = data.meta.binary(path); + if(!bin.exists() || bin.isDir()) throw WHICHRES_X.get(info, path); + return new B64Lazy(bin, IOERR_X); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbStore.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbStore.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbStore.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbStore.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,7 +3,6 @@ import static org.basex.query.QueryError.*; import org.basex.data.*; -import org.basex.io.*; import org.basex.query.*; import org.basex.query.up.primitives.db.*; import org.basex.query.value.item.*; @@ -19,13 +18,12 @@ public final class DbStore extends DbAccess { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final String path = toDbPath(1, qc); final Item item = toNodeOrAtomItem(2, qc); if(data.inMemory()) throw DB_MAINMEM_X.get(info, data.meta.name); + if(path.isEmpty()) throw RESINV_X.get(info, path); - final IOFile file = data.meta.binary(path); - if(file == null || path.isEmpty()) throw RESINV_X.get(info, path); qc.updates().add(new DBStore(data, path, item, info), qc); return Empty.VALUE; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbText.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbText.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbText.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbText.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,13 +21,13 @@ public class DbText extends DbAccess { @Override public Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return valueAccess(data, qc).iter(qc); } @Override public Value value(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return valueAccess(data, qc).value(qc); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbTextRange.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbTextRange.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/db/DbTextRange.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/db/DbTextRange.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ public class DbTextRange extends DbAccess { @Override public Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); return rangeAccess(data, qc).iter(qc); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchBinary.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchBinary.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchBinary.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchBinary.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,9 +2,7 @@ import static org.basex.query.QueryError.*; -import org.basex.io.*; import org.basex.query.*; -import org.basex.query.func.*; import org.basex.query.value.item.*; import org.basex.util.*; @@ -14,10 +12,9 @@ * @author BaseX Team 2005-22, BSD License * @author Christian Gruen */ -public final class FetchBinary extends StandardFunc { +public final class FetchBinary extends FetchXml { @Override public B64Lazy item(final QueryContext qc, final InputInfo ii) throws QueryException { - final byte[] uri = toToken(exprs[0], qc); - return new B64Lazy(IO.get(Token.string(uri)), FETCH_OPEN_X); + return new B64Lazy(toIO(0, qc), FETCH_OPEN_X); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchContentType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchContentType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchContentType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchContentType.java 2022-05-14 08:34:33.000000000 +0000 @@ -6,7 +6,6 @@ import org.basex.io.*; import org.basex.query.*; -import org.basex.query.func.*; import org.basex.query.value.item.*; import org.basex.util.*; import org.basex.util.http.*; @@ -17,13 +16,11 @@ * @author BaseX Team 2005-22, BSD License * @author Christian Gruen */ -public final class FetchContentType extends StandardFunc { +public final class FetchContentType extends FetchXml { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final byte[] uri = toToken(exprs[0], qc); - final IO io = IO.get(Token.string(uri)); + final IO io = toIO(0, qc); - final String path = io.path(); MediaType mt = null; if(io instanceof IOUrl) { try { @@ -34,10 +31,7 @@ } } else if(io instanceof IOContent) { mt = MediaType.APPLICATION_XML; - } else if(io.exists()) { - mt = MediaType.get(path); } - if(mt == null) throw FETCH_OPEN_X.get(info, new FileNotFoundException(path)); - return Str.get(mt.toString()); + return Str.get((mt == null ? MediaType.get(io.path()) : mt).toString()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchText.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchText.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchText.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchText.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,7 +4,6 @@ import org.basex.io.*; import org.basex.query.*; -import org.basex.query.func.*; import org.basex.query.value.item.*; import org.basex.util.*; @@ -14,12 +13,12 @@ * @author BaseX Team 2005-22, BSD License * @author Christian Gruen */ -public final class FetchText extends StandardFunc { +public final class FetchText extends FetchXml { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final byte[] uri = toToken(exprs[0], qc); + final IO io = toIO(0, qc); final String encoding = toEncodingOrNull(1, FETCH_ENCODING_X, qc); final boolean validate = exprs.length < 3 || !toBoolean(exprs[2], qc); - return new StrLazy(IO.get(Token.string(uri)), encoding, FETCH_OPEN_X, validate); + return new StrLazy(io, encoding, FETCH_OPEN_X, validate); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchXml.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchXml.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fetch/FetchXml.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fetch/FetchXml.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,8 +24,7 @@ public class FetchXml extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final byte[] uri = toToken(exprs[0], qc); - return fetch(IO.get(Token.string(uri)), qc); + return fetch(toIO(0, qc), qc); } /** @@ -37,8 +36,6 @@ */ protected DBNode fetch(final IO io, final QueryContext qc) throws QueryException { final Options opts = toOptions(1, new Options(), qc); - if(!io.exists()) throw FETCH_EXISTS_X.get(info, io); - final DBOptions dbopts = new DBOptions(opts, MainOptions.PARSING, info); final MainOptions mopts = dbopts.assignTo(MainOptions.get()); try { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileCreateTempFile.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileCreateTempFile.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileCreateTempFile.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileCreateTempFile.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.file; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; import java.nio.file.*; @@ -34,8 +33,8 @@ final synchronized Item createTemp(final boolean dir, final QueryContext qc) throws QueryException, IOException { - final String pref = string(toToken(exprs[0], qc)); - final String suf = exprs.length > 1 ? string(toToken(exprs[1], qc)) : ""; + final String pref = toString(exprs[0], qc); + final String suf = exprs.length > 1 ? toString(exprs[1], qc) : ""; final Path root; if(exprs.length > 2) { root = toPath(2, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileDelete.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileDelete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileDelete.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileDelete.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,7 +17,7 @@ @Override public Item item(final QueryContext qc) throws QueryException, IOException { final Path path = toPath(0, qc); - if(optionalBool(1, qc)) { + if(toBoolean(1, qc)) { delete(path, qc); } else { Files.delete(path); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,6 @@ abstract class FileFn extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); try { return item(qc); } catch(final NoSuchFileException ex) { @@ -54,7 +53,7 @@ * @return specified file * @throws QueryException query exception */ - final Path checkParentDir(final Path path) throws QueryException { + final Path toParent(final Path path) throws QueryException { if(Files.isDirectory(path)) throw FILE_IS_DIR_X.get(info, path.toAbsolutePath()); final Path parent = path.getParent(); if(parent != null && !Files.exists(parent)) @@ -69,7 +68,7 @@ * @return boolean value * @throws QueryException query exception */ - final boolean optionalBool(final int i, final QueryContext qc) throws QueryException { + final boolean toBoolean(final int i, final QueryContext qc) throws QueryException { return i < exprs.length && toBoolean(exprs[i], qc); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileList.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileList.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileList.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.file; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; import java.nio.file.*; @@ -25,12 +24,11 @@ public class FileList extends FileFn { @Override public Value value(final QueryContext qc) throws QueryException { - checkCreate(qc); try { final Path dir = toPath(0, qc).toRealPath(); - final boolean recursive = optionalBool(1, qc); + final boolean recursive = toBoolean(1, qc); final Pattern pattern = exprs.length == 3 ? Pattern.compile(IOFile.regex( - string(toToken(exprs[2], qc)), false), Prop.CASE ? 0 : Pattern.CASE_INSENSITIVE) : null; + toString(exprs[2], qc), false), Prop.CASE ? 0 : Pattern.CASE_INSENSITIVE) : null; final TokenList tl = new TokenList(); list(dir, recursive, pattern, tl, dir.getNameCount(), qc); @@ -52,7 +50,6 @@ * @throws QueryException query exception */ Value paths(final boolean recursive, final QueryContext qc) throws QueryException { - checkCreate(qc); try { final TokenList tl = new TokenList(); list(toPath(0, qc), recursive, null, tl, -1, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileReadTextLines.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileReadTextLines.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileReadTextLines.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileReadTextLines.java 2022-05-14 08:34:33.000000000 +0000 @@ -77,7 +77,6 @@ * @throws QueryException query exception */ private NewlineInput input(final QueryContext qc) throws IOException, QueryException { - checkCreate(qc); final Path path = toPath(0, qc); final String encoding = toEncodingOrNull(1, FILE_UNKNOWN_ENCODING_X, qc); final boolean validate = exprs.length < 3 || !toBoolean(exprs[2], qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteBinary.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteBinary.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteBinary.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteBinary.java 2022-05-14 08:34:33.000000000 +0000 @@ -35,7 +35,7 @@ final synchronized void write(final boolean append, final QueryContext qc) throws QueryException, IOException { - final Path path = checkParentDir(toPath(0, qc)); + final Path path = toParent(toPath(0, qc)); if(exprs.length == 2) { // write full file diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWrite.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWrite.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWrite.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWrite.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,7 +34,7 @@ final synchronized void write(final boolean append, final QueryContext qc) throws QueryException, IOException { - final Path path = checkParentDir(toPath(0, qc)); + final Path path = toParent(toPath(0, qc)); final Item opts = exprs.length > 2 ? exprs[2].item(qc, info) : Empty.VALUE; final SerializerOptions sopts = FuncOptions.serializer(opts, info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteText.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteText.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteText.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteText.java 2022-05-14 08:34:33.000000000 +0000 @@ -37,7 +37,7 @@ final synchronized void write(final boolean append, final QueryContext qc) throws QueryException, IOException { - final Path path = checkParentDir(toPath(0, qc)); + final Path path = toParent(toPath(0, qc)); Item text = toItem(exprs[1], qc); if(!(text instanceof AStr)) text = Str.get(toToken(text)); final String encoding = toEncodingOrNull(2, FILE_UNKNOWN_ENCODING_X, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteTextLines.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteTextLines.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/file/FileWriteTextLines.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/file/FileWriteTextLines.java 2022-05-14 08:34:33.000000000 +0000 @@ -41,7 +41,7 @@ final synchronized void write(final boolean append, final QueryContext qc) throws QueryException, IOException { - final Path path = checkParentDir(toPath(0, qc)); + final Path path = toParent(toPath(0, qc)); final String encoding = toEncodingOrNull(2, FILE_UNKNOWN_ENCODING_X, qc); final Charset cs = encoding == null || encoding == Strings.UTF8 ? null : Charset.forName(encoding); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/ContextFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/ContextFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/ContextFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/ContextFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -71,11 +71,15 @@ @Override public final Expr inline(final InlineContext ic) throws QueryException { - return inline(ic, () -> { - if(!contextAccess()) return null; + // try to inline arguments + Expr expr = ic.inline(exprs) ? this : null; + // create new expression with inlined context value + if(ic.var == null && !(ic.expr instanceof ContextValue) && contextAccess()) { + // $v ! string() -> string($v) final Expr[] args = new ExprList(exprs.length + 1).add(exprs).add(ic.copy()).finish(); - return definition.get(ic.cc.sc(), info, args); - }); + expr = definition.get(ic.cc.sc(), info, args); + } + return expr != null ? expr.optimize(ic.cc) : null; } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnApply.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnApply.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnApply.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnApply.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,7 +21,7 @@ public class FnApply extends StandardFunc { @Override public final Value value(final QueryContext qc) throws QueryException { - final FItem func = toFunc(exprs[0], qc); + final FItem func = toFunction(exprs[0], qc); final XQArray array = toArray(exprs[1], qc); final long ar = checkUp(func, this instanceof UpdateApply, sc).arity(), as = array.arraySize(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnCodepointsToString.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnCodepointsToString.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnCodepointsToString.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnCodepointsToString.java 2022-05-14 08:34:33.000000000 +0000 @@ -35,7 +35,7 @@ // handle arbitrary input final TokenBuilder tb = new TokenBuilder(Seq.initialCapacity(size)); for(Item item; (item = qc.next(iter)) != null;) { - tb.add(checkCp(toLong(item), info)); + tb.add(toCodepoint(toLong(item), info)); } return Str.get(tb.finish()); } @@ -59,7 +59,7 @@ * @throws QueryException query exception */ private static Str toStr(final long value, final InputInfo ii) throws QueryException { - return Str.get(Token.cpToken(checkCp(value, ii))); + return Str.get(Token.cpToken(toCodepoint(value, ii))); } /** @@ -69,7 +69,7 @@ * @return codepoint as integer * @throws QueryException query exception */ - private static int checkCp(final long value, final InputInfo ii) throws QueryException { + private static int toCodepoint(final long value, final InputInfo ii) throws QueryException { if(value >= 0 && value <= Integer.MAX_VALUE) { final int cp = (int) value; if(XMLToken.valid(cp)) return cp; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnCount.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnCount.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnCount.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnCount.java 2022-05-14 08:34:33.000000000 +0000 @@ -49,6 +49,9 @@ if(STRING_TO_CODEPOINTS.is(expr) || _UTIL_CHARS.is(expr)) return cc.function(STRING_LENGTH, info, expr.args()); + final Expr embedded = embed(cc, true); + if(embedded != null) return embedded; + return this; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnDefaultLanguage.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnDefaultLanguage.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnDefaultLanguage.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnDefaultLanguage.java 2022-05-14 08:34:33.000000000 +0000 @@ -16,6 +16,6 @@ public final class FnDefaultLanguage extends StandardFunc { @Override public Str item(final QueryContext qc, final InputInfo ii) { - return new Str(Formatter.EN, AtomType.LANGUAGE); + return Str.get(Formatter.EN, AtomType.LANGUAGE); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnEmpty.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnEmpty.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnEmpty.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnEmpty.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,82 +26,87 @@ } @Override - protected void simplifyArgs(final CompileContext cc) throws QueryException { + protected final void simplifyArgs(final CompileContext cc) throws QueryException { exprs[0] = exprs[0].simplifyFor(Simplify.COUNT, cc); } @Override - protected Expr opt(final CompileContext cc) throws QueryException { - return opt(true, cc); - } - - /** - * Evaluates the function. - * @param qc query context - * @return boolean result - * @throws QueryException query exception - */ - final boolean empty(final QueryContext qc) throws QueryException { - final Expr expr = exprs[0]; - return expr.seqType().zeroOrOne() ? - expr.item(qc, info) == Empty.VALUE : - expr.iter(qc).next() == null; - } - - /** - * Optimizes an existence check. - * @param empty empty flag - * @param cc compilation context - * @return boolean result or original expression - * @throws QueryException query exception - */ - final Expr opt(final boolean empty, final CompileContext cc) throws QueryException { + protected final Expr opt(final CompileContext cc) throws QueryException { + final boolean exists = this instanceof FnExists; Expr expr = exprs[0]; final SeqType st = expr.seqType(); // ignore non-deterministic expressions (e.g.: empty(error())) if(!expr.has(Flag.NDT)) { - if(st.zero()) return Bln.get(empty); - if(st.oneOrMore()) return Bln.get(!empty); + if(st.zero()) return Bln.get(!exists); + if(st.oneOrMore()) return Bln.get(exists); } // static integer will always be greater than 1 if(_UTIL_REPLICATE.is(expr) && expr.arg(1) instanceof Int) { - expr = cc.function(empty ? EMPTY : EXISTS, info, expr.arg(0)); + expr = expr.arg(0); } - // rewrite list to union expression: exists((a, b)) -> exists(a | b) if(expr instanceof List && expr.seqType().type instanceof NodeType) { expr = new Union(info, expr.args()).optimize(cc); - return cc.function(empty ? EMPTY : EXISTS, info, expr); } + if(expr != exprs[0]) return cc.function(exists ? EXISTS : EMPTY, info, expr); + // replace optimized expression by boolean function if(expr instanceof Filter) { // rewrite filter: exists($a[text() = 'Ukraine']) -> $a/text() = 'Ukraine' final Filter filter = (Filter) expr; expr = filter.flattenEbv(filter.root, false, cc); } else if(INDEX_OF.is(expr)) { - // rewrite index-of: exists(index-of($texts, 'Ukraine')) -> $texts = 'Ukraine' + // rewrite index-of: exists(index-of($texts, 'Ukraine')) -> $texts = 'Ukraine' final Expr[] args = expr.args(); if(args.length == 2 && args[1].seqType().one() && CmpG.compatible(args[0].seqType(), args[1].seqType(), true)) { expr = new CmpG(args[0], args[1], OpG.EQ, null, sc, info).optimize(cc); } + } else if(STRING_TO_CODEPOINTS.is(expr) || _UTIL_CHARS.is(expr)) { + // exists(string-to-codepoints(...)) -> boolean(string(...)) + expr = cc.function(STRING, info, expr.args()); + } + if(expr != exprs[0]) return cc.function(exists ? BOOLEAN : NOT, info, expr); + + // exists(map:keys(...)) -> map:size(...) > 0 + if(_MAP_KEYS.is(expr)) { + expr = cc.function(_MAP_SIZE, info, expr.args()); + return new CmpG(expr, Int.ZERO, exists ? OpG.NE : OpG.EQ, null, sc, info).optimize(cc); } - return expr != exprs[0] ? cc.function(empty ? NOT : BOOLEAN, info, expr) : this; + + final Expr embedded = embed(cc, true); + if(embedded != null) return embedded; + + return this; } @Override - public Expr mergeEbv(final Expr expr, final boolean or, final CompileContext cc) + public final Expr mergeEbv(final Expr expr, final boolean or, final CompileContext cc) throws QueryException { - if(!or && EMPTY.is(expr)) { + final Function func = this instanceof FnExists ? EXISTS : EMPTY; + if(!or && func.is(expr)) { final Expr args = List.get(cc, info, exprs[0], expr.arg(0)); - return cc.function(EMPTY, info, args); + return cc.function(func, info, args); } if(_UTIL_COUNT_WITHIN.is(expr)) { return expr.mergeEbv(this, or, cc); } return null; } + + /** + * Evaluates the function. + * @param qc query context + * @return boolean result + * @throws QueryException query exception + */ + final boolean empty(final QueryContext qc) throws QueryException { + final Expr expr = exprs[0]; + return expr.seqType().zeroOrOne() ? + expr.item(qc, info) == Empty.VALUE : + expr.iter(qc).next() == null; + } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnEnvironmentVariable.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnEnvironmentVariable.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnEnvironmentVariable.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnEnvironmentVariable.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class FnEnvironmentVariable extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final String env = System.getenv(Token.string(toToken(exprs[0], qc))); - return env != null ? Str.get(env) : Empty.VALUE; + final String value = System.getenv(toString(exprs[0], qc)); + return value != null ? Str.get(value) : Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnError.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnError.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnError.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnError.java 2022-05-14 08:34:33.000000000 +0000 @@ -37,7 +37,7 @@ QNm name = toQNm(exprs[0], qc, true); if(name == null) name = FUNERR1.qname(); - final String msg = al > 1 ? Token.string(toToken(exprs[1], qc)) : FUNERR1.message; + final String msg = al > 1 ? toString(exprs[1], qc) : FUNERR1.message; final Value value = al > 2 ? exprs[2].value(qc) : null; throw new QueryException(info, name, msg).value(value); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnExists.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnExists.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnExists.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnExists.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,11 +1,8 @@ package org.basex.query.func.fn; -import static org.basex.query.func.Function.*; - import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; -import org.basex.query.func.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; import org.basex.util.*; @@ -23,11 +20,6 @@ } @Override - protected Expr opt(final CompileContext cc) throws QueryException { - return opt(false, cc); - } - - @Override public Expr simplifyFor(final Simplify mode, final CompileContext cc) throws QueryException { // if(exists(nodes)) -> if(nodes) if(mode.oneOf(Simplify.EBV, Simplify.PREDICATE)) { @@ -38,18 +30,4 @@ } return this; } - - @Override - public Expr mergeEbv(final Expr expr, final boolean or, final CompileContext cc) - throws QueryException { - - if(or && Function.EXISTS.is(expr)) { - final Expr args = List.get(cc, info, exprs[0], expr.arg(0)); - return cc.function(Function.EXISTS, info, args); - } - if(_UTIL_COUNT_WITHIN.is(expr)) { - return expr.mergeEbv(this, or, cc); - } - return null; - } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFilter.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFilter.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFilter.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFilter.java 2022-05-14 08:34:33.000000000 +0000 @@ -19,7 +19,7 @@ public Value value(final QueryContext qc) throws QueryException { // implementation for dynamic function lookup final Iter iter = exprs[0].iter(qc); - final FItem func = checkArity(exprs[1], 1, qc); + final FItem func = toFunction(exprs[1], 1, qc); final ValueBuilder vb = new ValueBuilder(qc); for(Item item; (item = iter.next()) != null;) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFoldLeft.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFoldLeft.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFoldLeft.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFoldLeft.java 2022-05-14 08:34:33.000000000 +0000 @@ -42,7 +42,7 @@ private Value value(final Iter iter, final Item item, final QueryContext qc) throws QueryException { Value value = exprs[1].value(qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); Item it = item; do { value = func.invoke(qc, info, value, it); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFoldRight.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFoldRight.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFoldRight.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFoldRight.java 2022-05-14 08:34:33.000000000 +0000 @@ -40,7 +40,7 @@ */ private Value value(final Value items, final QueryContext qc) throws QueryException { Value value = exprs[1].value(qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); if(items instanceof TreeSeq) { final ListIterator iter = ((TreeSeq) items).iterator(items.size()); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnForEach.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnForEach.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnForEach.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnForEach.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,7 +26,7 @@ public final Value value(final QueryContext qc) throws QueryException { // implementation for dynamic function lookup final Iter iter = exprs[0].iter(qc); - final FItem func = checkArity(exprs[1], 1, this instanceof UpdateForEach, qc); + final FItem func = toFunction(exprs[1], 1, this instanceof UpdateForEach, qc); final ValueBuilder vb = new ValueBuilder(qc); for(Item item; (item = qc.next(iter)) != null;) vb.add(func.invoke(qc, info, item)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnForEachPair.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnForEachPair.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnForEachPair.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnForEachPair.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,7 @@ @Override public final Iter iter(final QueryContext qc) throws QueryException { final Iter iter1 = exprs[0].iter(qc), iter2 = exprs[1].iter(qc); - final FItem func = checkArity(exprs[2], 2, this instanceof UpdateForEachPair, qc); + final FItem func = toFunction(exprs[2], 2, this instanceof UpdateForEachPair, qc); final long size = func.funcType().declType.one() ? Math.min(iter1.size(), iter2.size()) : -1; return new Iter() { @@ -52,7 +52,7 @@ @Override public final Value value(final QueryContext qc) throws QueryException { final Iter iter1 = exprs[0].iter(qc), iter2 = exprs[1].iter(qc); - final FItem func = checkArity(exprs[2], 2, this instanceof UpdateForEachPair, qc); + final FItem func = toFunction(exprs[2], 2, this instanceof UpdateForEachPair, qc); final ValueBuilder vb = new ValueBuilder(qc); for(Item item1, item2; (item1 = iter1.next()) != null && (item2 = iter2.next()) != null;) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionArity.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionArity.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionArity.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionArity.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,6 +14,6 @@ public final class FnFunctionArity extends StandardFunc { @Override public Int item(final QueryContext qc, final InputInfo ii) throws QueryException { - return Int.get(toFunc(exprs[0], qc).arity()); + return Int.get(toFunction(exprs[0], qc).arity()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionName.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionName.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionName.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnFunctionName.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class FnFunctionName extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final QNm name = toFunc(exprs[0], qc).funcName(); + final QNm name = toFunction(exprs[0], qc).funcName(); return name == null ? Empty.VALUE : name; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnHead.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnHead.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnHead.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnHead.java 2022-05-14 08:34:33.000000000 +0000 @@ -72,6 +72,9 @@ } } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.with(st.oneOrMore() ? Occ.EXACTLY_ONE : Occ.ZERO_OR_ONE)); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnNumber.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnNumber.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnNumber.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnNumber.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,7 +3,6 @@ import static org.basex.query.value.type.AtomType.*; import org.basex.query.*; -import org.basex.query.CompileContext.*; import org.basex.query.expr.*; import org.basex.query.func.*; import org.basex.query.value.item.*; @@ -54,18 +53,6 @@ return this; } - @Override - public Expr simplifyFor(final Simplify mode, final CompileContext cc) throws QueryException { - final Type type = argType(cc); - if(mode == Simplify.NUMBER && type != null && (type.isUntyped() || type == DOUBLE)) { - // number(1) + 2 -> 1 + 2 - if(!contextAccess()) return cc.simplify(this, exprs[0]); - // A[number() = 1] -> A[. = 0] - if(cc.nestedFocus()) return cc.simplify(this, ContextValue.get(cc, info)); - } - return super.simplifyFor(mode, cc); - } - /** * Returns the atomic argument type. * @param cc compilation context diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnPut.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnPut.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnPut.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnPut.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,6 @@ public final class FnPut extends StandardFunc { @Override public Empty item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); final ANode nd = toNode(exprs[0], qc); final byte[] file = toZeroToken(exprs[1], qc); final Item so = exprs.length > 2 ? exprs[2].item(qc, info) : Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnReverse.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnReverse.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnReverse.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnReverse.java 2022-05-14 08:34:33.000000000 +0000 @@ -76,6 +76,8 @@ // reverse sequence if(expr instanceof RangeSeq) return ((RangeSeq) expr).reverse(cc.qc); + // reverse(reverse(E)) -> E + if(REVERSE.is(expr)) return expr.arg(0); // reverse(tail(reverse(E)) -> util:init(E) if(TAIL.is(expr) && REVERSE.is(expr.arg(0))) return cc.function(_UTIL_INIT, info, expr.arg(0).args()); @@ -98,6 +100,9 @@ return List.get(cc, expr.info(), list.finish()); } } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + return adoptType(expr); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnSort.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnSort.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnSort.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnSort.java 2022-05-14 08:34:33.000000000 +0000 @@ -51,7 +51,7 @@ final byte[] token = toTokenOrNull(exprs[1], qc); if(token != null) coll = Collation.get(token, qc, sc, info, WHICHCOLL_X); } - final FItem key = exprs.length > 2 ? checkArity(exprs[2], 1, qc) : null; + final FItem key = exprs.length > 2 ? toFunction(exprs[2], 1, qc) : null; final long size = input.size(); final ValueList values = new ValueList(size); @@ -135,6 +135,11 @@ final SeqType st = expr1.arg(0).seqType(); if(st.zeroOrOne() && st.type.isSortable()) return expr1; } + if(REVERSE.is(expr1) || SORT.is(expr1)) { + final Expr[] args = exprs.clone(); + args[0] = args[0].arg(0); + return cc.function(SORT, info, args); + } if(exprs.length == 3) { exprs[2] = coerceFunc(exprs[2], cc, SeqType.ANY_ATOMIC_TYPE_ZM, st1.with(Occ.EXACTLY_ONE)); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnSubsequence.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnSubsequence.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnSubsequence.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnSubsequence.java 2022-05-14 08:34:33.000000000 +0000 @@ -233,6 +233,9 @@ } } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.union(Occ.ZERO), sz); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnTail.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnTail.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/FnTail.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/FnTail.java 2022-05-14 08:34:33.000000000 +0000 @@ -92,11 +92,15 @@ final Expr[] args = expr.args(); final Expr first = args[0]; if(first.seqType().oneOrMore()) { + // tail((1, 2), 3)) -> tail(1 to 2), 3 args[0] = cc.function(TAIL, info, first); return List.get(cc, info, args); } } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.union(Occ.ZERO), size - 1); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/Ids.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/Ids.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/Ids.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/Ids.java 2022-05-14 08:34:33.000000000 +0000 @@ -37,7 +37,7 @@ */ protected final Value ids(final QueryContext qc, final boolean idref) throws QueryException { final TokenSet idSet = ids(exprs[0].atomIter(qc, info), qc); - final ANode root = checkRoot(toNode(ctxArg(1, qc), qc)); + final ANode root = toRoot(toNode(ctxArg(1, qc), qc)); final ANodeBuilder list = new ANodeBuilder(); if(index(root, idref)) { @@ -109,7 +109,7 @@ * @return root node * @throws QueryException query exception */ - private ANode checkRoot(final ANode node) throws QueryException { + private ANode toRoot(final ANode node) throws QueryException { final ANode root = node.root(); if(root.type != NodeType.DOCUMENT_NODE) throw IDDOC.get(info); return root; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/Parse.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/Parse.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/fn/Parse.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/fn/Parse.java 2022-05-14 08:34:33.000000000 +0000 @@ -36,7 +36,6 @@ final Item unparsedText(final QueryContext qc, final boolean check, final boolean encoding) throws QueryException { - checkCreate(qc); final byte[] path = toTokenOrNull(exprs[0], qc); if(path == null) return check ? Bln.FALSE : Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/ft/FtSearch.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/ft/FtSearch.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/ft/FtSearch.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/ft/FtSearch.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,7 +20,7 @@ public final class FtSearch extends FtAccess { @Override public NodeIter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final Value query = exprs[1].value(qc); final FtIndexOptions opts = toOptions(2, new FtIndexOptions(), qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/ft/FtTokens.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/ft/FtTokens.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/ft/FtTokens.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/ft/FtTokens.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,7 +21,7 @@ public final class FtTokens extends StandardFunc { @Override public Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); byte[] entry = exprs.length < 2 ? Token.EMPTY : toToken(exprs[1], qc); if(entry.length != 0) { final FTLexer lexer = new FTLexer(new FTOpt().assign(data.meta)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/FuncDefinition.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/FuncDefinition.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/FuncDefinition.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/FuncDefinition.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,8 +3,9 @@ import static org.basex.query.QueryText.*; import java.util.*; -import java.util.function.Supplier; +import java.util.function.*; +import org.basex.core.users.*; import org.basex.query.*; import org.basex.query.expr.*; import org.basex.query.util.*; @@ -30,6 +31,8 @@ public final SeqType seqType; /** URI. */ final byte[] uri; + /** Minimum permission. */ + final Perm perm; /** Description. */ private final String desc; @@ -47,9 +50,11 @@ * @param seqType return type * @param flags static function properties * @param uri uri + * @param perm minimum permission */ FuncDefinition(final Supplier supplier, final String desc, - final SeqType[] params, final SeqType seqType, final EnumSet flags, final byte[] uri) { + final SeqType[] params, final SeqType seqType, final EnumSet flags, final byte[] uri, + final Perm perm) { this.supplier = supplier; this.desc = desc; @@ -57,6 +62,7 @@ this.params = params; this.flags = flags; this.uri = uri; + this.perm = perm; minMax = minMax(desc, params); // treat updating expressions as non-deterministic diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/Function.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/Function.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/Function.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/Function.java 2022-05-14 08:34:33.000000000 +0000 @@ -5,12 +5,14 @@ import static org.basex.query.value.type.SeqType.*; import java.util.*; -import java.util.function.Supplier; +import java.util.function.*; +import org.basex.core.users.*; import org.basex.query.func.admin.*; import org.basex.query.func.archive.*; import org.basex.query.func.array.*; import org.basex.query.func.bin.*; +import org.basex.query.func.cache.*; import org.basex.query.func.client.*; import org.basex.query.func.convert.*; import org.basex.query.func.crypto.*; @@ -80,7 +82,7 @@ params(STRING_ZO, STRING_O, STRING_O), ELEMENT_O, flag(CNS)), /** XQuery function. */ APPLY(FnApply::new, "apply(function,args)", - params(FUNCTION_O, ARRAY_O), ITEM_ZM, flag(POS, CTX, NDT, HOF)), + params(FUNCTION_O, ARRAY_O), ITEM_ZM, flag(POS, CTX, NDT, HOF), FN_URI, Perm.ADMIN), /** XQuery function. */ AVAILABLE_ENVIRONMENT_VARIABLES(FnAvailableEnvironmentVariables::new, "available-environment-variables()", @@ -238,7 +240,7 @@ params(FUNCTION_O), INTEGER_O), /** XQuery function. */ FUNCTION_LOOKUP(FnFunctionLookup::new, "function-lookup(name,arity)", - params(QNAME_O, INTEGER_O), FUNCTION_ZO, flag(POS, CTX, NDT, HOF)), + params(QNAME_O, INTEGER_O), FUNCTION_ZO, flag(POS, CTX, NDT, HOF), FN_URI, Perm.ADMIN), /** XQuery function. */ FUNCTION_NAME(FnFunctionName::new, "function-name(function)", params(FUNCTION_O), QNAME_ZO), @@ -286,7 +288,7 @@ params(STRING_ZO), STRING_O), /** XQuery function. */ JSON_DOC(FnJsonDoc::new, "json-doc(uri[,options])", - params(STRING_ZO, MAP_O), ITEM_ZO), + params(STRING_ZO, MAP_O), ITEM_ZO, flag(), FN_URI, Perm.CREATE), /** XQuery function. */ JSON_TO_XML(FnJsonToXml::new, "json-to-xml(string[,options])", params(STRING_ZO, MAP_O), NODE_ZO, flag(CNS)), @@ -391,7 +393,7 @@ params(QNAME_ZO), NCNAME_ZO), /** XQuery function. */ PUT(FnPut::new, "put(node,uri[,params])", - params(NODE_O, STRING_ZO, ITEM_ZO), EMPTY_SEQUENCE_Z, flag(UPD)), + params(NODE_O, STRING_ZO, ITEM_ZO), EMPTY_SEQUENCE_Z, flag(UPD), FN_URI, Perm.CREATE), /** XQuery function. */ QNAME(FnQName::new, "QName(uri,name)", params(STRING_ZO, STRING_O), QNAME_O), @@ -499,13 +501,13 @@ params(ITEM_ZM), ITEM_ZM), /** XQuery function. */ UNPARSED_TEXT(FnUnparsedText::new, "unparsed-text(uri[,encoding])", - params(STRING_ZO, STRING_O), STRING_ZO), + params(STRING_ZO, STRING_O), STRING_ZO, flag(), FN_URI, Perm.CREATE), /** XQuery function. */ UNPARSED_TEXT_AVAILABLE(FnUnparsedTextAvailable::new, "unparsed-text-available(uri[,encoding])", - params(STRING_ZO, STRING_O), BOOLEAN_O), + params(STRING_ZO, STRING_O), BOOLEAN_O, flag(), FN_URI, Perm.CREATE), /** XQuery function. */ UNPARSED_TEXT_LINES(FnUnparsedTextLines::new, "unparsed-text-lines(uri[,encoding])", - params(STRING_ZO, STRING_O), STRING_ZM), + params(STRING_ZO, STRING_O), STRING_ZM, flag(), FN_URI, Perm.CREATE), /** XQuery function. */ UPPER_CASE(FnUpperCase::new, "upper-case(string)", params(STRING_ZO), STRING_O), @@ -690,16 +692,16 @@ /** XQuery function. */ _ADMIN_DELETE_LOGS(AdminDeleteLogs::new, "delete-logs(date)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), ADMIN_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), ADMIN_URI, Perm.ADMIN), /** XQuery function. */ _ADMIN_LOGS(AdminLogs::new, "logs([date[,merge]])", - params(STRING_O, BOOLEAN_O), ELEMENT_ZM, flag(NDT), ADMIN_URI), + params(STRING_O, BOOLEAN_O), ELEMENT_ZM, flag(NDT), ADMIN_URI, Perm.ADMIN), /** XQuery function. */ _ADMIN_SESSIONS(AdminSessions::new, "sessions()", - params(), ELEMENT_ZM, flag(NDT), ADMIN_URI), + params(), ELEMENT_ZM, flag(NDT), ADMIN_URI, Perm.ADMIN), /** XQuery function. */ _ADMIN_WRITE_LOG(AdminWriteLog::new, "write-log(message[,type])", - params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), ADMIN_URI), + params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), ADMIN_URI, Perm.ADMIN), // Archive Module @@ -708,10 +710,10 @@ params(ITEM_ZM, ITEM_ZM, MAP_ZO), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI), /** XQuery function. */ _ARCHIVE_CREATE_FROM(ArchiveCreateFrom::new, "create-from(path[,options[,entries]])", - params(STRING_O, MAP_ZO, ITEM_ZM), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI), + params(STRING_O, MAP_ZO, ITEM_ZM), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI, Perm.CREATE), /** XQuery function. */ _ARCHIVE_DELETE(ArchiveDelete::new, "delete(archive,entries)", - params(BASE64_BINARY_O, ITEM_ZM), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI), + params(BASE64_BINARY_O, ITEM_ZM), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI, Perm.CREATE), /** XQuery function. */ _ARCHIVE_ENTRIES(ArchiveEntries::new, "entries(archive)", params(BASE64_BINARY_O), ELEMENT_ZM, flag(NDT), ARCHIVE_URI), @@ -723,13 +725,15 @@ params(BASE64_BINARY_O, ITEM_ZM, STRING_O), STRING_ZM, flag(NDT), ARCHIVE_URI), /** XQuery function. */ _ARCHIVE_EXTRACT_TO(ArchiveExtractTo::new, "extract-to(path,archive[,entries])", - params(STRING_O, BASE64_BINARY_O, ITEM_ZM), EMPTY_SEQUENCE_Z, flag(NDT), ARCHIVE_URI), + params(STRING_O, BASE64_BINARY_O, ITEM_ZM), + EMPTY_SEQUENCE_Z, flag(NDT), ARCHIVE_URI, Perm.CREATE), /** XQuery function. */ _ARCHIVE_OPTIONS(ArchiveOptions::new, "options(archive)", params(BASE64_BINARY_O), MAP_O, flag(NDT), ARCHIVE_URI), /** XQuery function. */ _ARCHIVE_UPDATE(ArchiveUpdate::new, "update(archive,entries,contents)", - params(BASE64_BINARY_O, ITEM_ZM, ITEM_ZM), BASE64_BINARY_O, flag(NDT), ARCHIVE_URI), + params(BASE64_BINARY_O, ITEM_ZM, ITEM_ZM), + BASE64_BINARY_O, flag(NDT), ARCHIVE_URI, Perm.CREATE), /** XQuery function. */ _ARCHIVE_WRITE(ArchiveWrite::new, "write(path,entries,contents[,options])", params(STRING_O, ITEM_ZM, ITEM_ZM, MAP_ZO), EMPTY_SEQUENCE_Z, flag(NDT), ARCHIVE_URI), @@ -816,23 +820,56 @@ _BIN_XOR(BinXor::new, "xor(binary1,binary2)", params(BASE64_BINARY_ZO, BASE64_BINARY_ZO), BASE64_BINARY_ZO, BIN_URI), + // Cache Module + + /** XQuery function. */ + _CACHE_CLEAR(CacheClear::new, "clear()", + params(), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_DELETE(CacheDelete::new, "delete(name)", + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_GET(CacheGet::new, "get(key)", + params(STRING_O), ITEM_ZM, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_GET_OR_PUT(CacheGetOrPut::new, "get-or-put(key,put)", + params(STRING_O, FuncType.get(ITEM_ZM).seqType()), + ITEM_ZM, flag(HOF, NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_KEYS(CacheKeys::new, "keys()", params(), STRING_ZM, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_LIST(CacheList::new, "list()", params(), STRING_ZM, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_PUT(CachePut::new, "put(key,value)", + params(STRING_O, ITEM_ZM), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_READ(CacheRead::new, "read([name])", + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_REMOVE(CacheRemove::new, "remove(key)", + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + /** XQuery function. */ + _CACHE_WRITE(CacheWrite::new, "write([name])", + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), CACHE_URI, Perm.CREATE), + // Client Module /** XQuery function. */ _CLIENT_CLOSE(ClientClose::new, "close(id)", - params(ANY_URI_O), EMPTY_SEQUENCE_Z, flag(NDT), CLIENT_URI), + params(ANY_URI_O), EMPTY_SEQUENCE_Z, flag(NDT), CLIENT_URI, Perm.CREATE), /** XQuery function. */ _CLIENT_CONNECT(ClientConnect::new, "connect(url,port,user,password)", - params(STRING_O, INTEGER_O, STRING_O, STRING_O), ANY_URI_O, flag(NDT), CLIENT_URI), + params(STRING_O, INTEGER_O, STRING_O, STRING_O), + ANY_URI_O, flag(NDT), CLIENT_URI, Perm.CREATE), /** XQuery function. */ _CLIENT_EXECUTE(ClientExecute::new, "execute(id,command)", - params(ANY_URI_O, STRING_O), STRING_O, flag(NDT), CLIENT_URI), + params(ANY_URI_O, STRING_O), STRING_O, flag(NDT), CLIENT_URI, Perm.CREATE), /** XQuery function. */ _CLIENT_INFO(ClientInfo::new, "info(id)", - params(ANY_URI_O), STRING_O, flag(NDT), CLIENT_URI), + params(ANY_URI_O), STRING_O, flag(NDT), CLIENT_URI, Perm.CREATE), /** XQuery function. */ _CLIENT_QUERY(ClientQuery::new, "query(id,query[,bindings])", - params(ANY_URI_O, STRING_O, MAP_ZO), ITEM_ZM, flag(NDT), CLIENT_URI), + params(ANY_URI_O, STRING_O, MAP_ZO), ITEM_ZM, flag(NDT), CLIENT_URI, Perm.CREATE), // Conversion Module @@ -934,7 +971,7 @@ params(STRING_O, ITEM_O, ITEM_O, STRING_O), ATTRIBUTE_ZM, flag(NDT), DB_URI), /** XQuery function. */ _DB_BACKUPS(DbBackups::new, "backups([database])", - params(ITEM_O), ELEMENT_ZM, flag(NDT), DB_URI), + params(ITEM_O), ELEMENT_ZM, flag(NDT), DB_URI, Perm.CREATE), /** XQuery function. */ _DB_CONTENT_TYPE(DbContentType::new, "content-type(database,path)", params(STRING_O, STRING_O), STRING_O, DB_URI), @@ -964,7 +1001,7 @@ params(STRING_O, STRING_O), BOOLEAN_O, DB_URI), /** XQuery function. */ _DB_EXPORT(DbExport::new, "export(database,path[,param]])", - params(STRING_O, STRING_O, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), DB_URI), + params(STRING_O, STRING_O, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), DB_URI, Perm.CREATE), /** XQuery function. */ _DB_FLUSH(DbFlush::new, "flush(database)", params(ITEM_O), EMPTY_SEQUENCE_Z, flag(UPD), DB_URI), @@ -1063,70 +1100,70 @@ /** XQuery function. */ _FILE_APPEND(FileAppend::new, "append(path,data[,params])", - params(STRING_O, ITEM_ZM, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, ITEM_ZM, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_APPEND_BINARY(FileAppendBinary::new, "append-binary(path,item)", - params(STRING_O, BINARY_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, BINARY_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_APPEND_TEXT(FileAppendText::new, "append-text(path,text[,encoding])", - params(STRING_O, STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_APPEND_TEXT_LINES(FileAppendTextLines::new, "append-text-lines(path,texts[,encoding])", - params(STRING_O, STRING_ZM, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_ZM, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_BASE_DIR(FileBaseDir::new, "base-dir()", - params(), STRING_O, FILE_URI), + params(), STRING_O, flag(), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_CHILDREN(FileChildren::new, "children(path)", - params(STRING_O), STRING_ZM, flag(NDT), FILE_URI), + params(STRING_O), STRING_ZM, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_COPY(FileCopy::new, "copy(source,target)", - params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_CREATE_DIR(FileCreateDir::new, "create-dir(path)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_CREATE_TEMP_DIR(FileCreateTempDir::new, "create-temp-dir(prefix,suffix[,dir])", - params(STRING_O, STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_CREATE_TEMP_FILE(FileCreateTempFile::new, "create-temp-file(prefix,suffix[,dir])", - params(STRING_O, STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_CURRENT_DIR(FileCurrentDir::new, "current-dir()", - params(), STRING_O, FILE_URI), + params(), STRING_O, flag(), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_DELETE(FileDelete::new, "delete(path[,recursive])", - params(STRING_O, BOOLEAN_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, BOOLEAN_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_DESCENDANTS(FileDescendants::new, "descendants(path)", - params(STRING_O), STRING_ZM, flag(NDT), FILE_URI), + params(STRING_O), STRING_ZM, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_DIR_SEPARATOR(FileDirSeparator::new, "dir-separator()", params(), STRING_O, FILE_URI), /** XQuery function. */ _FILE_EXISTS(FileExists::new, "exists(path)", - params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_IS_ABSOLUTE(FileIsAbsolute::new, "is-absolute(path)", - params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_IS_DIR(FileIsDir::new, "is-dir(path)", - params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_IS_FILE(FileIsFile::new, "is-file(path)", - params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_LAST_MODIFIED(FileLastModified::new, "last-modified(path)", - params(STRING_O), DATE_TIME_O, flag(NDT), FILE_URI), + params(STRING_O), DATE_TIME_O, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_LINE_SEPARATOR(FileLineSeparator::new, "line-separator()", params(), STRING_O, FILE_URI), /** XQuery function. */ _FILE_LIST(FileList::new, "list(path[,recursive[,pattern]])", - params(STRING_O, BOOLEAN_O, STRING_O), STRING_ZM, flag(NDT), FILE_URI), + params(STRING_O, BOOLEAN_O, STRING_O), STRING_ZM, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_MOVE(FileMove::new, "move(source,target)", - params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_NAME(FileName::new, "name(path)", params(STRING_O), STRING_O, FILE_URI), @@ -1138,41 +1175,42 @@ params(), STRING_O, FILE_URI), /** XQuery function. */ _FILE_PATH_TO_NATIVE(FilePathToNative::new, "path-to-native(path)", - params(STRING_O), STRING_O, flag(NDT), FILE_URI), + params(STRING_O), STRING_O, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_PATH_TO_URI(FilePathToUri::new, "path-to-uri(path)", params(STRING_O), ANY_URI_O, FILE_URI), /** XQuery function. */ _FILE_READ_BINARY(FileReadBinary::new, "read-binary(path[,offset[,length]])", - params(STRING_O, INTEGER_O, INTEGER_O), BASE64_BINARY_O, flag(NDT), FILE_URI), + params(STRING_O, INTEGER_O, INTEGER_O), BASE64_BINARY_O, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_READ_TEXT(FileReadText::new, "read-text(path[,encoding[,fallback]])", - params(STRING_O, STRING_O, BOOLEAN_O), STRING_O, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, BOOLEAN_O), STRING_O, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_READ_TEXT_LINES(FileReadTextLines::new, "read-text-lines(path[,encoding[,fallback[,offset[,length]]]])", - params(STRING_O, STRING_O, BOOLEAN_O, INTEGER_O, INTEGER_O), STRING_ZM, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, BOOLEAN_O, INTEGER_O, INTEGER_O), + STRING_ZM, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_RESOLVE_PATH(FileResolvePath::new, "resolve-path(path[,base])", - params(STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI), + params(STRING_O, STRING_O), STRING_O, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_SIZE(FileSize::new, "size(path)", - params(STRING_O), INTEGER_O, flag(NDT), FILE_URI), + params(STRING_O), INTEGER_O, flag(NDT), FILE_URI, Perm.CREATE), /** XQuery function. */ _FILE_TEMP_DIR(FileTempDir::new, "temp-dir()", params(), STRING_O, FILE_URI), /** XQuery function. */ _FILE_WRITE(FileWrite::new, "write(path,data[,params])", - params(STRING_O, ITEM_ZM, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, ITEM_ZM, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_WRITE_BINARY(FileWriteBinary::new, "write-binary(path,item[,offset])", - params(STRING_O, BINARY_O, INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, BINARY_O, INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_WRITE_TEXT(FileWriteText::new, "write-text(path,text[,encoding])", - params(STRING_O, STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), /** XQuery function. */ _FILE_WRITE_TEXT_LINES(FileWriteTextLines::new, "write-text-lines(path,texts[,encoding])", - params(STRING_O, STRING_ZM, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI), + params(STRING_O, STRING_ZM, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), FILE_URI, Perm.ADMIN), // Fulltext Module @@ -1277,7 +1315,7 @@ /** XQuery function. */ _HTTP_SEND_REQUEST(HttpSendRequest::new, "send-request(request[,href[,bodies]])", - params(NODE_O, STRING_ZO, ITEM_ZM), ITEM_ZM, flag(NDT), HTTP_URI), + params(NODE_O, STRING_ZO, ITEM_ZM), ITEM_ZM, flag(NDT), HTTP_URI, Perm.CREATE), // Index Module @@ -1304,19 +1342,19 @@ /** XQuery function. */ _INSPECT_CONTEXT(InspectContext::new, "context()", - params(), ELEMENT_O, INSPECT_URI), + params(), ELEMENT_O, flag(HOF), INSPECT_URI, Perm.CREATE), /** XQuery function. */ _INSPECT_FUNCTION(InspectFunction::new, "function(function)", - params(STRING_O), ELEMENT_O, flag(HOF), INSPECT_URI), + params(STRING_O), ELEMENT_O, INSPECT_URI), /** XQuery function. */ _INSPECT_FUNCTION_ANNOTATIONS(InspectFunctionAnnotations::new, "function-annotations(function)", params(FUNCTION_O), MAP_ZO, INSPECT_URI), /** XQuery function. */ _INSPECT_FUNCTIONS(InspectFunctions::new, "functions([uri])", - params(STRING_O), FUNCTION_ZM, flag(HOF), INSPECT_URI), + params(STRING_O), FUNCTION_ZM, flag(HOF), INSPECT_URI, Perm.ADMIN), /** XQuery function. */ _INSPECT_MODULE(InspectModule::new, "module(uri)", - params(STRING_O), ELEMENT_O, INSPECT_URI), + params(STRING_O), ELEMENT_O, flag(NDT), INSPECT_URI, Perm.CREATE), /** XQuery function. */ _INSPECT_TYPE(InspectType::new, "type(value[,options])", params(ITEM_ZM, MAP_O), STRING_O, INSPECT_URI), @@ -1325,40 +1363,40 @@ params(FUNCTION_O, STRING_O), ITEM_ZM, INSPECT_URI), /** XQuery function. */ _INSPECT_XQDOC(InspectXqdoc::new, "xqdoc(uri)", - params(STRING_O), ELEMENT_O, INSPECT_URI), + params(STRING_O), ELEMENT_O, flag(NDT), INSPECT_URI, Perm.CREATE), // Jobs Module /** XQuery function. */ + _JOBS_BINDINGS(JobsBindings::new, "bindings(id)", + params(STRING_O), MAP_O, flag(NDT), JOBS_URI, Perm.ADMIN), + /** XQuery function. */ _JOBS_CURRENT(JobsCurrent::new, "current()", params(), STRING_O, flag(NDT), JOBS_URI), /** XQuery function. */ - _JOBS_EVAL(JobsEval::new, "eval(string[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), STRING_O, flag(NDT), JOBS_URI), + _JOBS_EVAL(JobsEval::new, "eval(input[,bindings[,options]])", + params(STRING_O, MAP_ZO, MAP_ZO), STRING_O, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_FINISHED(JobsFinished::new, "finished(id)", - params(STRING_O), BOOLEAN_O, flag(NDT), JOBS_URI), - /** XQuery function (legacy, now: jobs:eval). */ - _JOBS_INVOKE(JobsInvoke::new, "invoke(uri[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), STRING_O, flag(NDT), JOBS_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_LIST(JobsList::new, "list()", - params(), STRING_ZM, flag(NDT), JOBS_URI), + params(), STRING_ZM, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_LIST_DETAILS(JobsListDetails::new, "list-details([id])", - params(STRING_O), ELEMENT_ZM, flag(NDT), JOBS_URI), + params(STRING_O), ELEMENT_ZM, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_RESULT(JobsResult::new, "result(id)", - params(STRING_O), ITEM_ZM, flag(NDT), JOBS_URI), + params(STRING_O), ITEM_ZM, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_SERVICES(JobsServices::new, "services()", - params(), ELEMENT_ZM, flag(NDT), JOBS_URI), + params(), ELEMENT_ZM, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_STOP(JobsStop::new, "stop(id[,options])", - params(STRING_O, MAP_ZO), EMPTY_SEQUENCE_Z, flag(NDT), JOBS_URI), + params(STRING_O, MAP_ZO), EMPTY_SEQUENCE_Z, flag(NDT), JOBS_URI, Perm.ADMIN), /** XQuery function. */ _JOBS_WAIT(JobsWait::new, "wait(id)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), JOBS_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), JOBS_URI, Perm.ADMIN), // JSON Module @@ -1403,10 +1441,11 @@ /** XQuery function. */ _PROC_EXECUTE(ProcExecute::new, "execute(command[,args[,options]])", - params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), ELEMENT_O, flag(NDT), PROC_URI), + params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), ELEMENT_O, flag(NDT), PROC_URI, Perm.ADMIN), /** XQuery function. */ _PROC_FORK(ProcFork::new, "fork(command[,args[,options]])", - params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), EMPTY_SEQUENCE_Z, flag(NDT), PROC_URI), + params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), + EMPTY_SEQUENCE_Z, flag(NDT), PROC_URI, Perm.ADMIN), /** XQuery function. */ _PROC_PROPERTY(ProcProperty::new, "property(name)", params(STRING_O), STRING_ZO, flag(NDT), PROC_URI), @@ -1415,7 +1454,7 @@ params(), STRING_ZM, flag(NDT), PROC_URI), /** XQuery function. */ _PROC_SYSTEM(ProcSystem::new, "system(command[,args[,options]])", - params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), STRING_O, flag(NDT), PROC_URI), + params(STRING_O, STRING_ZM, ANY_ATOMIC_TYPE_O), STRING_O, flag(NDT), PROC_URI, Perm.ADMIN), // Profiling Module @@ -1487,40 +1526,40 @@ /** XQuery function. */ _REPO_DELETE(RepoDelete::new, "delete(uri)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), REPO_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), REPO_URI, Perm.CREATE), /** XQuery function. */ _REPO_INSTALL(RepoInstall::new, "install(uri)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), REPO_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), REPO_URI, Perm.CREATE), /** XQuery function. */ _REPO_LIST(RepoList::new, "list()", - params(), STRING_ZM, flag(NDT), REPO_URI), + params(), STRING_ZM, flag(NDT), REPO_URI, Perm.CREATE), // SQL Module /** XQuery function. */ _SQL_CLOSE(SqlClose::new, "close(id)", - params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI), + params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_COMMIT(SqlCommit::new, "commit(id)", - params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI), + params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_CONNECT(SqlConnect::new, "connect(url[,user[,pass[,options]]]]])", - params(STRING_O, STRING_O, STRING_O, MAP_ZO), INTEGER_O, flag(NDT), SQL_URI), + params(STRING_O, STRING_O, STRING_O, MAP_ZO), INTEGER_O, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_EXECUTE(SqlExecute::new, "execute(id,query[,options])", - params(INTEGER_O, STRING_O, MAP_ZO), ITEM_ZM, flag(NDT), SQL_URI), + params(INTEGER_O, STRING_O, MAP_ZO), ITEM_ZM, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_EXECUTE_PREPARED(SqlExecutePrepared::new, "execute-prepared(id[,params[,options]])", - params(INTEGER_O, ELEMENT_O, MAP_ZO), ITEM_ZM, flag(NDT), SQL_URI), + params(INTEGER_O, ELEMENT_O, MAP_ZO), ITEM_ZM, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_INIT(SqlInit::new, "init(class)", - params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI), + params(STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_PREPARE(SqlPrepare::new, "prepare(id,statement)", - params(INTEGER_O, STRING_O), INTEGER_O, flag(NDT), SQL_URI), + params(INTEGER_O, STRING_O), INTEGER_O, flag(NDT), SQL_URI, Perm.CREATE), /** XQuery function. */ _SQL_ROLLBACK(SqlRollback::new, "rollback(id)", - params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI), + params(INTEGER_O), EMPTY_SEQUENCE_Z, flag(NDT), SQL_URI, Perm.CREATE), // Strings Module @@ -1550,7 +1589,8 @@ /** XQuery function. */ _UPDATE_APPLY(UpdateApply::new, "apply(function,args)", - params(FUNCTION_O, ARRAY_O), EMPTY_SEQUENCE_Z, flag(POS, CTX, UPD, HOF), UPDATE_URI), + params(FUNCTION_O, ARRAY_O), + EMPTY_SEQUENCE_Z, flag(POS, CTX, UPD, HOF), UPDATE_URI, Perm.ADMIN), /** XQuery function. */ _UPDATE_CACHE(UpdateCache::new, "cache([reset])", params(BOOLEAN_O), ITEM_ZM, flag(NDT), UPDATE_URI), @@ -1574,14 +1614,14 @@ /** XQuery function. */ _USER_ALTER(UserAlter::new, "alter(name,newname)", - params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(UPD), USER_URI), + params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(UPD), USER_URI, Perm.ADMIN), /** XQuery function. */ _USER_CHECK(UserCheck::new, "check(name,password)", params(STRING_O, STRING_O), EMPTY_SEQUENCE_Z, flag(NDT), USER_URI), /** XQuery function. */ _USER_CREATE(UserCreate::new, "create(name,password[,permissions[,patterns[,info]]])", params(STRING_O, STRING_O, STRING_ZM, STRING_ZM, ELEMENT_O), - EMPTY_SEQUENCE_Z, flag(UPD), USER_URI), + EMPTY_SEQUENCE_Z, flag(UPD), USER_URI, Perm.ADMIN), /** XQuery function. */ _USER_CURRENT(UserCurrent::new, "current()", params(), STRING_O, USER_URI), @@ -1590,10 +1630,10 @@ params(STRING_O, STRING_ZM), EMPTY_SEQUENCE_Z, flag(UPD), USER_URI), /** XQuery function. */ _USER_EXISTS(UserExists::new, "exists(name)", - params(STRING_O), BOOLEAN_O, flag(NDT), USER_URI), + params(STRING_O), BOOLEAN_O, flag(NDT), USER_URI, Perm.ADMIN), /** XQuery function. */ _USER_GRANT(UserGrant::new, "grant(name,permissions[,patterns])", - params(STRING_O, STRING_ZM, STRING_ZM), EMPTY_SEQUENCE_Z, flag(UPD), USER_URI), + params(STRING_O, STRING_ZM, STRING_ZM), EMPTY_SEQUENCE_Z, flag(UPD), USER_URI, Perm.ADMIN), /** XQuery function. */ _USER_INFO(UserInfo::new, "info([name])", params(STRING_O), ELEMENT_O, USER_URI), @@ -1674,34 +1714,34 @@ /** XQuery function. */ _VALIDATE_DTD(ValidateDtd::new, "dtd(input[,schema])", - params(ITEM_O, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O), EMPTY_SEQUENCE_Z, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_DTD_INFO(ValidateDtdInfo::new, "dtd-info(input[,schema])", - params(ITEM_O, ITEM_O), STRING_ZM, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O), STRING_ZM, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_DTD_REPORT(ValidateDtdReport::new, "dtd-report(input[,schema])", - params(ITEM_O, ITEM_O), ELEMENT_O, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O), ELEMENT_O, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_RNG(ValidateRng::new, "rng(input,schema[,compact])", - params(ITEM_O, ITEM_O, BOOLEAN_O), STRING_ZM, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, BOOLEAN_O), STRING_ZM, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_RNG_INFO(ValidateRngInfo::new, "rng-info(input,schema[,compact])", - params(ITEM_O, ITEM_O, BOOLEAN_O), STRING_ZM, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, BOOLEAN_O), STRING_ZM, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_RNG_REPORT(ValidateRngReport::new, "rng-report(input,schema[,compact])", - params(ITEM_O, ITEM_O, BOOLEAN_O), ELEMENT_O, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, BOOLEAN_O), ELEMENT_O, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_XSD(ValidateXsd::new, "xsd(input[,schema[,options]])", - params(ITEM_O, ITEM_O, MAP_O), EMPTY_SEQUENCE_Z, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, MAP_O), EMPTY_SEQUENCE_Z, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_XSD_INFO(ValidateXsdInfo::new, "xsd-info(input[,schema[,options]])", - params(ITEM_O, ITEM_O, MAP_O), STRING_ZM, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, MAP_O), STRING_ZM, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_XSD_PROCESSOR(ValidateXsdProcessor::new, "xsd-processor()", params(), STRING_O, VALIDATE_URI), /** XQuery function. */ _VALIDATE_XSD_REPORT(ValidateXsdReport::new, "xsd-report(input[,schema[,options]])", - params(ITEM_O, ITEM_O, MAP_O), ELEMENT_O, flag(NDT), VALIDATE_URI), + params(ITEM_O, ITEM_O, MAP_O), ELEMENT_O, flag(NDT), VALIDATE_URI, Perm.CREATE), /** XQuery function. */ _VALIDATE_XSD_VERSION(ValidateXsdVersion::new, "xsd-version()", params(), STRING_O, VALIDATE_URI), @@ -1736,46 +1776,37 @@ // XQuery Module /** XQuery function. */ - _XQUERY_EVAL(XQueryEval::new, "eval(string[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), ITEM_ZM, flag(NDT), XQUERY_URI), + _XQUERY_EVAL(XQueryEval::new, "eval(input[,bindings[,options]])", + params(STRING_O, MAP_ZO, MAP_ZO), ITEM_ZM, flag(NDT), XQUERY_URI, Perm.ADMIN), /** XQuery function. */ - _XQUERY_EVAL_UPDATE(XQueryEvalUpdate::new, "eval-update(string[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), EMPTY_SEQUENCE_Z, flag(UPD), XQUERY_URI), + _XQUERY_EVAL_UPDATE(XQueryEvalUpdate::new, "eval-update(input[,bindings[,options]])", + params(STRING_O, MAP_ZO, MAP_ZO), EMPTY_SEQUENCE_Z, flag(UPD), XQUERY_URI, Perm.ADMIN), /** XQuery function. */ _XQUERY_FORK_JOIN(XQueryForkJoin::new, "fork-join(functions)", params(FUNCTION_ZM), ITEM_ZM, flag(HOF), XQUERY_URI), - /** XQuery function (legacy, now: xquery:eval). */ - _XQUERY_INVOKE(XQueryInvoke::new, "invoke(uri[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), ITEM_ZM, flag(NDT), XQUERY_URI), - /** XQuery function (legacy, now: jobs:eval-update). */ - _XQUERY_INVOKE_UPDATE(XQueryInvokeUpdate::new, "invoke-update(uri[,bindings[,options]])", - params(STRING_O, MAP_ZO, MAP_ZO), EMPTY_SEQUENCE_Z, flag(UPD), XQUERY_URI), - /** XQuery function. */ - _XQUERY_PARSE(XQueryParse::new, "parse(string[,options])", - params(STRING_O, MAP_ZO), NODE_O, flag(NDT), XQUERY_URI), /** XQuery function. */ - _XQUERY_PARSE_URI(XQueryParseUri::new, "parse-uri(uri[,options])", - params(STRING_O, MAP_ZO), NODE_O, flag(NDT), XQUERY_URI), + _XQUERY_PARSE(XQueryParse::new, "parse(input[,options])", + params(STRING_O, MAP_ZO), NODE_O, flag(NDT), XQUERY_URI, Perm.CREATE), // XSLT Module /** XQuery function. */ _XSLT_INIT(XsltInit::new, "init()", - params(), NODE_O, flag(NDT), XSLT_URI), + params(), NODE_O, flag(NDT), XSLT_URI, Perm.CREATE), /** XQuery function. */ _XSLT_PROCESSOR(XsltProcessor::new, "processor()", params(), STRING_O, XSLT_URI), /** XQuery function. */ _XSLT_TRANSFORM(XsltTransform::new, "transform(input,stylesheet[,params[,options]])", - params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), NODE_O, flag(NDT), XSLT_URI), + params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), NODE_O, flag(NDT), XSLT_URI, Perm.CREATE), /** XQuery function. */ _XSLT_TRANSFORM_REPORT(XsltTransformReport::new, "transform-report(input,stylesheet[,params[,options]])", - params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), MAP_O, flag(NDT), XSLT_URI), + params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), MAP_O, flag(NDT), XSLT_URI, Perm.CREATE), /** XQuery function. */ _XSLT_TRANSFORM_TEXT(XsltTransformText::new, "transform-text(input,stylesheet[,params[,options]])", - params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), STRING_O, flag(NDT), XSLT_URI), + params(ITEM_O, ITEM_O, MAP_ZO, MAP_ZO), STRING_O, flag(NDT), XSLT_URI, Perm.CREATE), /** XQuery function. */ _XSLT_VERSION(XsltVersion::new, "version()", params(), STRING_O, XSLT_URI), @@ -1784,7 +1815,7 @@ /** XQuery function. */ _ZIP_BINARY_ENTRY(ZipBinaryEntry::new, "binary-entry(path,entry)", - params(STRING_O, STRING_O), BASE64_BINARY_O, flag(NDT), ZIP_URI), + params(STRING_O, STRING_O), BASE64_BINARY_O, flag(NDT), ZIP_URI, Perm.CREATE), /** XQuery function. */ _ZIP_ENTRIES(ZipEntries::new, "entries(path)", params(STRING_O), ELEMENT_O, flag(NDT), ZIP_URI), @@ -1861,7 +1892,25 @@ */ Function(final Supplier supplier, final String desc, final SeqType[] params, final SeqType seqType, final EnumSet flags, final byte[] uri) { - definition = new FuncDefinition(supplier, desc, params, seqType, flags, uri); + this(supplier, desc, params, seqType, flags, uri, Perm.NONE); + } + + /** + * Constructs a function signature. + * @param supplier function implementation constructor + * @param desc descriptive function string, containing the function name and its parameters in + * parentheses. Optional parameters are represented in nested square brackets; three dots + * indicate that the number of parameters of a function is not limited. + * @param params parameter types + * @param seqType return type + * @param flags static function properties + * @param uri uri + * @param perm minimum permission + */ + Function(final Supplier supplier, final String desc, + final SeqType[] params, final SeqType seqType, final EnumSet flags, final byte[] uri, + final Perm perm) { + definition = new FuncDefinition(supplier, desc, params, seqType, flags, uri, perm); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hash/HashHash.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hash/HashHash.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hash/HashHash.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hash/HashHash.java 2022-05-14 08:34:33.000000000 +0000 @@ -13,6 +13,6 @@ public final class HashHash extends HashFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - return hash(Token.string(toToken(exprs[1], qc)), qc); + return hash(toString(exprs[1], qc), qc); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofDropWhile.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofDropWhile.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofDropWhile.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofDropWhile.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { final Iter iter = exprs[0].iter(qc); - final FItem pred = checkArity(exprs[1], 1, qc); + final FItem pred = toFunction(exprs[1], 1, qc); // check if iterator is value-based final Value value = value(iter, pred, qc); @@ -39,7 +39,7 @@ @Override public Value value(final QueryContext qc) throws QueryException { final Iter iter = exprs[0].iter(qc); - final FItem pred = checkArity(exprs[1], 1, qc); + final FItem pred = toFunction(exprs[1], 1, qc); // check if iterator is value-based final Value value = value(iter, pred, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,7 @@ * @throws QueryException exception */ final Comparator getComp(final int pos, final QueryContext qc) throws QueryException { - final FItem lt = checkArity(exprs[pos], 2, qc); + final FItem lt = toFunction(exprs[pos], 2, qc); return (a, b) -> { try { return toBoolean(lt.invoke(qc, info, a, b).item(qc, info)) ? -1 : 1; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofFoldLeft1.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofFoldLeft1.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofFoldLeft1.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofFoldLeft1.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,7 +21,7 @@ @Override public Value value(final QueryContext qc) throws QueryException { final Iter iter = exprs[0].iter(qc); - final FItem func = checkArity(exprs[1], 2, qc); + final FItem func = toFunction(exprs[1], 2, qc); Value sum = checkNoEmpty(iter.next()); for(Item item; (item = qc.next(iter)) != null;) { @@ -39,7 +39,7 @@ if(expr2 instanceof Value) { final ExprList unroll = cc.unroll(expr1, true); if(unroll != null) { - final FItem func = checkArity(expr2, 2, cc.qc); + final FItem func = toFunction(expr2, 2, cc.qc); Expr expr = unroll.get(0); final long is = unroll.size(); for(int i = 1; i < is; i++) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofScanLeft.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofScanLeft.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofScanLeft.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofScanLeft.java 2022-05-14 08:34:33.000000000 +0000 @@ -19,7 +19,7 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { final Iter outer = exprs[0].iter(qc); - final FItem func = checkArity(exprs[2], 2, qc); + final FItem func = toFunction(exprs[2], 2, qc); return new Iter() { private Value acc = exprs[1].value(qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofTakeWhile.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofTakeWhile.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofTakeWhile.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofTakeWhile.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { final Iter iter = exprs[0].iter(qc); - final FItem pred = checkArity(exprs[1], 1, qc); + final FItem pred = toFunction(exprs[1], 1, qc); // check if iterator is value-based final Value value = value(iter, pred, qc); @@ -37,7 +37,7 @@ @Override public Value value(final QueryContext qc) throws QueryException { final Iter iter = exprs[0].iter(qc); - final FItem pred = checkArity(exprs[1], 1, qc); + final FItem pred = toFunction(exprs[1], 1, qc); // check if iterator is value-based final Value value = value(iter, pred, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofTopKBy.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofTopKBy.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofTopKBy.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofTopKBy.java 2022-05-14 08:34:33.000000000 +0000 @@ -19,7 +19,7 @@ public final class HofTopKBy extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - final FItem getKey = checkArity(exprs[1], 1, qc); + final FItem getKey = toFunction(exprs[1], 1, qc); final long k = Math.min(toLong(exprs[2], qc), Integer.MAX_VALUE); if(k < 1) return Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofUntil.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofUntil.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/hof/HofUntil.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/hof/HofUntil.java 2022-05-14 08:34:33.000000000 +0000 @@ -16,7 +16,7 @@ public final class HofUntil extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - final FItem pred = checkArity(exprs[0], 1, qc), func = checkArity(exprs[1], 1, qc); + final FItem pred = toFunction(exprs[0], 1, qc), func = toFunction(exprs[1], 1, qc); Value value = exprs[2].value(qc); while(!toBoolean(pred.invoke(qc, info, value).item(qc, info))) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/html/HtmlDoc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/html/HtmlDoc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/html/HtmlDoc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/html/HtmlDoc.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,6 +15,6 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] uri = toTokenOrNull(exprs[0], qc); - return uri != null ? parse(checkPath(uri), qc) : Empty.VALUE; + return uri != null ? parse(toIO(uri), qc) : Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/http/HttpSendRequest.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/http/HttpSendRequest.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/http/HttpSendRequest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/http/HttpSendRequest.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,8 +17,6 @@ public final class HttpSendRequest extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - checkCreate(qc); - // get request node final ANode request = toNodeOrNull(exprs[0], qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexElementNames.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexElementNames.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexElementNames.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexElementNames.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ public class IndexElementNames extends IndexFn { @Override public final Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final IndexType type = type(); return entries(type == IndexType.ELEMNAME ? data.elemNames : data.attrNames, new IndexEntries(EMPTY, type)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexFacets.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexFacets.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexFacets.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexFacets.java 2022-05-14 08:34:33.000000000 +0000 @@ -39,7 +39,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final boolean flat = exprs.length == 2 && eq(toToken(exprs[1], qc), FLAT); return new FDoc().add(flat ? flat(data) : tree(data, data.paths.root().get(0))); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexTexts.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexTexts.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/index/IndexTexts.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/index/IndexTexts.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ public class IndexTexts extends IndexFn { @Override public final Iter iter(final QueryContext qc) throws QueryException { - final Data data = checkData(qc); + final Data data = toData(qc); final byte[] entry = exprs.length < 2 ? EMPTY : toToken(exprs[1], qc); final IndexEntries entries = exprs.length < 3 ? new IndexEntries(entry, type()) : diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectContext.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectContext.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectContext.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectContext.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,6 @@ public final class InspectContext extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); return new PlainDoc(qc, info).context(); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctionAnnotations.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctionAnnotations.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctionAnnotations.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctionAnnotations.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { XQMap map = XQMap.empty(); - for(final Ann ann : toFunc(exprs[0], qc).annotations()) { + for(final Ann ann : toFunction(exprs[0], qc).annotations()) { final ValueBuilder vb = new ValueBuilder(qc); for(final Item arg : ann.value()) vb.add(arg); map = map.put(ann.name(), vb.value(), info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunction.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunction.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunction.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunction.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,7 @@ public final class InspectFunction extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final FItem func = toFunc(exprs[0], qc); + final FItem func = toFunction(exprs[0], qc); final QNm name = func.funcName(); final StaticFunc sf = name == null ? null : qc.funcs.get(name, func.arity()); return new PlainDoc(qc, info).function(name, sf, func.funcType(), func.annotations(), null); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctions.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctions.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctions.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectFunctions.java 2022-05-14 08:34:33.000000000 +0000 @@ -30,8 +30,6 @@ } // URI specified: compile module and return all newly added functions - checkCreate(qc); - final IOContent content = toContent(toToken(exprs[0], qc), qc); Value funcs = qc.resources.functions(content.path()); if(funcs != null) return funcs; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectModule.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectModule.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectModule.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectModule.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,6 @@ public final class InspectModule extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); return new PlainDoc(qc, info).parse(toContent(toToken(exprs[0], qc), qc)); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectStaticContext.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectStaticContext.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectStaticContext.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectStaticContext.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,12 +24,12 @@ @Override public Value value(final QueryContext qc) throws QueryException { Item func = exprs[0].item(qc, info); - final String name = Token.string(toToken(exprs[1], qc)); + final String name = toString(exprs[1], qc); final StaticContext sctx; if(func == Empty.VALUE) { sctx = sc; } else { - func = toFunc(func, qc); + func = toFunction(func, qc); if(!(func instanceof FuncItem)) throw INVFUNCITEM_X_X.get(info, func.type, func); sctx = ((FuncItem) func).sc; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectXqdoc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectXqdoc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/inspect/InspectXqdoc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/inspect/InspectXqdoc.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,6 @@ public final class InspectXqdoc extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); return new XQDoc(qc, info).parse(toContent(toToken(exprs[0], qc), qc)); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsBindings.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsBindings.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsBindings.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsBindings.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,39 @@ +package org.basex.query.func.jobs; + +import java.util.Map.*; + +import org.basex.core.jobs.*; +import org.basex.query.*; +import org.basex.query.func.*; +import org.basex.query.value.*; +import org.basex.query.value.item.*; +import org.basex.query.value.map.*; +import org.basex.util.*; + +/** + * Function implementation. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public final class JobsBindings extends StandardFunc { + @Override + public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { + final String id = toString(exprs[0], qc); + final JobPool jobs = qc.context.jobs; + + Job job = jobs.active.get(id); + final QueryJobResult jr = jobs.results.get(id); + if(job == null && jr != null) job = jr.job; + final QueryJobTask jt = jobs.tasks.get(id); + if(job == null && jt != null) job = jt.job; + + XQMap map = XQMap.empty(); + if(job instanceof QueryJob) { + for(final Entry entry : ((QueryJob) job).bindings().entrySet()) { + map = map.put(Str.get(entry.getKey()), entry.getValue(), info); + } + } + return map; + } +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsEval.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsEval.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsEval.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsEval.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,7 +34,6 @@ * @throws QueryException query exception */ final Str eval(final IOContent query, final QueryContext qc) throws QueryException { - checkAdmin(qc); final HashMap bindings = toBindings(1, qc); final JobsOptions opts = toOptions(2, new JobsOptions(), qc); opts.set(JobsOptions.BASE_URI, toBaseUri(query.url(), opts)); @@ -48,7 +47,7 @@ // copy variable values for(final Entry it : bindings.entrySet()) { - bindings.put(it.getKey(), it.getValue().materialize(qc, BASEX_FUNCTION_X, info)); + bindings.put(it.getKey(), it.getValue().materialize(n -> false, info, qc)); } final QueryJobSpec spec = new QueryJobSpec(opts, bindings, query); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsFinished.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsFinished.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsFinished.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsFinished.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,9 +15,7 @@ public final class JobsFinished extends StandardFunc { @Override public Bln item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - - final String id = Token.string(toToken(exprs[0], qc)); + final String id = toString(exprs[0], qc); final JobPool pool = qc.context.jobs; final QueryJobResult result = pool.results.get(id); // returns true if job is not active, and if no result exists or if it has been cached diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsInvoke.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsInvoke.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsInvoke.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsInvoke.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -package org.basex.query.func.jobs; - -import org.basex.query.*; -import org.basex.query.value.item.*; -import org.basex.util.*; - -/** - * Function implementation. - * - * @author BaseX Team 2005-22, BSD License - * @author Christian Gruen - */ -public final class JobsInvoke extends JobsEval { - @Override - public Str item(final QueryContext qc, final InputInfo ii) throws QueryException { - return eval(toContent(toToken(exprs[0], qc), qc), qc); - } -} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsListDetails.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsListDetails.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsListDetails.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsListDetails.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,8 +20,6 @@ public final class JobsListDetails extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); - final Context ctx = qc.context; final TokenList ids = exprs.length == 0 ? JobsList.ids(ctx) : new TokenList(1).add(toToken(exprs[0], qc)); @@ -33,8 +31,8 @@ final byte[][] atts = { ID, TYPE, STATE, USER, DURATION, START, END, INTERVAL, READS, WRITES, TIME }; - for(final byte[] key : ids) { - final TokenList entry = JobsList.entry(key, jobs, max); + for(final byte[] id : ids) { + final TokenList entry = JobsList.entry(id, jobs, max); if(entry == null) continue; final FElem elem = new FElem(JOB); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsList.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsList.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsList.java 2022-05-14 08:34:33.000000000 +0000 @@ -14,7 +14,6 @@ public final class JobsList extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); return StrSeq.get(org.basex.core.cmd.JobsList.ids(qc.context)); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsResult.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsResult.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsResult.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsResult.java 2022-05-14 08:34:33.000000000 +0000 @@ -9,7 +9,6 @@ import org.basex.query.func.*; import org.basex.query.value.*; import org.basex.query.value.seq.*; -import org.basex.util.*; /** * Function implementation. @@ -20,9 +19,7 @@ public final class JobsResult extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); - - final String id = Token.string(toToken(exprs[0], qc)); + final String id = toString(exprs[0], qc); final JobPool jobs = qc.context.jobs; final Map results = jobs.results; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsServices.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsServices.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsServices.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsServices.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,6 @@ public final class JobsServices extends StandardFunc { @Override public Value value(final QueryContext qc) throws QueryException { - checkAdmin(qc); try { return new Jobs(qc.context).toXML().childIter().value(qc, this); } catch(final IOException ex) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsStop.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsStop.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsStop.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsStop.java 2022-05-14 08:34:33.000000000 +0000 @@ -27,9 +27,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - - final String id = Token.string(toToken(exprs[0], qc)); + final String id = toString(exprs[0], qc); final StopOptions opts = toOptions(1, new StopOptions(), qc); // stop job diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsWait.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsWait.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/jobs/JobsWait.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/jobs/JobsWait.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,9 +18,7 @@ public final class JobsWait extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - - final String id = Token.string(toToken(exprs[0], qc)); + final String id = toString(exprs[0], qc); if(qc.jc().id().equals(id)) throw JOBS_SELF_X.get(info, id); final JobPool pool = qc.context.jobs; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/json/JsonDoc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/json/JsonDoc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/json/JsonDoc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/json/JsonDoc.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,6 +15,6 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final byte[] uri = toTokenOrNull(exprs[0], qc); - return uri != null ? parse(checkPath(uri), qc) : Empty.VALUE; + return uri != null ? parse(toIO(uri), qc) : Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/map/MapFind.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/map/MapFind.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/map/MapFind.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/map/MapFind.java 2022-05-14 08:34:33.000000000 +0000 @@ -48,9 +48,7 @@ final XQMap map = (XQMap) item; final Value value = map.get(key, info); if(value != Empty.VALUE) builder.append(value); - for(final Item it : map.keys()) { - find(map.get(it, info).iter(), key, builder, qc); - } + map.apply((it, val) -> find(val.iter(), key, builder, qc)); } else if(item instanceof XQArray) { for(final Value value : ((XQArray) item).members()) { find(value.iter(), key, builder, qc); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/map/MapForEach.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/map/MapForEach.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/map/MapForEach.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/map/MapForEach.java 2022-05-14 08:34:33.000000000 +0000 @@ -20,9 +20,10 @@ @Override public final Value value(final QueryContext qc) throws QueryException { final XQMap map = toMap(exprs[0], qc); - final FItem func = checkArity(exprs[1], 2, this instanceof UpdateMapForEach, qc); + final FItem func = toFunction(exprs[1], 2, this instanceof UpdateMapForEach, qc); - final ValueBuilder vb = map.forEach(func, qc, info); + final ValueBuilder vb = new ValueBuilder(qc); + map.apply((i, v) -> vb.add(func.invoke(qc, info, i, v))); return vb.value(this); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/out/OutFormat.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/out/OutFormat.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/out/OutFormat.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/out/OutFormat.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ public final class OutFormat extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final String form = string(toToken(exprs[0], qc)); + final String form = toString(exprs[0], qc); final int el = exprs.length; final Object[] args = new Object[el - 1]; for(int e = 1; e < el; e++) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/PartFunc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/PartFunc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/PartFunc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/PartFunc.java 2022-05-14 08:34:33.000000000 +0000 @@ -72,7 +72,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final FItem func = toFunc(body(), qc); + final FItem func = toFunction(body(), qc); final int hl = holes.length, nargs = exprs.length + hl - 1; if(func.arity() != nargs) throw INVARITY_X_X_X.get(info, arguments(nargs), func.arity(), func); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/proc/ProcFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/proc/ProcFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/proc/ProcFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/proc/ProcFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -38,8 +38,6 @@ * @throws QueryException query exception */ final ProcResult exec(final QueryContext qc, final boolean fork) throws QueryException { - checkAdmin(qc); - // arguments final StringList sl = new StringList(); sl.add(toToken(exprs[0], qc)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/proc/ProcProperty.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/proc/ProcProperty.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/proc/ProcProperty.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/proc/ProcProperty.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,7 +15,7 @@ public final class ProcProperty extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final String name = Token.string(toToken(exprs[0], qc)), value = Prop.get(name); + final String name = toString(exprs[0], qc), value = Prop.get(name); return value == null ? Empty.VALUE : Str.get(value); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/repo/RepoDelete.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/repo/RepoDelete.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/repo/RepoDelete.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/repo/RepoDelete.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,8 +15,7 @@ public final class RepoDelete extends RepoFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - new RepoManager(qc.context, info).delete(Token.string(toToken(exprs[0], qc))); + new RepoManager(qc.context, info).delete(toString(exprs[0], qc)); return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/repo/RepoInstall.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/repo/RepoInstall.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/repo/RepoInstall.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/repo/RepoInstall.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,8 +15,7 @@ public final class RepoInstall extends RepoFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - new RepoManager(qc.context, info).install(Token.string(toToken(exprs[0], qc))); + new RepoManager(qc.context, info).install(toString(exprs[0], qc)); return Empty.VALUE; } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlClose.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlClose.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlClose.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlClose.java 2022-05-14 08:34:33.000000000 +0000 @@ -16,8 +16,6 @@ public final class SqlClose extends SqlFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - @SuppressWarnings("resource") final AutoCloseable ac = get(qc, true); try { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlCommit.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlCommit.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlCommit.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlCommit.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,6 @@ public final class SqlCommit extends SqlFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); try { connection(qc).commit(); return Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlConnect.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlConnect.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlConnect.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlConnect.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.sql; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.sql.*; import java.util.*; @@ -28,16 +27,14 @@ @SuppressWarnings("resource") @Override public Uri item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); // URL to relational database - final String url = string(toToken(exprs[0], qc)); + final String url = toString(exprs[0], qc); final JDBCConnections jdbc = jdbc(qc); try { final Connection conn; if(exprs.length > 2) { // credentials - final String user = string(toToken(exprs[1], qc)); - final String pass = string(toToken(exprs[2], qc)); + final String user = toString(exprs[1], qc), pass = toString(exprs[2], qc); if(exprs.length == 4) { // parse connection options final HashMap options = toOptions(3, new Options(), qc).free(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlExecute.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlExecute.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlExecute.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlExecute.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,7 +2,6 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; -import static org.basex.util.Token.*; import java.io.*; import java.sql.*; @@ -38,9 +37,8 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { - checkCreate(qc); final Connection conn = connection(qc); - final String query = string(toToken(exprs[1], qc)); + final String query = toString(exprs[1], qc); final StatementOptions options = toOptions(2, new StatementOptions(), qc); try { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlExecutePrepared.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlExecutePrepared.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlExecutePrepared.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlExecutePrepared.java 2022-05-14 08:34:33.000000000 +0000 @@ -32,8 +32,6 @@ @Override public Iter iter(final QueryContext qc) throws QueryException { - checkCreate(qc); - final PreparedStatement ps = prepared(qc); ANode params = null; if(exprs.length > 1) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlInit.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlInit.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlInit.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlInit.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.sql; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import org.basex.query.*; import org.basex.query.func.*; @@ -18,8 +17,7 @@ public final class SqlInit extends StandardFunc { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - final String driver = string(toToken(exprs[0], qc)); + final String driver = toString(exprs[0], qc); if(Reflect.find(driver) == null) throw SQL_INIT_X.get(info, driver); return Empty.VALUE; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlPrepare.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlPrepare.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlPrepare.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlPrepare.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,6 @@ public final class SqlPrepare extends SqlFn { @Override public Uri item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); final Connection conn = connection(qc); final byte[] prepStmt = toToken(exprs[1], qc); try { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlRollback.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlRollback.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/sql/SqlRollback.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/sql/SqlRollback.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,6 @@ public final class SqlRollback extends SqlFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); try { connection(qc).rollback(); return Empty.VALUE; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/StandardFunc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/StandardFunc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/StandardFunc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/StandardFunc.java 2022-05-14 08:34:33.000000000 +0000 @@ -75,6 +75,7 @@ @Override public final Expr optimize(final CompileContext cc) throws QueryException { + checkPerm(cc.qc, definition.perm); simplifyArgs(cc); final Expr expr = opt(cc); @@ -162,7 +163,7 @@ * Serializes the data from the specified iterator. * @param iter data to serialize * @param opts serialization parameters - * @param err error code + * @param err error to raise * @param qc query context * @return result * @throws QueryException query exception @@ -242,12 +243,32 @@ */ protected final Expr compileData(final CompileContext cc) throws QueryException { if(exprs.length > 0 && exprs[0] instanceof Value) { - data = checkData(cc.qc); + data = toData(cc.qc); cc.info(OPTOPEN_X, data.meta.name); } return this; } + /** + * Tries to embed a positional function call in its first argument. + * @param cc compilation context + * @param skip skip evaluation of remaining operands + * @return optimized expression or {@code null} + * @throws QueryException query exception + */ + protected Expr embed(final CompileContext cc, final boolean skip) throws QueryException { + // util:last((1 to 8) ! <_>{ . }) -> util:last((1 to 8)) ! <_>{ . } + if(exprs[0] instanceof SimpleMap) { + final Expr[] ops = exprs[0].args(); + if(((Checks) op -> op == ops[0] || op.seqType().one()).all(ops)) { + exprs[0] = ops[0]; + ops[0] = definition.get(sc, info, exprs).optimize(cc); + return skip ? ops[0] : SimpleMap.get(cc, info, ops); + } + } + return null; + } + @Override public final Data data() { return data; @@ -331,21 +352,20 @@ * @return input source, or exception * @throws QueryException query exception */ - protected final IO checkPath(final int i, final QueryContext qc) throws QueryException { - return checkPath(toToken(exprs[i], qc)); + protected final IO toIO(final int i, final QueryContext qc) throws QueryException { + return toIO(toToken(exprs[i], qc)); } /** - * Returns a valid reference if a file is found at the specified path or the static base uri. - * Otherwise, returns an error. + * Converts the specified URI to a reference to a resource. * @param uri file URI - * @return input source, or exception + * @return io reference * @throws QueryException query exception */ - protected final IO checkPath(final byte[] uri) throws QueryException { + protected final IO toIO(final byte[] uri) throws QueryException { final IO io = new QueryInput(string(uri), sc).io; if(!io.exists()) throw WHICHRES_X.get(info, io); - if(io.isDir()) throw RESDIR_X.get(info, io); + if(io instanceof IOFile && io.isDir()) throw RESDIR_X.get(info, io); return io; } @@ -370,8 +390,8 @@ */ protected final IOContent toContent(final byte[] uri, final QueryContext qc) throws QueryException { - checkAdmin(qc); - final IO io = checkPath(uri); + checkPerm(qc, Perm.ADMIN); + final IO io = toIO(uri); try { return new IOContent(io.string(), io.url()); } catch(final IOException ex) { @@ -394,7 +414,7 @@ /** * Returns a normalized encoding representation. * @param i index of encoding argument - * @param err error for invalid encoding + * @param err error to raise * @param qc query context * @return string or {@code null} * @throws QueryException query exception @@ -405,7 +425,7 @@ if(i >= exprs.length) return null; final byte[] encoding = toToken(exprs[i], qc); try { - final String enc = string(toToken(exprs[i], qc)); + final String enc = toString(exprs[i], qc); if(Charset.isSupported(enc)) return Strings.normEncoding(enc); } catch(final IllegalArgumentException ex) { // character set is invalid or unknown (e.g. empty string) @@ -457,7 +477,7 @@ if(i < el) { final Item item = exprs[i].item(qc, info); final XQMap map = item == Empty.VALUE ? XQMap.empty() : toMap(item); - for(final Item it : map.keys()) { + map.apply((it, v) -> { final byte[] key; if(it.type.isStringOrUntyped()) { key = it.string(null); @@ -467,8 +487,8 @@ if(qnm.uri() != null) tb.add('{').add(qnm.uri()).add('}'); key = tb.add(qnm.local()).finish(); } - hm.put(string(key), map.get(it, info)); - } + hm.put(string(key), v); + }); } return hm; } @@ -480,30 +500,8 @@ * @return data instance * @throws QueryException query exception */ - protected final Data checkData(final QueryContext qc) throws QueryException { - if(data != null) return data; - final String name = string(toToken(exprs[0], qc)); - if(!Databases.validName(name)) throw INVDB_X.get(info, name); - return qc.resources.database(name, info); - } - - /** - * Checks if the current user has create permissions. If negative, an - * exception is thrown. - * @param qc query context - * @throws QueryException query exception - */ - protected final void checkAdmin(final QueryContext qc) throws QueryException { - checkPerm(qc, Perm.ADMIN); - } - - /** - * Checks if the current user has create permissions. If negative, an exception is thrown. - * @param qc query context - * @throws QueryException query exception - */ - protected final void checkCreate(final QueryContext qc) throws QueryException { - checkPerm(qc, Perm.CREATE); + protected final Data toData(final QueryContext qc) throws QueryException { + return data != null ? data : qc.resources.database(toName(0, DB_NAME_X, qc), info); } /** @@ -513,8 +511,9 @@ * @param perm permission * @throws QueryException query exception */ - private void checkPerm(final QueryContext qc, final Perm perm) throws QueryException { - if(!qc.context.user().has(perm)) throw BASEX_PERMISSION_X_X.get(info, perm, this); + protected void checkPerm(final QueryContext qc, final Perm perm) throws QueryException { + if(perm != Perm.NONE && !qc.context.user().has(perm)) + throw BASEX_PERMISSION_X_X.get(info, perm, this); } /** @@ -525,9 +524,9 @@ * @return function item * @throws QueryException query exception */ - protected final FItem checkArity(final Expr expr, final int nargs, final QueryContext qc) + protected final FItem toFunction(final Expr expr, final int nargs, final QueryContext qc) throws QueryException { - return checkArity(expr, nargs, false, qc); + return toFunction(expr, nargs, false, qc); } /** @@ -539,23 +538,39 @@ * @return function item * @throws QueryException query exception */ - protected final FItem checkArity(final Expr expr, final int nargs, final boolean updating, + protected final FItem toFunction(final Expr expr, final int nargs, final boolean updating, final QueryContext qc) throws QueryException { - final FItem func = checkUp(toFunc(expr, qc), updating, sc); + final FItem func = checkUp(toFunction(expr, qc), updating, sc); final int fargs = func.arity(); if(fargs == nargs) return func; throw FUNARITY_X_X.get(info, arguments(fargs), nargs); } /** + * Checks if the specified expression is a valid name. + * @param i index of argument + * @param err error to raise + * @param qc query context + * @return normalized path + * @throws QueryException query exception + */ + protected final String toName(final int i, final QueryError err, final QueryContext qc) + throws QueryException { + final String name = toString(exprs[i], qc); + if(Databases.validName(name)) return name; + throw err.get(info, name); + } + + /** * Converts the specified dateTime to milliseconds. * @param expr expression * @param qc query context * @return resulting value * @throws QueryException query exception */ - protected final long dateTimeToMs(final Expr expr, final QueryContext qc) throws QueryException { + protected final long toMilliseconds(final Expr expr, final QueryContext qc) + throws QueryException { final Dtm dtm = (Dtm) checkType(expr, qc, AtomType.DATE_TIME); if(dtm.yea() > 292278993) throw INTRANGE_X.get(info, dtm.yea()); return dtm.toJava().toGregorianCalendar().getTimeInMillis(); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserAlter.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserAlter.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserAlter.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserAlter.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,9 +18,8 @@ public final class UserAlter extends UserFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); final User user = toInactiveUser(0, qc); - final String name = user.name(), newname = toSafeName(1, qc); + final String name = user.name(), newname = toInactiveName(1, qc); if(Strings.eq(UserText.ADMIN, name, newname)) throw USER_ADMIN.get(info); if(Strings.eq(name, newname)) throw USER_EQUAL_X.get(info, name); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserCheck.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserCheck.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserCheck.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserCheck.java 2022-05-14 08:34:33.000000000 +0000 @@ -18,7 +18,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final User user = toUser(0, qc); - if(user.matches(Token.string(toToken(exprs[1], qc)))) return Empty.VALUE; + if(user.matches(toString(exprs[1], qc))) return Empty.VALUE; throw USER_PASSWORD_X.get(info, user.name()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserCreate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserCreate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserCreate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserCreate.java 2022-05-14 08:34:33.000000000 +0000 @@ -22,10 +22,9 @@ public final class UserCreate extends UserFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); - final String name = toSafeName(0, qc); - final String pw = toString(1, qc); - final ArrayList perms = toPerms(2, qc); + final String name = toInactiveName(0, qc); + final String pw = toString(exprs[1], qc); + final ArrayList perms = toPermissions(2, qc); final StringList patterns = toPatterns(3, qc); final User user = new User(name, pw); @@ -34,7 +33,7 @@ if(exprs.length > 4) { final ANode node = toElem(exprs[4], qc); if(!T_INFO.matches(node)) throw ELM_X_X.get(info, Q_INFO.prefixId(), node); - user.info(node.materialize(qc, true)); + user.info(node.materialize(n -> false, info, qc)); } qc.updates().add(new Create(user, perms, patterns, qc, info), qc); @@ -59,8 +58,8 @@ @Override public void apply() { - final User olduser = users.get(user.name()); - if(olduser != null) users.drop(olduser); + final User old = users.get(user.name()); + if(old != null) users.drop(old); users.add(user); grant(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserExists.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserExists.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserExists.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserExists.java 2022-05-14 08:34:33.000000000 +0000 @@ -13,7 +13,6 @@ public final class UserExists extends UserFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); return Bln.get(qc.context.users.get(toName(0, qc)) != null); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -53,16 +53,14 @@ } /** - * Checks if the specified expression is a valid user name. - * @param i expression index + * Checks if the specified expression is a valid as user name. + * @param i index of argument * @param qc query context - * @return name + * @return user name * @throws QueryException query exception */ protected final String toName(final int i, final QueryContext qc) throws QueryException { - final String name = toString(i, qc); - if(!Databases.validName(name)) throw USER_NAME_X.get(info, name); - return name; + return toName(i, USER_NAME_X, qc); } /** @@ -75,7 +73,7 @@ protected final User toUser(final int i, final QueryContext qc) throws QueryException { final String name = toName(i, qc); final User user = qc.context.users.get(name); - if(user != qc.context.user()) checkAdmin(qc); + if(user != qc.context.user()) checkPerm(qc, Perm.ADMIN); if(user == null) throw USER_UNKNOWN_X.get(info, name); return user; } @@ -87,7 +85,7 @@ * @return permissions * @throws QueryException query exception */ - protected final ArrayList toPerms(final int i, final QueryContext qc) + protected final ArrayList toPermissions(final int i, final QueryContext qc) throws QueryException { final ArrayList perms = new ArrayList<>(); @@ -106,48 +104,37 @@ } /** - * Checks if the specified expression is a string. - * @param i expression index - * @param qc query context - * @return name of database - * @throws QueryException query exception - */ - protected final String toString(final int i, final QueryContext qc) throws QueryException { - return Token.string(toToken(exprs[i], qc)); - } - - /** - * Checks if the specified user is currently logged in. + * Ensures that no user with the specified name is logged in. * @param i expression index * @param qc query context * @return name * @throws QueryException query exception */ - protected final String toSafeName(final int i, final QueryContext qc) throws QueryException { + protected final String toInactiveName(final int i, final QueryContext qc) throws QueryException { final String name = toName(i, qc); - checkInactive(qc.context.users.get(name), qc); + toInactiveUser(qc.context.users.get(name), qc); return name; } /** - * Checks if the specified user is currently not logged in. + * Ensures that the specified user is not logged in. * @param i expression index * @param qc query context * @return user * @throws QueryException query exception */ protected final User toInactiveUser(final int i, final QueryContext qc) throws QueryException { - return checkInactive(toUser(i, qc), qc); + return toInactiveUser(toUser(i, qc), qc); } /** - * Checks if the specified user is currently not logged in. + * Ensures that the specified user is not logged in. * @param user user (can be {@code null}) * @param qc query context * @return specified user * @throws QueryException query exception */ - private User checkInactive(final User user, final QueryContext qc) throws QueryException { + private User toInactiveUser(final User user, final QueryContext qc) throws QueryException { if(user != null) { final String name = user.name(); for(final ClientListener cl : qc.context.sessions) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserGrant.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserGrant.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserGrant.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserGrant.java 2022-05-14 08:34:33.000000000 +0000 @@ -21,9 +21,8 @@ public final class UserGrant extends UserFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkAdmin(qc); final User user = toInactiveUser(0, qc); - final ArrayList perms = toPerms(1, qc); + final ArrayList perms = toPermissions(1, qc); final StringList patterns = toPatterns(2, qc); if(user.name().equals(UserText.ADMIN)) throw USER_ADMIN.get(info); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserListDetails.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserListDetails.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserListDetails.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserListDetails.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,12 +15,12 @@ @Override public Value value(final QueryContext qc) throws QueryException { // return information on single user - if(exprs.length > 0) return toUser(0, qc).toXML(qc); + if(exprs.length > 0) return toUser(0, qc).toXML(qc, info); // return information for all users final Context ctx = qc.context; final ValueBuilder vb = new ValueBuilder(qc); - for(final User us : ctx.users.users(null, ctx)) vb.add(us.toXML(qc)); + for(final User us : ctx.users.users(null, ctx)) vb.add(us.toXML(qc, info)); return vb.value(this); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserPassword.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserPassword.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserPassword.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserPassword.java 2022-05-14 08:34:33.000000000 +0000 @@ -16,7 +16,9 @@ public final class UserPassword extends UserFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - qc.updates().add(new Password(toUser(0, qc), toString(1, qc), qc, info), qc); + final User user = toUser(0, qc); + final String pw = toString(exprs[1], qc); + qc.updates().add(new Password(user, pw, qc, info), qc); return Empty.VALUE; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserUpdateInfo.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserUpdateInfo.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/user/UserUpdateInfo.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/user/UserUpdateInfo.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,7 @@ if(!T_INFO.matches(node)) throw ELM_X_X.get(info, Q_INFO.prefixId(), node); final User user = exprs.length > 1 ? toUser(1, qc) : null; - qc.updates().add(new UpdateInfo(node.materialize(qc, true), user, qc, info), qc); + qc.updates().add(new UpdateInfo(node.materialize(n -> false, info, qc), user, qc, info), qc); return Empty.VALUE; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilCountWithin.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilCountWithin.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilCountWithin.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilCountWithin.java 2022-05-14 08:34:33.000000000 +0000 @@ -68,6 +68,10 @@ if(min >= 2) return Bln.FALSE; } } + + final Expr embedded = embed(cc, true); + if(embedded != null) return embedded; + return this; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilDdo.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilDdo.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilDdo.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilDdo.java 2022-05-14 08:34:33.000000000 +0000 @@ -46,6 +46,8 @@ if(type instanceof NodeType) { // util:ddo(util:replicate(*, 2)) -> util:ddo(*) if(_UTIL_REPLICATE.is(expr) && ((UtilReplicate) expr).singleEval(false)) return expr.arg(0); + // util:ddo(reverse(*)) -> util:ddo(*) + if(REVERSE.is(expr) || SORT.is(expr)) return cc.function(_UTIL_DDO, info, expr.arg(0)); // util:ddo(/a/b/c) -> /a/b/c if(expr.ddo()) return expr; // adopt type of argument diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilInit.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilInit.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilInit.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilInit.java 2022-05-14 08:34:33.000000000 +0000 @@ -115,6 +115,9 @@ } } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.union(Occ.ZERO), size - 1); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilItem.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilItem.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilItem.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilItem.java 2022-05-14 08:34:33.000000000 +0000 @@ -102,6 +102,9 @@ if(_UTIL_INIT.is(expr)) return cc.function(_UTIL_ITEM, info, expr.arg(0), position); + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.with(occ)); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilLast.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilLast.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilLast.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilLast.java 2022-05-14 08:34:33.000000000 +0000 @@ -55,10 +55,15 @@ final Expr[] args = expr.args(); final Expr last = args[args.length - 1]; final SeqType stl = last.seqType(); + // head((1, 2)) -> 2 if(stl.one()) return last; + // head((1, (2 to 3)) -> util:last(2 to 3) if(stl.oneOrMore()) return cc.function(_UTIL_LAST, info, last); } + final Expr embedded = embed(cc, false); + if(embedded != null) return embedded; + exprType.assign(st.with(st.oneOrMore() ? Occ.EXACTLY_ONE : Occ.ZERO_OR_ONE)); data(expr.data()); return this; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilMapEntries.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilMapEntries.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/util/UtilMapEntries.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/util/UtilMapEntries.java 2022-05-14 08:34:33.000000000 +0000 @@ -31,11 +31,12 @@ @Override public XQMap next() throws QueryException { final Item key = keys.next(); - return key != null ? entry(map, key) : null; + return key != null ? entry(key, map.get(key, info)) : null; } @Override public Item get(final long i) throws QueryException { - return entry(map, keys.get(i)); + final Item key = keys.get(i); + return entry(key, map.get(key, info)); } @Override public long size() { @@ -49,19 +50,19 @@ final XQMap map = toMap(exprs[0], qc); final ValueBuilder vb = new ValueBuilder(qc); - for(final Item key : map.keys()) vb.add(entry(map, key)); + map.apply((k, v) -> vb.add(entry(k, v))); return vb.value(this); } /** * Creates a single map entry. - * @param map map * @param key key + * @param value value * @return created map entry * @throws QueryException query exception */ - private XQMap entry(final XQMap map, final Item key) throws QueryException { - return XQMap.entry(KEY, key, info).put(VALUE, map.get(key, info), info); + private XQMap entry(final Item key, final Value value) throws QueryException { + return XQMap.entry(KEY, key, info).put(VALUE, value, info); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateDtd.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateDtd.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateDtd.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateDtd.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,7 +26,6 @@ @Override public ArrayList errors(final QueryContext qc) throws QueryException { - checkCreate(qc); return process(new Validation() { @Override void process(final ValidationHandler handler) @@ -36,7 +35,7 @@ IO schema = null; if(exprs.length > 1) { final byte[] path = toTokenOrNull(exprs[1], qc); - if(path != null) schema = checkPath(path); + if(path != null) schema = toIO(path); } // integrate doctype declaration via serialization parameters diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -143,7 +143,7 @@ } if(item.type.isStringOrUntyped()) { - IO io = checkPath(toToken(item)); + IO io = toIO(toToken(item)); if(sopts != null) { // add doctype declaration if specified io = new IOContent(new DBNode(io).serialize(sopts).finish()); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateRng.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateRng.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateRng.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateRng.java 2022-05-14 08:34:33.000000000 +0000 @@ -27,7 +27,6 @@ @Override public ArrayList errors(final QueryContext qc) throws QueryException { - checkCreate(qc); return process(new Validation() { @Override void process(final ValidationHandler handler) throws IOException, QueryException { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateXsd.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateXsd.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/validate/ValidateXsd.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/validate/ValidateXsd.java 2022-05-14 08:34:33.000000000 +0000 @@ -60,8 +60,6 @@ @Override public ArrayList errors(final QueryContext qc) throws QueryException { - checkCreate(qc); - return process(new Validation() { @Override void process(final ValidationHandler handler) throws IOException, SAXException, diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebContentType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebContentType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebContentType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebContentType.java 2022-05-14 08:34:33.000000000 +0000 @@ -15,6 +15,6 @@ public final class WebContentType extends StandardFunc { @Override public Str item(final QueryContext qc, final InputInfo ii) throws QueryException { - return Str.get(MediaType.get(Token.string(toToken(exprs[0], qc))).toString()); + return Str.get(MediaType.get(toString(exprs[0], qc)).toString()); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebEncodeUrl.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebEncodeUrl.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebEncodeUrl.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebEncodeUrl.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,7 +17,7 @@ @Override public Str item(final QueryContext qc, final InputInfo ii) throws QueryException { try { - return Str.get(URLEncoder.encode(Token.string(toToken(exprs[0], qc)), Strings.UTF8)); + return Str.get(URLEncoder.encode(toString(exprs[0], qc), Strings.UTF8)); } catch(final UnsupportedEncodingException ex) { // no error should be raised (UTF8 is always supported) throw Util.notExpected(ex); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebError.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebError.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebError.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebError.java 2022-05-14 08:34:33.000000000 +0000 @@ -29,7 +29,7 @@ @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { final long code = toLong(exprs[0], qc); - final String message = Token.string(toToken(exprs[1], qc)); + final String message = toString(exprs[1], qc); if(code <= 0 || code > 999) throw WEB_STATUS_X.get(info, code); throw new QueryException(info, QNm.REST_ERROR, message).value(Int.get(code)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebFn.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebFn.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/web/WebFn.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/web/WebFn.java 2022-05-14 08:34:33.000000000 +0000 @@ -42,9 +42,9 @@ int c = 0; for(final Item key : map.keys()) { final byte[] name = key.string(info); - for(final Item value : map.get(key, info)) { + for(final Item item : map.get(key, info)) { tb.add(c++ == 0 ? '?' : '&').add(Token.encodeUri(name, false)); - tb.add('=').add(Token.encodeUri(value.string(info), false)); + tb.add('=').add(Token.encodeUri(item.string(info), false)); } } if(anchor.length > 0) tb.add('#').add(Token.encodeUri(anchor, false)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvoke.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvoke.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvoke.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvoke.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -package org.basex.query.func.xquery; - -import org.basex.query.*; -import org.basex.query.value.*; - -/** - * Function implementation. - * - * @author BaseX Team 2005-22, BSD License - * @author Christian Gruen - */ -public final class XQueryInvoke extends XQueryEval { - @Override - public Value value(final QueryContext qc) throws QueryException { - return eval(toContent(toToken(exprs[0], qc), qc), false, qc); - } -} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvokeUpdate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvokeUpdate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvokeUpdate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryInvokeUpdate.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -package org.basex.query.func.xquery; - -import org.basex.query.*; -import org.basex.query.value.*; - -/** - * Function implementation. - * - * @author BaseX Team 2005-22, BSD License - * @author Christian Gruen - */ -public final class XQueryInvokeUpdate extends XQueryEval { - @Override - public Value value(final QueryContext qc) throws QueryException { - return eval(toContent(toToken(exprs[0], qc), qc), true, qc); - } -} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryParseUri.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryParseUri.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xquery/XQueryParseUri.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xquery/XQueryParseUri.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -package org.basex.query.func.xquery; - -import org.basex.query.*; -import org.basex.query.value.node.*; -import org.basex.util.*; - -/** - * Function implementation. - * - * @author BaseX Team 2005-22, BSD License - * @author Christian Gruen - */ -public final class XQueryParseUri extends XQueryParse { - @Override - public FElem item(final QueryContext qc, final InputInfo ii) throws QueryException { - checkCreate(qc); - return parse(qc, checkPath(0, qc)); - } -} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xslt/XsltTransform.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xslt/XsltTransform.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/xslt/XsltTransform.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/xslt/XsltTransform.java 2022-05-14 08:34:33.000000000 +0000 @@ -50,7 +50,6 @@ * @throws QueryException query exception */ final Item transform(final QueryContext qc, final boolean simple) throws QueryException { - checkCreate(qc); final IO in = read(0, qc), xsl = read(1, qc); final Options opts = toOptions(2, new Options(), qc); final XsltOptions xopts = toOptions(3, new XsltOptions(), qc); @@ -134,7 +133,7 @@ throw ex.getCause(info); } } - if(item.type.isStringOrUntyped()) return checkPath(toToken(item)); + if(item.type.isStringOrUntyped()) return toIO(toToken(item)); throw STRNOD_X_X.get(info, item.type, item); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipBinaryEntry.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipBinaryEntry.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipBinaryEntry.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipBinaryEntry.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.zip; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; import java.util.zip.*; @@ -31,9 +30,8 @@ * @throws QueryException query exception */ final byte[] entry(final QueryContext qc) throws QueryException { - checkCreate(qc); - final IOFile file = new IOFile(string(toToken(exprs[0], qc))); - final String path = string(toToken(exprs[1], qc)); + final IOFile file = new IOFile(toString(exprs[0], qc)); + final String path = toString(exprs[1], qc); if(!file.exists()) throw ZIP_NOTFOUND_X.get(info, file); try(ZipInputStream in = new ZipInputStream(file.inputStream())) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipEntries.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipEntries.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipEntries.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipEntries.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.zip; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; import java.util.*; @@ -23,7 +22,7 @@ public final class ZipEntries extends ZipFn { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final String file = string(toToken(exprs[0], qc)); + final String file = toString(exprs[0], qc); // check file path final IOFile path = new IOFile(file); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipTextEntry.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipTextEntry.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipTextEntry.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipTextEntry.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.zip; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; @@ -20,7 +19,7 @@ public final class ZipTextEntry extends ZipBinaryEntry { @Override public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { - final String encoding = exprs.length < 3 ? null : string(toToken(exprs[2], qc)); + final String encoding = exprs.length < 3 ? null : toString(exprs[2], qc); final byte[] entry = entry(qc); final boolean validate = qc.context.options.get(MainOptions.CHECKSTRINGS); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipUpdateEntries.java basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipUpdateEntries.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/func/zip/ZipUpdateEntries.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/func/zip/ZipUpdateEntries.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,6 @@ package org.basex.query.func.zip; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import java.io.*; import java.util.*; @@ -31,7 +30,7 @@ final String in = attribute(elm, HREF, true); // target and temporary output file - final IOFile target = new IOFile(string(toToken(exprs[1], qc))); + final IOFile target = new IOFile(toString(exprs[1], qc)); IOFile out; do { out = new IOFile(target.path() + new Random().nextInt(0x7FFFFFFF)); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryBiConsumer.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryBiConsumer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryBiConsumer.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryBiConsumer.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,21 @@ +package org.basex.query; + +/** + * Function that consumes results. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + * @param the type of the input to the operation + * @param the type of the second argument to the function + */ +@FunctionalInterface +public interface QueryBiConsumer { + /** + * Performs this operation on the given argument. + * + * @param t the first input argument + * @param u the second input argument + * @throws QueryException query exception + */ + void accept(T t, U u) throws QueryException; +} diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryConsumer.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryConsumer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryConsumer.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryConsumer.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,7 @@ package org.basex.query; /** - * Function that supplied results. + * Function that consumes results. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryContext.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryContext.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryContext.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryContext.java 2022-05-14 08:34:33.000000000 +0000 @@ -7,6 +7,7 @@ import java.io.*; import java.util.*; import java.util.Map.*; +import java.util.function.*; import org.basex.build.json.*; import org.basex.build.json.JsonOptions.*; @@ -672,24 +673,16 @@ // create copies of results that will be modified by an update operation final HashSet datas = updates.prepare(this); final StringList dbs = updates.databases(); - final QueryFunction materialize = item -> { - final Data data = item.data(); - final boolean copy = data != null && - (datas.contains(data) || !data.inMemory() && dbs.contains(data.meta.name)); - final Item it = item.materialize(this, copy); - if(it == null) throw BASEX_FUNCTION_X.get(null, item); - return it; - }; final ValueBuilder vb = new ValueBuilder(this); - for(final Item item : value) { - checkStop(); - vb.add(materialize.apply(item)); - } - for(final Item item : updates.output(true)) { - checkStop(); - vb.add(materialize.apply(item)); - } + final QueryConsumer materialize = val -> { + final Predicate test = d -> { + return d != null && (datas.contains(d) || !d.inMemory() && dbs.contains(d.meta.name)); + }; + vb.add(val.materialize(test, null, this)); + }; + materialize.accept(value); + materialize.accept(updates.output(true)); // invalidate current node set in context, apply updates if(context.data() != null) context.invalidate(); @@ -712,9 +705,7 @@ * @throws QueryException query exception */ private Value cast(final Object value, final String type) throws QueryException { - final StaticContext sc = root != null ? root.sc : new StaticContext(this); - - // String input + // interpret string input Object object = value; if(object instanceof String) { final String string = (String) object; @@ -723,8 +714,7 @@ if(string.indexOf('\1') == -1) { strings.add(string); } else { - strings.add(string.split("\1")); - object = strings.toArray(); + object = strings.add(string.split("\1")).toArray(); } // sub types overriding the global value (value \2 type) @@ -740,12 +730,12 @@ } } - // no type specified: return original value or convert Java object + // no type specified: return original value or convert as Java object if(type == null || type.isEmpty()) { return object instanceof Value ? (Value) object : JavaCall.toValue(object, this, null); } - // convert to json + // convert JSON input if(type.equalsIgnoreCase(MainParser.JSON.name())) { try { final JsonParserOptions jp = new JsonParserOptions(); @@ -756,23 +746,11 @@ } } - // test for empty sequence - if(type.equals(QueryText.EMPTY_SEQUENCE + "()")) return Empty.VALUE; - - // convert to the specified type - // [LW] type should be parsed properly - final QNm nm = new QNm(token(type.replaceAll("\\(.*?\\)$", "")), sc); - if(!nm.hasURI() && nm.hasPrefix()) throw NOURI_X.get(null, nm.string()); - - Type tp; - if(Strings.endsWith(type, ')')) { - tp = nm.eq(AtomType.ITEM.qname()) ? AtomType.ITEM : NodeType.find(nm); - if(tp == null) tp = FuncType.find(nm); - } else { - tp = ListType.find(nm); - if(tp == null) tp = AtomType.find(nm, false); - } - if(tp == null) throw WHICHTYPE_X.get(null, type); + // parse target type + final StaticContext sc = root != null ? root.sc : new StaticContext(this); + final SeqType st = new QueryParser(type, null, this, sc).parseSeqType(); + if(st.eq(SeqType.EMPTY_SEQUENCE_Z)) return Empty.VALUE; + final Type tp = st.type; // cast XDM values if(object instanceof Value) { @@ -785,8 +763,8 @@ return vb.value(tp); } + // cast sequences if(object instanceof String[]) { - // cast string array final ValueBuilder vb = new ValueBuilder(this); for(final String string : (String[]) object) vb.add(tp.cast(string, this, null)); return vb.value(tp); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryError.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryError.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryError.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryError.java 2022-05-14 08:34:33.000000000 +0000 @@ -32,7 +32,7 @@ /** Error code. */ BASEX_DBPATH2_X(BASEX, "doc", "Database path '%' yields more than one document."), /** Error code. */ - BASEX_FUNCTION_X(BASEX, "function", "Function items cannot be cached: %."), + BASEX_CACHE_X(BASEX, "cache", "Value cannot be cached: %."), /** Error code. */ BASEX_WHICH_X(BASEX, "function", "Function not found: %."), /** Error code. */ @@ -119,6 +119,15 @@ /** Error code. */ BIN_USO_X(BIN, "unknown-significance-order", "Unknown octet-order value: '%'."), + // Caching Module + + /** Error code. */ + CACHE_IO_X(CACHE, "io", "%"), + /** Error code. */ + CACHE_NAME_X(CACHE, "name", "Invalid name: %."), + /** Error code. */ + CACHE_NOTFOUND_X(CACHE, "not-found", "Cache '%' not found."), + // Client Module /** Error code. */ @@ -218,13 +227,15 @@ /** Error code. */ DB_CONFLICT4_X(DB, "conflict", "Name of source and target is equal: %."), /** Error code. */ + DB_CONFLICT5_X(DB, "conflict", "Resource '%' can only be stored once."), + /** Error code. */ DB_LOCK1_X(DB, "lock", "Database '%' cannot be updated, it is opened by another process."), /** Error code. */ DB_LOCK2_X(DB, "lock", "%"), /** Error code. */ DB_MAINMEM_X(DB, "mainmem", "Database '%' is in main memory."), /** Error code. */ - DB_NAME_X(DB, "name", "Invalid database name: %."), + DB_NAME_X(DB, "name", "Invalid name: %."), /** Error code. */ DB_NOBACKUP_X(DB, "no-backup", "No backup exists for database '%'."), /** Error code. */ @@ -251,8 +262,6 @@ /** Error code. */ FETCH_OPEN_X(FETCH, "open", "%"), /** Error code. */ - FETCH_EXISTS_X(FETCH, "open", "Resource '%' not found."), - /** Error code. */ FETCH_ENCODING_X(FETCH, "encoding", "Unknown encoding '%'."), // File Module @@ -413,21 +422,15 @@ /** Error code. */ REQUEST_PARAMETER(REQUEST, "parameter", "Query string cannot be decoded: %."), - /** Error code. */ - REQUEST_ATTRIBUTE_X(REQUEST, "attribute", "Attribute cannot be stored: %."), // Session Module /** Error code. */ - SESSION_SET_X(SESSION, "set", "Item cannot be stored: %."), - /** Error code. */ SESSION_NOTFOUND(SESSIONS, "not-found", "Session not available."), // Sessions Module /** Error code. */ - SESSIONS_SET_X(SESSIONS, "set", "Item cannot be stored: %."), - /** Error code. */ SESSIONS_NOTFOUND_X(SESSIONS, "not-found", "Session not available: %."), // SQL Module @@ -514,8 +517,6 @@ // WebSocket Module /** Error code. */ - WS_SET_X(WS, "set", "Function items cannot be stored: %."), - /** Error code. */ WS_NOTFOUND_X(WS, "not-found", "Unknown WebSocket: %."), // XQuery Module @@ -599,7 +600,7 @@ /** Error code. */ WHICHRES_X(FODC, 2, "Resource '%' not found."), /** Error code. */ - RESDIR_X(FODC, 2, "URI '%' points to directory."), + RESDIR_X(FODC, 2, "URI '%' points to a directory."), /** Error code. */ INVCOLL_X(FODC, 4, "Invalid collection URI: %."), /** Error code. */ @@ -608,8 +609,6 @@ SAXERR_X(FODC, 6, "SAX: %"), /** Error code. */ RESINV_X(FODC, 7, "Resource path '%' is invalid."), - /** Error code. */ - INVDB_X(FODC, 7, "Invalid database name: '%'."), /** Error code. */ FORMNUM_X(FODF, 1280, "Unknown decimal format: '%'."), @@ -682,7 +681,7 @@ /** Error code. */ INVALIDZONE_X(FORG, 1, "Invalid timezone: %."), /** Error code. */ - FUNCCAST_X_X(FORG, 1, "Cannot convert to %: '%'."), + FUNCCAST_X_X(FORG, 1, "Cannot convert to %: %."), /** Error code. */ FUNCCAST_X_X_X(FORG, 1, "Cannot convert % to %: %."), /** Error code. */ @@ -992,6 +991,8 @@ KEYSPEC(XPST, 3, "No specifier after lookup operator: '%'."), /** Error code. */ ARROWSPEC(XPST, 3, "No specifier after arrow operator: '%'."), + /** Error code. */ + CASTTYPE_X(XPST, 3, "%"), /** Error code. */ STATIC_X(XPST, 5, "No XML Schema support: %."), @@ -1470,6 +1471,7 @@ /** Error type. */ ADMIN(ADMIN_PREFIX, ADMIN_URI), /** Error type. */ BASEX(BASEX_PREFIX, BASEX_URI), /** Error type. */ ARCHIVE(ADMIN_PREFIX, ARCHIVE_URI), + /** Error type. */ CACHE(CACHE_PREFIX, CACHE_URI), /** Error type. */ CLIENT(CLIENT_PREFIX, CLIENT_URI), /** Error type. */ CONVERT(CONVERT_PREFIX, CONVERT_URI), /** Error type. */ CSV(CSV_PREFIX, CSV_URI), diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryParser.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryParser.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryParser.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryParser.java 2022-05-14 08:34:33.000000000 +0000 @@ -220,6 +220,21 @@ } } + + /** + * Parses a sequence type. + * @return sequence type + * @throws QueryException query exception + */ + final SeqType parseSeqType() throws QueryException { + try { + return sequenceType(); + } catch(final QueryException ex) { + Util.debug(ex); + throw CASTTYPE_X.get(null, ex.getLocalizedMessage()); + } + } + /** * Initializes the parsing process. * @throws QueryException query exception diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryResources.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryResources.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryResources.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryResources.java 2022-05-14 08:34:33.000000000 +0000 @@ -455,7 +455,7 @@ // check if input points to a single file final IO io = input.io; if(!io.exists()) throw WHICHRES_X.get(ii, io.path()); - if(single && io.isDir()) throw RESDIR_X.get(ii, io.path()); + if(single && io instanceof IOFile && io.isDir()) throw RESDIR_X.get(ii, io.path()); // overwrite parsing options with default values final boolean mem = !context.options.get(MainOptions.FORCECREATE); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QuerySupplier.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QuerySupplier.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QuerySupplier.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QuerySupplier.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,7 @@ package org.basex.query; /** - * Function that supplied results. + * Function that supplies results. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryText.java basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryText.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/QueryText.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/QueryText.java 2022-05-14 08:34:33.000000000 +0000 @@ -238,10 +238,6 @@ /** Parser token. */ String TERNARY2 = "!!"; /** Parser token. */ String ELVIS = "?:"; - /** Java prefix. */ String JAVAPREF = "java:"; - /** Java keyword: new. */ String NEW = "new"; - /** Java default namespace. */ String JAVALANG = "java.lang."; - // PREFIXES ===================================================================================== /** XQuery prefix. */ byte[] ADMIN_PREFIX = token("admin"); @@ -250,6 +246,7 @@ /** XQuery prefix. */ byte[] ARRAY_PREFIX = token("array"); /** XQuery prefix. */ byte[] BASEX_PREFIX = token("basex"); /** XQuery prefix. */ byte[] BIN_PREFIX = token("bin"); + /** XQuery prefix. */ byte[] CACHE_PREFIX = token("cache"); /** XQuery prefix. */ byte[] CLIENT_PREFIX = token("client"); /** XQuery prefix. */ byte[] CONVERT_PREFIX = token("convert"); /** XQuery prefix. */ byte[] CRYPTO_PREFIX = token("crypto"); @@ -340,6 +337,7 @@ /** BaseX URI. */ String BXMODULES_URL = BASEX_URL + "/modules/"; /** BaseX URI. */ byte[] ADMIN_URI = token(BXMODULES_URL + "admin"); /** BaseX URI. */ byte[] ARCHIVE_URI = token(BXMODULES_URL + "archive"); + /** BaseX URI. */ byte[] CACHE_URI = token(BXMODULES_URL + "cache"); /** BaseX URI. */ byte[] CLIENT_URI = token(BXMODULES_URL + "client"); /** BaseX URI. */ byte[] CONVERT_URI = token(BXMODULES_URL + "convert"); /** BaseX URI. */ byte[] CSV_URI = token(BXMODULES_URL + "csv"); @@ -457,6 +455,10 @@ /** Debugging info. */ String DEBUGLOCAL = "Local Variables"; /** Debugging info. */ String DEBUGGLOBAL = "Global Variables"; + /** Java prefix. */ String JAVAPREF = "java:"; + /** Java keyword: new. */ String NEW = "new"; + /** Java default namespace. */ String JAVALANG = "java.lang."; + /** Example for a Date format. */ String XDATE = "2000-12-31"; /** Example for a Time format. */ String XTIME = "23:59:59.999"; /** Example for a DateTime format. */ String XDTM = XDATE + 'T' + XTIME; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/ContextModifier.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/ContextModifier.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/ContextModifier.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/ContextModifier.java 2022-05-14 08:34:33.000000000 +0000 @@ -129,9 +129,7 @@ } // apply remaining updates based on database names - for(final NameUpdates up : nameUpdates.values()) { - up.apply(false); - } + for(final NameUpdates up : nameUpdates.values()) up.apply(false); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/DataUpdates.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/DataUpdates.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/DataUpdates.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/DataUpdates.java 2022-05-14 08:34:33.000000000 +0000 @@ -158,17 +158,16 @@ * @throws QueryException query exception */ void apply(final QueryContext qc) throws QueryException { - // execute database updates + // apply initial database operations + Collections.sort(dbUpdates); + applyDbUpdates(true); + + // execute updates within databases auc.execute(true); auc = null; - // execute database operations - Collections.sort(dbUpdates); - final int sz = dbUpdates.size(); - for(int i = 0; i < sz; i++) { - dbUpdates.get(i).apply(); - dbUpdates.set(i, null); - } + // apply remaining database operations + applyDbUpdates(false); // execute fn:put operations for(final Put put : puts.values()) put.apply(); @@ -199,6 +198,23 @@ } /** + * Applies all database operations. + * @param before run updates specified before or after node updates + * @throws QueryException query exception + */ + private void applyDbUpdates(final boolean before) throws QueryException { + final int pos = UpdateType._NODE_UPDATES_.ordinal(); + for(final ListIterator iter = dbUpdates.listIterator(); iter.hasNext();) { + final DBUpdate up = iter.next(); + final int ord = up.type.ordinal(); + if(before ? ord < pos : ord > pos) { + up.apply(); + iter.remove(); + } + } + } + + /** * Prepares the {@link NodeUpdate} for execution incl. ordering, * and removes the update primitive references to save memory. * @return ordered list of update primitives @@ -207,17 +223,13 @@ final List upd = new ArrayList<>(); for(int i = nodes.size() - 1; i >= 0; i--) { final int pre = nodes.get(i); - final NodeUpdates n = nodeUpdates.get(pre); - for(final NodeUpdate p : n.finish()) { - upd.add(p); - size += p.size(); + for(final NodeUpdate up : nodeUpdates.get(pre).finish()) { + upd.add(up); + size += up.size(); } } - for(int i = dbUpdates.size() - 1; i >= 0; i--) { - size += dbUpdates.get(i).size(); - } - nodeUpdates = null; nodes = null; + for(final DBUpdate up : dbUpdates) size += up.size(); upd.sort(new NodeUpdateComparator()); return upd; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/NameUpdates.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/NameUpdates.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/NameUpdates.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/NameUpdates.java 2022-05-14 08:34:33.000000000 +0000 @@ -55,7 +55,9 @@ final int pos = UpdateType._NODE_UPDATES_.ordinal(); for(final NameUpdate up : nameUpdates) { final int ord = up.type.ordinal(); - if(before ? ord < pos : ord > pos) up.apply(); + if(before ? ord < pos : ord > pos) { + up.apply(); + } } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/db/DBStore.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/db/DBStore.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/db/DBStore.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/db/DBStore.java 2022-05-14 08:34:33.000000000 +0000 @@ -43,11 +43,11 @@ @Override public void apply() throws QueryException { for(final byte[] path : map) { + final IOFile bin = data.meta.binary(string(path)); + if(bin.isDir()) bin.delete(); + bin.parent().md(); try { - final IOFile file = data.meta.binary(string(path)); - if(file.isDir()) file.delete(); - file.parent().md(); - file.write(map.get(path).input(info)); + bin.write(map.get(path).input(info)); } catch(final IOException ex) { Util.debug(ex); throw UPDBPUT_X.get(info, path); @@ -56,9 +56,12 @@ } @Override - public void merge(final Update update) { - final DBStore put = (DBStore) update; - for(final byte[] path : put.map) map.put(path, put.map.get(path)); + public void merge(final Update update) throws QueryException { + final TokenObjMap store = ((DBStore) update).map; + for(final byte[] path : store) { + if(map.contains(path)) throw DB_CONFLICT5_X.get(info, path); + map.put(path, store.get(path)); + } } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/name/BackupCreate.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/name/BackupCreate.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/name/BackupCreate.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/name/BackupCreate.java 2022-05-14 08:34:33.000000000 +0000 @@ -17,20 +17,24 @@ * @author Lukas Kircher */ public final class BackupCreate extends NameUpdate { - /** Comment. */ + /** Comment string. */ final String comment; + /** Compress flag. */ + final boolean compress; /** * Constructor. * @param name name of database to be backed up * @param comment comment + * @param compress compress data * @param qc query context * @param info input info */ - public BackupCreate(final String name, final String comment, final QueryContext qc, - final InputInfo info) { + public BackupCreate(final String name, final String comment, final boolean compress, + final QueryContext qc, final InputInfo info) { super(UpdateType.BACKUPCREATE, name, qc, info); this.comment = comment; + this.compress = compress; } @Override @@ -40,7 +44,7 @@ @Override public void apply() throws QueryException { try { - CreateBackup.backup(name, comment, qc.context.soptions, null); + CreateBackup.backup(name, comment, compress, qc.context.soptions, null); } catch(final IOException ex) { throw UPDBERROR_X.get(info, ex); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/UpdateType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/UpdateType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/up/primitives/UpdateType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/up/primitives/UpdateType.java 2022-05-14 08:34:33.000000000 +0000 @@ -26,6 +26,8 @@ /** Alter backup. */ BACKUPALTER, /** Create backup. */ BACKUPCREATE, + /** Add binary resource. */ DBSTORE, + // Operations on nodes of existing databases /** Dummy type, indicating start of node updates. */ _NODE_UPDATES_, @@ -45,7 +47,6 @@ // Operations on resources of existing databases /** Add document. */ DBADD, - /** Add binary resource. */ DBSTORE, /** Rename resource. */ DBRENAME, /** Delete resource. */ DBDELETE, /** Optimize database. */ DBOPTIMIZE, diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/util/NSGlobal.java basex-9.7.2/basex-core/src/main/java/org/basex/query/util/NSGlobal.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/util/NSGlobal.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/util/NSGlobal.java 2022-05-14 08:34:33.000000000 +0000 @@ -57,6 +57,7 @@ // namespaces of built-in modules NS.add(ADMIN_PREFIX, ADMIN_URI); NS.add(ARCHIVE_PREFIX, ARCHIVE_URI); + NS.add(CACHE_PREFIX, CACHE_URI); NS.add(CLIENT_PREFIX, CLIENT_URI); NS.add(CONVERT_PREFIX, CONVERT_URI); NS.add(CSV_PREFIX, CSV_URI); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/array/XQArray.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/array/XQArray.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/array/XQArray.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/array/XQArray.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,8 +3,13 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; import java.util.*; +import java.util.function.*; +import org.basex.core.*; +import org.basex.data.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.func.fn.*; import org.basex.query.util.collation.*; @@ -182,6 +187,14 @@ public abstract XQArray remove(long pos, QueryContext qc); @Override + public void write(final DataOutput out) throws IOException, QueryException { + out.writeLong(arraySize()); + for(final Value member : members()) { + Cache.write(out, member); + } + } + + @Override public final void cache(final boolean lazy, final InputInfo ii) throws QueryException { for(final Value value : members()) value.cache(lazy, ii); } @@ -329,13 +342,28 @@ } @Override - public Item materialize(final QueryContext qc, final boolean copy) throws QueryException { + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + + if(materialized(test, ii)) return this; + + final ArrayBuilder ab = new ArrayBuilder(); for(final Value value : members()) { - for(final Item item : value) { - if(item.persistent() || item.materialize(null, false) == null) return null; + qc.checkStop(); + ab.append(value.materialize(test, ii, qc)); + } + return ab.array(this); + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + if(!(funcType().declType.type.instanceOf(AtomType.ANY_ATOMIC_TYPE))) { + for(final Value value : members()) { + if(!value.materialized(test, ii)) return false; } } - return this; + return true; } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/AStr.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/AStr.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/AStr.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/AStr.java 2022-05-14 08:34:33.000000000 +0000 @@ -24,10 +24,10 @@ /** * Constructor, specifying a type and value. - * @param type atomic type * @param value value + * @param type atomic type */ - AStr(final AtomType type, final byte[] value) { + AStr(final byte[] value, final Type type) { super(type); this.value = value; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/B64.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/B64.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/B64.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/B64.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,8 +1,10 @@ package org.basex.query.value.item; +import java.io.*; import java.util.*; import org.basex.core.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -29,10 +31,18 @@ } /** + * Constructor. + * @param data binary data + */ + private B64(final byte[] data) { + super(data, AtomType.BASE64_BINARY); + } + + /** * Empty constructor. */ B64() { - super(null, AtomType.BASE64_BINARY); + this(null); } /** @@ -75,12 +85,9 @@ return get(parse(value, ii)); } - /** - * Constructor. - * @param data binary data - */ - private B64(final byte[] data) { - super(data, AtomType.BASE64_BINARY); + @Override + public void write(final DataOutput out) throws IOException { + out.writeToken(data); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/B64Lazy.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/B64Lazy.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/B64Lazy.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/B64Lazy.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,11 +1,13 @@ package org.basex.query.value.item; import java.io.*; +import java.util.function.*; +import org.basex.data.*; import org.basex.io.*; import org.basex.io.in.*; import org.basex.query.*; -import org.basex.query.func.*; +import org.basex.query.func.Function; import org.basex.util.*; /** @@ -70,6 +72,20 @@ } @Override + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + cache(ii); + return this; + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + cache(ii); + return true; + } + + @Override public void toString(final QueryString qs) { if(isCached()) { super.toString(qs); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Bln.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Bln.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Bln.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Bln.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,9 @@ package org.basex.query.value.item; +import java.io.*; import java.math.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -60,6 +62,11 @@ } @Override + public void write(final DataOutput out) throws IOException { + out.writeBool(value); + } + + @Override public byte[] string(final InputInfo ii) { return Token.token(value); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/DTDur.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/DTDur.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/DTDur.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/DTDur.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,9 +4,11 @@ import static org.basex.query.QueryText.*; import static org.basex.query.value.item.Dec.*; +import java.io.*; import java.math.*; import java.util.regex.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -127,6 +129,11 @@ if(d <= Long.MIN_VALUE || d >= Long.MAX_VALUE) throw SECRANGE_X.get(ii, d); } + @Override + public void write(final DataOutput out) throws IOException { + out.writeToken(string(null)); + } + /** * Returns the date and time. * @return year diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/FItem.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/FItem.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/FItem.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/FItem.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,6 +2,9 @@ import static org.basex.query.QueryError.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.expr.*; import org.basex.query.func.*; @@ -59,6 +62,18 @@ return (FuncType) type; } + @Override + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + throw BASEX_CACHE_X.get(ii, this); + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + throw BASEX_CACHE_X.get(ii, this); + } + /** * Coerces this function item to the given function type. * @param ft function type diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Flt.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Flt.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Flt.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Flt.java 2022-05-14 08:34:33.000000000 +0000 @@ -44,6 +44,17 @@ Float.isNaN(value) ? NAN : new Flt(value); } + /** + * Returns an instance of this class. + * @param value value + * @param ii input info + * @return instance + * @throws QueryException query exception + */ + public static Flt get(final byte[] value, final InputInfo ii) throws QueryException { + return get(parse(value, ii)); + } + @Override public byte[] string() { return Token.token(value); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/FuncItem.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/FuncItem.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/FuncItem.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/FuncItem.java 2022-05-14 08:34:33.000000000 +0000 @@ -225,11 +225,6 @@ } @Override - public Item materialize(final QueryContext qc, final boolean copy) { - return null; - } - - @Override public boolean deep(final Item item, final Collation coll, final InputInfo ii) throws QueryException { throw FICMP_X_X.get(info, type, this); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Hex.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Hex.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Hex.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Hex.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,8 +1,10 @@ package org.basex.query.value.item; +import java.io.*; import java.util.*; import org.basex.core.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -30,7 +32,7 @@ * @throws QueryException query exception */ public Hex(final byte[] value, final InputInfo ii) throws QueryException { - super(parse(Token.trim(value), ii), AtomType.HEX_BINARY); + this(parse(Token.trim(value), ii)); } /** @@ -44,6 +46,11 @@ } @Override + public void write(final DataOutput out) throws IOException { + out.writeToken(data); + } + + @Override public byte[] string(final InputInfo ii) throws QueryException { return Token.hex(binary(ii), true); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Int.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Int.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Int.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Int.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,9 @@ package org.basex.query.value.item; +import java.io.*; import java.math.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -74,6 +76,11 @@ } @Override + public void write(final DataOutput out) throws IOException { + out.writeLong(value); + } + + @Override public byte[] string() { return value == 0 ? Token.ZERO : Token.token(value); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Item.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Item.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Item.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Item.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,10 +3,13 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; import java.math.*; +import java.util.function.*; import org.basex.data.*; import org.basex.io.in.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.expr.*; import org.basex.query.iter.*; @@ -39,6 +42,11 @@ } @Override + public void write(final DataOutput out) throws IOException, QueryException { + out.writeToken(string(null)); + } + + @Override public BasicIter iter() { return new BasicIter(1) { @Override @@ -67,6 +75,11 @@ } @Override + public boolean sameType() { + return true; + } + + @Override public final Item reverse(final QueryContext qc) { return this; } @@ -262,19 +275,19 @@ return 1; } - /** - * Returns a materialized, context-independent version of this item. - * @param qc query context (if {@code null}, process cannot be interrupted) - * @param copy create full copy - * @return item copy, or {@code null}) if the item cannot be materialized - * @throws QueryException query exception - */ - @SuppressWarnings("unused") - public Item materialize(final QueryContext qc, final boolean copy) throws QueryException { + @Override + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { return this; } @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + return true; + } + + @Override public SeqType seqType() { return type.seqType(); } @@ -294,15 +307,6 @@ } /** - * Indicates if this item references a persistent database. - * @return result of check - */ - public final boolean persistent() { - final Data data = data(); - return data != null && !data.inMemory(); - } - - /** * Returns a score value. Overwritten by {@link FTNode}. * @return score value */ diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/QNm.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/QNm.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/QNm.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/QNm.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,11 +3,14 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; +import static org.basex.util.Token.normalize; +import java.io.*; import java.util.regex.*; import javax.xml.namespace.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.*; import org.basex.query.util.collation.*; @@ -125,6 +128,13 @@ this(name(prefix, local), uri); } + @Override + public void write(final DataOutput out) throws IOException { + out.writeToken(name); + out.writeBool(uri != null); + if(uri != null) out.writeToken(uri); + } + /** * Creates the name string. * @param prefix prefix diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Str.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Str.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Str.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Str.java 2022-05-14 08:34:33.000000000 +0000 @@ -34,8 +34,8 @@ * @param value value * @param type item type */ - public Str(final byte[] value, final AtomType type) { - super(type, value); + private Str(final byte[] value, final Type type) { + super(value, type); } /** @@ -49,6 +49,16 @@ /** * Returns an instance of this class. + * @param value value + * @param type type + * @return instance + */ + public static Str get(final byte[] value, final AtomType type) { + return type == AtomType.STRING ? get(value) : new Str(value, type); + } + + /** + * Returns an instance of this class. * @param value string * @return instance */ @@ -70,7 +80,7 @@ if(value == null) return Str.EMPTY; final boolean validate = qc.context.options.get(MainOptions.CHECKSTRINGS); - final byte[] bytes = Token.token(value.toString()); + final byte[] bytes = Token.token(value); // check if string is valid boolean valid = true; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/StrLazy.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/StrLazy.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/StrLazy.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/StrLazy.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,11 +2,13 @@ import java.io.*; import java.util.*; +import java.util.function.*; +import org.basex.data.*; import org.basex.io.*; import org.basex.io.in.*; import org.basex.query.*; -import org.basex.query.func.*; +import org.basex.query.func.Function; import org.basex.util.*; /** @@ -98,6 +100,20 @@ } @Override + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + cache(ii); + return this; + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + cache(ii); + return true; + } + + @Override public boolean equals(final Object obj) { if(this == obj) return true; if(obj instanceof StrLazy) { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Uri.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Uri.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/Uri.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/Uri.java 2022-05-14 08:34:33.000000000 +0000 @@ -30,7 +30,7 @@ * @param value value */ private Uri(final byte[] value) { - super(AtomType.ANY_URI, value); + super(value, AtomType.ANY_URI); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/YMDur.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/YMDur.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/item/YMDur.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/item/YMDur.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,9 +3,11 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; import java.math.*; import java.util.regex.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.value.type.*; @@ -79,6 +81,11 @@ sec = BigDecimal.ZERO; } + @Override + public void write(final DataOutput out) throws IOException { + out.writeToken(string(null)); + } + /** * Returns the years and months. * @return year diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieBranch.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieBranch.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieBranch.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieBranch.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,5 +1,8 @@ package org.basex.query.value.map; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.util.list.*; @@ -216,18 +219,18 @@ } @Override - boolean materialized() throws QueryException { + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { for(final TrieNode nd : kids) { - if(nd != null && !nd.materialized()) return false; + if(nd != null && !nd.materialized(test, ii)) return false; } return true; } @Override - void forEach(final ValueBuilder vb, final FItem func, final QueryContext qc, final InputInfo ii) - throws QueryException { + void apply(final QueryBiConsumer func) throws QueryException { for(final TrieNode nd : kids) { - if(nd != null) nd.forEach(vb, func, qc, ii); + if(nd != null) nd.apply(func); } } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieLeaf.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieLeaf.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieLeaf.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieLeaf.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,9 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.util.list.*; @@ -208,17 +211,13 @@ } @Override - boolean materialized() throws QueryException { - for(final Item item : value) { - if(item.persistent() || item.materialize(null, false) == null) return false; - } - return true; + boolean materialized(final Predicate test, final InputInfo ii) throws QueryException { + return value.materialized(test, ii); } @Override - void forEach(final ValueBuilder vb, final FItem func, final QueryContext qc, final InputInfo ii) - throws QueryException { - vb.add(func.invoke(qc, ii, key, value)); + void apply(final QueryBiConsumer func) throws QueryException { + func.accept(key, value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieList.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieList.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieList.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieList.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,7 +4,9 @@ import static org.basex.query.QueryText.*; import java.util.*; +import java.util.function.*; +import org.basex.data.*; import org.basex.query.*; import org.basex.query.util.collation.*; import org.basex.query.util.list.*; @@ -296,19 +298,17 @@ } @Override - boolean materialized() throws QueryException { + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { for(final Value value : values) { - for(final Item item : value) { - if(item.persistent() || item.materialize(null, false) == null) return false; - } + if(!value.materialized(test, ii)) return false; } return true; } @Override - void forEach(final ValueBuilder vb, final FItem func, final QueryContext qc, final InputInfo ii) - throws QueryException { - for(int i = 0; i < size; i++) vb.add(func.invoke(qc, ii, keys[i], values[i])); + void apply(final QueryBiConsumer func) throws QueryException { + for(int i = 0; i < size; i++) func.accept(keys[i], values[i]); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieNode.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieNode.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/TrieNode.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/TrieNode.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,6 +2,9 @@ import static org.basex.query.QueryText.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.func.fn.*; import org.basex.query.util.collation.*; @@ -55,7 +58,7 @@ @Override void cache(final boolean lazy, final InputInfo ii) { } @Override - boolean materialized() { return true; } + boolean materialized(final Predicate test, final InputInfo ii) { return true; } @Override boolean instanceOf(final AtomType kt, final SeqType dt) { return true; } @Override @@ -67,8 +70,7 @@ public TrieNode put(final int hash, final Item key, final Value value, final int level, final InputInfo ii) { return new TrieLeaf(hash, key, value); } @Override - void forEach(final ValueBuilder vb, final FItem func, final QueryContext qc, - final InputInfo ii) { } + void apply(final QueryBiConsumer func) { } @Override StringBuilder append(final StringBuilder sb, final String indent) { return sb.append("{ }"); } @Override @@ -77,6 +79,7 @@ /** Size of this node. */ final int size; + /** * Constructor. * @param size size @@ -213,22 +216,20 @@ abstract void cache(boolean lazy, InputInfo ii) throws QueryException; /** - * Checks if all values are materialized. + * Checks if all value of this node are materialized. + * @param test test for copying nodes + * @param ii input info * @return result of check * @throws QueryException query exception */ - abstract boolean materialized() throws QueryException; + abstract boolean materialized(Predicate test, InputInfo ii) throws QueryException; /** * Applies a function on all entries. - * @param vb value builder * @param func function to apply on keys and values - * @param qc query context - * @param ii input info * @throws QueryException query exception */ - abstract void forEach(ValueBuilder vb, FItem func, QueryContext qc, InputInfo ii) - throws QueryException; + abstract void apply(QueryBiConsumer func) throws QueryException; /** * Calculates the hash key for the given level. diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/XQMap.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/XQMap.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/map/XQMap.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/map/XQMap.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,9 +3,13 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; import java.util.*; import java.util.function.*; +import org.basex.core.*; +import org.basex.data.*; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.expr.*; import org.basex.query.util.collation.*; @@ -66,6 +70,15 @@ } @Override + public void write(final DataOutput out) throws IOException, QueryException { + out.writeNum(mapSize()); + for(final Item key : keys()) { + Cache.write(out, key); + Cache.write(out, get(key, null)); + } + } + + @Override public QNm paramName(final int pos) { return new QNm("key", ""); } @@ -148,8 +161,24 @@ } @Override - public Item materialize(final QueryContext qc, final boolean copy) throws QueryException { - return root.materialized() ? this : null; + public Item materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + + if(materialized(test, ii)) return this; + + XQMap map = EMPTY; + for(final Item key : keys()) { + qc.checkStop(); + map = map.put(key, get(key, ii).materialize(test, ii, qc), ii); + } + return map; + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + return funcType().declType.type.instanceOf(AtomType.ANY_ATOMIC_TYPE) || + root.materialized(test, ii); } @Override @@ -169,7 +198,6 @@ SeqType dt = ft.declType; if(dt.eq(SeqType.ITEM_ZM)) dt = null; - return kt == null && dt == null || root.instanceOf(kt, dt); } @@ -183,7 +211,6 @@ */ public XQMap put(final Item key, final Value value, final InputInfo ii) throws QueryException { if(this == EMPTY) return entry(key, value, ii); - final TrieNode ins = root.put(key.hash(ii), key, value, 0, ii); return ins == root ? this : new XQMap(ins, union(key.type, value.seqType())); } @@ -230,16 +257,10 @@ /** * Applies a function on all entries. * @param func function to apply on keys and values - * @param qc query context - * @param ii input info - * @return value builder * @throws QueryException query exception */ - public ValueBuilder forEach(final FItem func, final QueryContext qc, final InputInfo ii) - throws QueryException { - final ValueBuilder vb = new ValueBuilder(qc); - root.forEach(vb, func, qc, ii); - return vb; + public void apply(final QueryBiConsumer func) throws QueryException { + root.apply(func); } @Override @@ -254,7 +275,7 @@ @Override public HashMap toJava() throws QueryException { final HashMap map = new HashMap<>(root.size); - for(final Item key : keys()) map.put(key.toJava(), get(key, null).toJava()); + apply((key, value) -> map.put(key.toJava(), value.toJava())); return map; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/ANode.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/ANode.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/ANode.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/ANode.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,10 +1,15 @@ package org.basex.query.value.node; +import java.io.*; import java.util.concurrent.atomic.*; +import java.util.function.*; import org.basex.api.dom.*; import org.basex.core.*; import org.basex.data.*; +import org.basex.io.out.*; +import org.basex.io.out.DataOutput; +import org.basex.io.serial.*; import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; @@ -45,6 +50,13 @@ } @Override + public final void write(final DataOutput out) throws IOException { + final ArrayOutput ao = new ArrayOutput(); + Serializer.get(ao, SerializerMode.NOINDENT.get()).serialize(this); + out.writeToken(ao.finish()); + } + + @Override public final boolean bool(final InputInfo ii) { return true; } @@ -108,7 +120,13 @@ } @Override - public abstract ANode materialize(QueryContext qc, boolean copy) throws QueryException; + public abstract ANode materialize(Predicate test, InputInfo ii, QueryContext qc) + throws QueryException; + + @Override + public final boolean materialized(final Predicate test, final InputInfo ii) { + return test.test(data()); + } /** * Creates a database node copy from this node. diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/DBNode.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/DBNode.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/DBNode.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/DBNode.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,7 @@ import static org.basex.query.QueryText.*; import java.io.*; +import java.util.function.*; import org.basex.api.dom.*; import org.basex.build.*; @@ -10,7 +11,7 @@ import org.basex.data.*; import org.basex.io.*; import org.basex.query.*; -import org.basex.query.func.*; +import org.basex.query.func.Function; import org.basex.query.iter.*; import org.basex.query.value.*; import org.basex.query.value.item.*; @@ -222,8 +223,9 @@ } @Override - public final DBNode materialize(final QueryContext qc, final boolean copy) throws QueryException { - return copy ? copy(qc) : this; + public final DBNode materialize(final Predicate test, final InputInfo ii, + final QueryContext qc) throws QueryException { + return materialized(test, ii) ? this : copy(qc); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FAttr.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FAttr.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FAttr.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FAttr.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,9 +3,13 @@ import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; +import org.basex.util.*; import org.basex.util.list.*; import org.w3c.dom.*; @@ -70,8 +74,8 @@ } @Override - public FAttr materialize(final QueryContext qc, final boolean copy) { - return copy ? new FAttr(name, value) : this; + public FAttr materialize(final Predicate test, final InputInfo ii, final QueryContext qc) { + return materialized(test, ii) ? this : new FAttr(name, value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FComm.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FComm.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FComm.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FComm.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,9 @@ import static org.basex.query.QueryError.*; import static org.basex.util.Token.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.type.*; import org.basex.util.*; @@ -45,8 +48,8 @@ } @Override - public FComm materialize(final QueryContext qc, final boolean copy) { - return copy ? new FComm(value) : this; + public FComm materialize(final Predicate test, final InputInfo ii, final QueryContext qc) { + return materialized(test, ii) ? this : new FComm(value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FDoc.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FDoc.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FDoc.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FDoc.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,6 +2,9 @@ import static org.basex.query.QueryText.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.iter.*; import org.basex.query.util.list.*; @@ -110,8 +113,8 @@ } @Override - public FDoc materialize(final QueryContext qc, final boolean copy) { - return copy ? new FDoc(children, uri).optimize() : this; + public FDoc materialize(final Predicate test, final InputInfo ii, final QueryContext qc) { + return materialized(test, ii) ? this : new FDoc(children, uri).optimize(); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FElem.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FElem.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FElem.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FElem.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,7 +4,9 @@ import static org.basex.util.Token.*; import java.util.*; +import java.util.function.*; +import org.basex.data.*; import org.basex.query.*; import org.basex.query.iter.*; import org.basex.query.util.list.*; @@ -384,8 +386,10 @@ } @Override - public FElem materialize(final QueryContext qc, final boolean copy) throws QueryException { - if(!copy) return this; + public FElem materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + + if(materialized(test, ii)) return this; // nodes must be added after root constructor in order to ensure ascending node ids final Atts nsp = namespaces != null ? new Atts(namespaces) : null; @@ -393,10 +397,10 @@ final ANodeList ch = children != null ? new ANodeList(children.size()) : null; final FElem node = new FElem(name, nsp, at, ch); if(at != null) { - for(final ANode attr : attributes) at.add(attr.materialize(qc, true)); + for(final ANode attr : attributes) at.add(attr.materialize(test, ii, qc)); } if(ch != null) { - for(final ANode child : children) ch.add(child.materialize(qc, true)); + for(final ANode child : children) ch.add(child.materialize(test, ii, qc)); } return node.optimize(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FNSpace.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FNSpace.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FNSpace.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FNSpace.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,6 +2,9 @@ import static org.basex.query.QueryText.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; @@ -39,8 +42,9 @@ } @Override - public FNSpace materialize(final QueryContext qc, final boolean copy) { - return copy ? new FNSpace(name, value) : this; + public FNSpace materialize(final Predicate test, final InputInfo ii, + final QueryContext qc) { + return materialized(test, ii) ? this : new FNSpace(name, value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FPI.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FPI.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FPI.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FPI.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,6 +4,9 @@ import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; @@ -65,8 +68,8 @@ } @Override - public FPI materialize(final QueryContext qc, final boolean copy) { - return copy ? new FPI(name, value) : this; + public FPI materialize(final Predicate test, final InputInfo ii, final QueryContext qc) { + return materialized(test, ii) ? this : new FPI(name, value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FTNode.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FTNode.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FTNode.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FTNode.java 2022-05-14 08:34:33.000000000 +0000 @@ -7,7 +7,7 @@ import org.basex.util.ft.*; /** - * Disk-based full-text Node item. + * Database node with full-text matches. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FTxt.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FTxt.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/node/FTxt.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/node/FTxt.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,5 +1,8 @@ package org.basex.query.value.node; +import java.util.function.*; + +import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.type.*; import org.basex.util.*; @@ -39,8 +42,8 @@ } @Override - public FTxt materialize(final QueryContext qc, final boolean copy) { - return copy ? new FTxt(value) : this; + public FTxt materialize(final Predicate test, final InputInfo ii, final QueryContext qc) { + return materialized(test, ii) ? this : new FTxt(value); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/BlnSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/BlnSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/BlnSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/BlnSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,10 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; @@ -29,6 +32,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final boolean[] values = new boolean[size]; + for(int s = 0; s < size; s++) values[s] = in.readBool(); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final boolean v : values) out.writeBool(v); + } + @Override public Bln itemAt(final long pos) { return Bln.get(values[(int) pos]); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/BytSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/BytSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/BytSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/BytSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,10 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; @@ -27,6 +30,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final byte[] values = new byte[size]; + for(int s = 0; s < size; s++) values[s] = (byte) in.readNum(); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final byte v : values) out.writeNum(v); + } + @Override public Int itemAt(final long pos) { return new Int(values[(int) pos], type); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DblSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DblSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DblSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DblSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,11 +1,15 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; +import org.basex.util.*; import org.basex.util.list.*; /** @@ -27,6 +31,29 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException, QueryException { + final int size = in.readNum(); + final double[] values = new double[size]; + for(int s = 0; s < size; s++) values[s] = Dbl.parse(in.readToken(), null); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final double v : values) out.writeToken(Token.token(v)); + } + @Override public Dbl itemAt(final long pos) { return Dbl.get(values[(int) pos]); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DBNodeSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DBNodeSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DBNodeSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DBNodeSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,6 +4,7 @@ import static org.basex.query.func.Function.*; import java.util.*; +import java.util.function.*; import org.basex.data.*; import org.basex.query.*; @@ -125,6 +126,12 @@ } @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + return test.test(data); + } + + @Override public boolean equals(final Object obj) { if(this == obj) return true; if(!(obj instanceof DBNodeSeq)) return super.equals(obj); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DecSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DecSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/DecSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/DecSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,12 @@ package org.basex.query.value.seq; +import static org.basex.util.Token.*; + +import java.io.*; import java.math.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; @@ -27,6 +32,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final BigDecimal[] values = new BigDecimal[size]; + for(int s = 0; s < size; s++) values[s] = new BigDecimal(Token.string(in.readToken())); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final BigDecimal v : values) out.writeToken(chopNumber(token(v.toPlainString()))); + } + @Override public Dec itemAt(final long pos) { return Dec.get(values[(int) pos]); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/FltSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/FltSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/FltSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/FltSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,11 +1,15 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; +import org.basex.util.*; import org.basex.util.list.*; /** @@ -27,6 +31,29 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException, QueryException { + final int size = in.readNum(); + final float[] values = new float[size]; + for(int s = 0; s < size; s++) values[s] = Flt.parse(in.readToken(), null); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final double v : values) out.writeToken(Token.token(v)); + } + @Override public Flt itemAt(final long pos) { return Flt.get(values[(int) pos]); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/IntSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/IntSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/IntSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/IntSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,10 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; @@ -30,6 +33,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final long[] values = new long[size]; + for(int s = 0; s < size; s++) values[s] = in.readLong(); + return get(values, type); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final long v : values) out.writeLong(v); + } + @Override public Int itemAt(final long pos) { return Int.get(values[(int) pos], type); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/NativeSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/NativeSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/NativeSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/NativeSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -42,6 +42,11 @@ return size; } + @Override + public boolean sameType() { + return true; + } + /** * {@inheritDoc} * Because this function will mostly be invoked recursively, the standard implementation diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/RangeSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/RangeSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/RangeSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/RangeSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,8 +3,14 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; +import java.util.function.*; + +import org.basex.data.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; -import org.basex.query.func.*; +import org.basex.query.func.Function; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.type.*; @@ -46,6 +52,28 @@ } /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final long size = in.readLong(), start = in.readLong(); + final boolean asc = in.readBool(); + return get(start, size, asc); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeLong(size); + out.writeLong(start); + out.writeBool(asc); + } + + /** * Returns the range as long values. * @param order respect ascending/descending order * @return minimum and maximum value (inclusive) @@ -107,6 +135,17 @@ } @Override + public boolean sameType() { + return true; + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + return true; + } + + @Override public boolean equals(final Object obj) { if(this == obj) return true; if(!(obj instanceof RangeSeq)) return super.equals(obj); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/Seq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/Seq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/Seq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/Seq.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,11 @@ import static org.basex.query.QueryError.*; import static org.basex.query.QueryText.*; +import java.io.*; +import java.util.function.*; + +import org.basex.data.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; @@ -207,6 +212,16 @@ } @Override + public boolean sameType() { + final BasicIter iter = iter(); + final Type tp = iter.next().type; + for(Item item; (item = iter.next()) != null;) { + if(!tp.eq(item.type)) return false; + } + return true; + } + + @Override public Value atomValue(final QueryContext qc, final InputInfo ii) throws QueryException { final ValueBuilder vb = new ValueBuilder(qc); for(final Item item : this) vb.add(item.atomValue(qc, ii)); @@ -252,6 +267,31 @@ } @Override + public Value materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + + if(materialized(test, ii)) return this; + + final ValueBuilder vb = new ValueBuilder(qc); + for(final Item item : this) { + qc.checkStop(); + vb.add(item.materialize(test, ii, qc)); + } + return vb.value(this); + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + if(!type.instanceOf(AtomType.ANY_ATOMIC_TYPE)) { + for(final Item item : this) { + if(!item.materialized(test, ii)) return false; + } + } + return true; + } + + @Override public boolean equals(final Object obj) { if(this == obj) return true; if(!(obj instanceof Seq)) return false; @@ -308,6 +348,21 @@ // STATIC METHODS =============================================================================== /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + * @throws QueryException query exception + */ + @SuppressWarnings("unused") + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException, QueryException { + throw Util.notExpected(); + } + + /** * Tries to create a typed sequence with the items of the specified values. * @param size size of resulting sequence * @param values values diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/ShrSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/ShrSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/ShrSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/ShrSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,7 +1,10 @@ package org.basex.query.value.seq; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; @@ -27,6 +30,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final short[] values = new short[size]; + for(int s = 0; s < size; s++) values[s] = (short) in.readNum(); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final short v : values) out.writeNum(v); + } + @Override public Int itemAt(final long pos) { return new Int(values[(int) pos], type); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/SingletonSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/SingletonSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/SingletonSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/SingletonSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,6 +3,13 @@ import static org.basex.query.QueryError.*; import static org.basex.query.func.Function.*; +import java.io.*; +import java.util.function.*; + +import org.basex.core.*; +import org.basex.data.*; +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.CompileContext.*; import org.basex.query.expr.*; @@ -13,7 +20,7 @@ import org.basex.util.*; /** - * Sequence of a single item. + * Singleton value sequence. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen @@ -32,6 +39,28 @@ this.value = value; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + * @throws QueryException query exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException, QueryException { + final long count = in.readLong(); + final Value value = Cache.read(in, qc); + return get(value, count); + } + + @Override + public void write(final DataOutput out) throws IOException, QueryException { + out.writeLong(size / value.size()); + Cache.write(out, value); + } + @Override public Item ebv(final QueryContext qc, final InputInfo ii) throws QueryException { final Item head = value.itemAt(0); @@ -92,6 +121,18 @@ } @Override + public Value materialize(final Predicate test, final InputInfo ii, final QueryContext qc) + throws QueryException { + return materialized(test, ii) ? this : new SingletonSeq(size, value.materialize(test, ii, qc)); + } + + @Override + public boolean materialized(final Predicate test, final InputInfo ii) + throws QueryException { + return value.materialized(test, ii); + } + + @Override public String description() { return "singleton " + super.description(); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/StrSeq.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/StrSeq.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/seq/StrSeq.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/seq/StrSeq.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,5 +1,9 @@ package org.basex.query.value.seq; +import java.io.*; + +import org.basex.io.in.DataInput; +import org.basex.io.out.DataOutput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; @@ -26,6 +30,28 @@ this.values = values; } + /** + * Creates a value from the input stream. + * @param in data input + * @param type type + * @param qc query context + * @return value + * @throws IOException I/O exception + */ + public static Value read(final DataInput in, final Type type, final QueryContext qc) + throws IOException { + final int size = in.readNum(); + final byte[][] values = new byte[size][]; + for(int s = 0; s < size; s++) values[s] = in.readToken(); + return get(values); + } + + @Override + public void write(final DataOutput out) throws IOException { + out.writeNum((int) size); + for(final byte[] v : values) out.writeToken(v); + } + @Override public Str itemAt(final long pos) { return Str.get(values[(int) pos]); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/ArrayType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/ArrayType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/ArrayType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/ArrayType.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,8 +2,12 @@ import static org.basex.query.QueryError.*; +import java.io.*; + +import org.basex.core.*; +import org.basex.io.in.DataInput; import org.basex.query.*; -import org.basex.query.value.array.XQArray; +import org.basex.query.value.array.*; import org.basex.query.value.item.*; import org.basex.util.*; @@ -37,6 +41,14 @@ } @Override + public XQArray read(final DataInput in, final QueryContext qc) + throws IOException, QueryException { + final ArrayBuilder ab = new ArrayBuilder(); + for(int s = in.readNum() - 1; s >= 0; s--) ab.append(Cache.read(in, qc)); + return ab.array(); + } + + @Override public boolean eq(final Type type) { return this == type || type instanceof ArrayType && declType.eq(((ArrayType) type).declType); } @@ -88,6 +100,11 @@ return argTypes[0].type.atomic(); } + @Override + public ID id() { + return Type.ID.ARRAY; + } + /** * Creates a new array type. * @param declType declared return type diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/AtomType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/AtomType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/AtomType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/AtomType.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,6 +4,7 @@ import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; +import java.io.*; import java.math.*; import java.util.*; import java.util.function.*; @@ -11,10 +12,12 @@ import javax.xml.namespace.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.util.*; +import org.basex.util.list.*; import org.basex.util.similarity.*; /** @@ -45,7 +48,7 @@ } @Override public Atm cast(final Object value, final QueryContext qc, final InputInfo ii) { - return Atm.get(value.toString()); + return Atm.get(token(value)); } }, @@ -58,7 +61,11 @@ } @Override public Atm cast(final Object value, final QueryContext qc, final InputInfo ii) { - return Atm.get(value.toString()); + return Atm.get(token(value)); + } + @Override + public Atm read(final DataInput in, final QueryContext qc) throws IOException { + return Atm.get(in.readToken()); } }, @@ -71,9 +78,13 @@ } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return Str.get(value, qc, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken()); + } }, /** Normalized String type. */ @@ -81,20 +92,20 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - - final byte[] str = item.string(ii); - final int sl = str.length; - for(int s = 0; s < sl; s++) { - final byte b = str[s]; - if(b == '\t' || b == '\r' || b == '\n') str[s] = ' '; - } - return new Str(str, this); + final byte[] token = item.string(ii); + final ByteList bl = new ByteList(token.length); + for(final byte b : token) bl.add(b == '\t' || b == '\r' || b == '\n' ? ' ' : b); + return Str.get(bl.finish(), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** Token type. */ @@ -102,13 +113,17 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return new Str(normalize(item.string(ii)), this); + return Str.get(normalize(item.string(ii)), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** Language type. */ @@ -117,14 +132,18 @@ public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { final byte[] v = normalize(item.string(ii)); - if(!LANGPATTERN.matcher(Token.string(v)).matches()) throw castError(item, ii); - return new Str(v, this); + if(!LANGPATTERN.matcher(string(v)).matches()) throw castError(item, ii); + return Str.get(v, this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** NMTOKEN type. */ @@ -134,13 +153,17 @@ final InputInfo ii) throws QueryException { final byte[] v = normalize(item.string(ii)); if(!XMLToken.isNMToken(v)) throw castError(item, ii); - return new Str(v, this); + return Str.get(v, this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** Name type. */ @@ -150,13 +173,17 @@ final InputInfo ii) throws QueryException { final byte[] v = normalize(item.string(ii)); if(!XMLToken.isName(v)) throw castError(item, ii); - return new Str(v, this); + return Str.get(v, this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** NCName type. */ @@ -164,13 +191,17 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return new Str(checkName(item, ii), this); + return Str.get(checkName(item, ii), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** ID type. */ @@ -178,13 +209,17 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return new Str(checkName(item, ii), this); + return Str.get(checkName(item, ii), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** IDREF type. */ @@ -192,13 +227,17 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return new Str(checkName(item, ii), this); + return Str.get(checkName(item, ii), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** Entity type. */ @@ -206,13 +245,17 @@ @Override public Str cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return new Str(checkName(item, ii), this); + return Str.get(checkName(item, ii), this); } @Override public Str cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Str read(final DataInput in, final QueryContext qc) throws IOException { + return Str.get(in.readToken(), this); + } }, /** Numeric type. */ @@ -225,7 +268,7 @@ } @Override public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { // return double return cast(Str.get(value, qc, ii), qc, null, ii); } @@ -240,9 +283,13 @@ } @Override public Flt cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Flt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return Flt.get(in.readToken(), null); + } }, /** Double type. */ @@ -254,9 +301,13 @@ } @Override public Dbl cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Dbl read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return Dbl.get(in.readToken(), null); + } }, /** Decimal type. */ @@ -268,7 +319,12 @@ } @Override public Dec cast(final Object value, final QueryContext qc, final InputInfo ii) { - return Dec.get(new BigDecimal(value.toString())); + return Dec.get(value instanceof BigDecimal ? (BigDecimal) value : + new BigDecimal(string(token(value)))); + } + @Override + public Dec read(final DataInput in, final QueryContext qc) throws IOException { + return Dec.get(new BigDecimal(string(in.readToken()))); } }, @@ -287,6 +343,10 @@ throws QueryException { return Int.get(checkLong(value, 0, 0, ii)); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong()); + } }, /** Non-positive integer type. */ @@ -302,6 +362,10 @@ throws QueryException { return new Int(checkLong(value, Long.MIN_VALUE, 0, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Negative integer type. */ @@ -314,9 +378,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, Long.MIN_VALUE, -1, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Long type. */ @@ -328,9 +396,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 0, 0, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Int type. */ @@ -342,9 +414,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, -0x80000000, 0x7FFFFFFF, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Short type. */ @@ -356,9 +432,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, -0x8000, 0x7FFF, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Byte type. */ @@ -370,9 +450,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, -0x80, 0x7F, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Non-negative integer type. */ @@ -385,9 +469,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 0, Long.MAX_VALUE, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Unsigned long type. */ @@ -400,7 +488,7 @@ } @Override public Uln cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { final Item item = checkNum(value, ii); final BigDecimal v = item.dec(ii), i = v.setScale(0, RoundingMode.DOWN); @@ -409,6 +497,10 @@ item.type.isStringOrUntyped() && !v.equals(i)) throw castError(item, ii); return new Uln(i.toBigInteger()); } + @Override + public Uln read(final DataInput in, final QueryContext qc) throws IOException { + return new Uln(new BigInteger(string(in.readToken()))); + } }, /** Short type. */ @@ -420,9 +512,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 0, 0xFFFFFFFFL, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Unsigned Short type. */ @@ -434,9 +530,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 0, 0xFFFF, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Unsigned byte type. */ @@ -448,9 +548,13 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 0, 0xFF, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Positive integer type. */ @@ -463,74 +567,96 @@ } @Override public Int cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + throws QueryException { return new Int(checkLong(value, 1, Long.MAX_VALUE, ii), this); } + @Override + public Int read(final DataInput in, final QueryContext qc) throws IOException { + return Int.get(in.readLong(), this); + } }, /** Duration type. */ DURATION("duration", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.DUR) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Dur cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item instanceof Dur) return new Dur((Dur) item); if(isString(item)) return new Dur(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public Dur cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Dur read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new Dur(in.readToken(), null); + } }, /** Year month duration type. */ YEAR_MONTH_DURATION("yearMonthDuration", DURATION, XS_URI, false, false, false, true, Type.ID.YMD) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public YMDur cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item instanceof Dur) return new YMDur((Dur) item); if(isString(item)) return new YMDur(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public YMDur cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public YMDur read(final DataInput in, final QueryContext qc) + throws IOException, QueryException { + return new YMDur(in.readToken(), null); + } }, /** Day time duration type. */ DAY_TIME_DURATION("dayTimeDuration", DURATION, XS_URI, false, false, false, true, Type.ID.DTD) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public DTDur cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item instanceof Dur) return new DTDur((Dur) item); if(isString(item)) return new DTDur(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public DTDur cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public DTDur read(final DataInput in, final QueryContext qc) + throws IOException, QueryException { + return new DTDur(in.readToken(), null); + } }, /** DateTime type. */ DATE_TIME("dateTime", ANY_ATOMIC_TYPE, XS_URI, false, false, false, true, Type.ID.DTM) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Dtm cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE) return new Dtm((ADate) item); if(isString(item)) return new Dtm(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public Dtm cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Dtm read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new Dtm(in.readToken(), null); + } }, /** DateTimeStamp type. */ @@ -539,128 +665,161 @@ /** Date type. */ DATE("date", ANY_ATOMIC_TYPE, XS_URI, false, false, false, true, Type.ID.DAT) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Dat cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME) return new Dat((ADate) item); if(isString(item)) return new Dat(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public Dat cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Dat read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new Dat(in.readToken(), null); + } }, /** Time type. */ TIME("time", ANY_ATOMIC_TYPE, XS_URI, false, false, false, true, Type.ID.TIM) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Tim cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME) return new Tim((ADate) item); if(isString(item)) return new Tim(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public Tim cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public Tim read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new Tim(in.readToken(), null); + } }, /** Year month type. */ G_YEAR_MONTH("gYearMonth", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.YMO) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public GDt cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME || item.type == DATE) return new GDt((ADate) item, this); if(isString(item)) return new GDt(item.string(ii), this, ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public GDt cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public GDt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new GDt(in.readToken(), this, null); + } }, /** Year type. */ G_YEAR("gYear", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.YEA) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public GDt cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME || item.type == DATE) return new GDt((ADate) item, this); if(isString(item)) return new GDt(item.string(ii), this, ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public GDt cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public GDt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new GDt(in.readToken(), this, null); + } }, /** Month day type. */ G_MONTH_DAY("gMonthDay", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.MDA) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public GDt cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME || item.type == DATE) return new GDt((ADate) item, this); if(isString(item)) return new GDt(item.string(ii), this, ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public GDt cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public GDt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new GDt(in.readToken(), this, null); + } }, /** Day type. */ G_DAY("gDay", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.DAY) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public GDt cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME || item.type == DATE) return new GDt((ADate) item, this); if(isString(item)) return new GDt(item.string(ii), this, ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public GDt cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public GDt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new GDt(in.readToken(), this, null); + } }, /** Month type. */ G_MONTH("gMonth", ANY_ATOMIC_TYPE, XS_URI, false, false, false, false, Type.ID.MON) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public GDt cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item.type == DATE_TIME || item.type == DATE) return new GDt((ADate) item, this); if(isString(item)) return new GDt(item.string(ii), this, ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { + public GDt cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { return cast(Str.get(value, qc, ii), qc, null, ii); } + @Override + public GDt read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return new GDt(in.readToken(), this, null); + } }, /** Boolean type. */ BOOLEAN("boolean", ANY_ATOMIC_TYPE, XS_URI, false, false, false, true, Type.ID.BLN) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Bln cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item instanceof ANum) return Bln.get(item.bool(ii)); if(isString(item)) return Bln.get(Bln.parse(item, ii)); throw typeError(item, this, ii); } @Override - public Bln cast(final Object value, final QueryContext qc, final InputInfo ii) { - return Bln.get(value instanceof Boolean ? (Boolean) value : - Boolean.parseBoolean(value.toString())); + public Bln cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { + return value instanceof Boolean ? Bln.get((Boolean) value) : + cast(Str.get(value, qc, ii), qc, null, ii); + } + @Override + public Bln read(final DataInput in, final QueryContext qc) throws IOException { + return Bln.get(in.readBool()); } }, @@ -670,33 +829,40 @@ /** Base64 binary type. */ BASE64_BINARY("base64Binary", BINARY, XS_URI, false, false, false, true, Type.ID.B64) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public B64 cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - if(item instanceof Bin) return org.basex.query.value.item.B64.get((Bin) item, ii); - if(isString(item)) return org.basex.query.value.item.B64.get(item.string(ii), ii); + if(item instanceof Bin) return B64.get((Bin) item, ii); + if(isString(item)) return B64.get(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { - return value instanceof byte[] ? org.basex.query.value.item.B64.get((byte[]) value) : - org.basex.query.value.item.B64.get(token(value.toString()), ii); + public B64 cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { + return value instanceof byte[] ? B64.get((byte[]) value) : B64.get(token(value), ii); + } + @Override + public B64 read(final DataInput in, final QueryContext qc) throws IOException { + return B64.get(in.readToken()); } }, /** Hex binary type. */ HEX_BINARY("hexBinary", BINARY, XS_URI, false, false, false, true, Type.ID.HEX) { @Override - public Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public Hex cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { if(item instanceof Bin) return new Hex((Bin) item, ii); if(isString(item)) return new Hex(item.string(ii), ii); throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) - throws QueryException { - return new Hex(value instanceof byte[] ? (byte[]) value : token(value.toString()), ii); + public Hex cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { + return new Hex(value instanceof byte[] ? (byte[]) value : token(value), ii); + } + @Override + public Hex read(final DataInput in, final QueryContext qc) throws IOException { + return new Hex(in.readToken()); } }, @@ -712,8 +878,12 @@ return u; } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) { - return Uri.uri(value.toString()); + public Uri cast(final Object value, final QueryContext qc, final InputInfo ii) { + return Uri.uri(token(value)); + } + @Override + public Uri read(final DataInput in, final QueryContext qc) throws IOException { + return Uri.uri(in.readToken()); } }, @@ -732,7 +902,11 @@ } @Override public QNm cast(final Object value, final QueryContext qc, final InputInfo ii) { - return value instanceof QName ? new QNm((QName) value) : new QNm(value.toString()); + return value instanceof QName ? new QNm((QName) value) : new QNm(token(value)); + } + @Override + public QNm read(final DataInput in, final QueryContext qc) throws IOException { + return new QNm(in.readToken(), in.readBool() ? in.readToken() : null); } }, @@ -801,13 +975,12 @@ @Override public Item cast(final Object value, final QueryContext qc, final InputInfo ii) throws QueryException { - throw Util.notExpected(value); + throw FUNCCAST_X_X.get(ii, this, value); } @Override - public final Item castString(final String value, final QueryContext qc, final InputInfo ii) - throws QueryException { - return cast(value, qc, ii); + public Item read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + throw Util.notExpected(); } @Override @@ -952,7 +1125,7 @@ } else if(value instanceof Character) { item = Int.get((char) value); } else { - item = Str.get(value.toString()); + item = Str.get(token(value)); } return checkNum(item, ii); } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/FuncType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/FuncType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/FuncType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/FuncType.java 2022-05-14 08:34:33.000000000 +0000 @@ -3,8 +3,10 @@ import static org.basex.query.QueryError.*; import static org.basex.util.Token.*; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.ann.*; import org.basex.query.util.list.*; @@ -99,13 +101,14 @@ } @Override - public final Item cast(final Object value, final QueryContext qc, final InputInfo ii) { - throw Util.notExpected(value); + public Item cast(final Object value, final QueryContext qc, final InputInfo ii) + throws QueryException { + throw FUNCCAST_X_X.get(ii, this, value); } @Override - public final Item castString(final String string, final QueryContext qc, final InputInfo ii) { - throw Util.notExpected(string); + public Item read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + throw Util.notExpected(); } @Override @@ -270,7 +273,7 @@ } @Override - public final ID id() { + public ID id() { return Type.ID.FUN; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/ListType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/ListType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/ListType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/ListType.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,8 +4,10 @@ import static org.basex.query.QueryText.*; import static org.basex.util.Token.*; +import java.io.*; import java.util.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.util.*; import org.basex.query.value.*; @@ -91,9 +93,8 @@ } @Override - public final Value castString(final String value, final QueryContext qc, final InputInfo ii) - throws QueryException { - return cast(value, qc, ii); + public Item read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + throw Util.notExpected(); } @Override diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/MapType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/MapType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/MapType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/MapType.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,6 +2,10 @@ import static org.basex.query.QueryError.*; +import java.io.*; + +import org.basex.core.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.value.item.*; import org.basex.query.value.map.*; @@ -38,6 +42,15 @@ } @Override + public XQMap read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + XQMap map = XQMap.empty(); + for(int s = in.readNum() - 1; s >= 0; s--) { + map = map.put((Item) Cache.read(in, qc), Cache.read(in, qc), null); + } + return map; + } + + @Override public boolean eq(final Type type) { if(this == type) return true; if(!(type instanceof MapType)) return false; @@ -99,6 +112,11 @@ return (AtomType) argTypes[0].type; } + @Override + public ID id() { + return Type.ID.MAP; + } + /** * Creates a new map type. * @param keyType key type diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/NodeType.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/NodeType.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/NodeType.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/NodeType.java 2022-05-14 08:34:33.000000000 +0000 @@ -11,6 +11,7 @@ import org.basex.build.xml.*; import org.basex.core.*; import org.basex.io.*; +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.value.item.*; import org.basex.query.value.node.*; @@ -35,7 +36,7 @@ public ANode cast(final Object value, final QueryContext qc, final InputInfo ii) { if(value instanceof BXText) return ((BXNode) value).getNode(); if(value instanceof Text) return new FTxt((Text) value); - return new FTxt(value.toString()); + return new FTxt(Token.token(value)); } }, @@ -46,9 +47,8 @@ throws QueryException { if(value instanceof BXPI) return ((BXNode) value).getNode(); if(value instanceof ProcessingInstruction) return new FPI((ProcessingInstruction) value); - final Matcher m = Pattern.compile("<\\?(.*?) (.*)\\?>").matcher(value.toString()); - if(m.find()) return new FPI(m.group(1), m.group(2)); - throw NODEERR_X_X.get(ii, this, value); + final Matcher m = matcher("<\\?(.*?) (.*)\\?>", value, ii); + return new FPI(m.group(1), m.group(2)); } }, @@ -60,7 +60,7 @@ if(value instanceof BXElem) return ((BXNode) value).getNode(); if(value instanceof Element) return new FElem((Element) value, null, new TokenMap()); try { - return new DBNode(new IOContent(value.toString())).childIter().next(); + return new DBNode(new IOContent(Token.token(value))).childIter().next(); } catch(final IOException ex) { throw NODEERR_X_X.get(ii, this, ex); } @@ -84,9 +84,9 @@ final String bu = df.getBaseURI(); return new FDoc(df, bu != null ? Token.token(bu) : Token.EMPTY); } - final String string = value.toString(); - if(Strings.startsWith(string, '<')) return new DBNode(new IOContent(string)); - return new FDoc().add(new FTxt(string)); + final byte[] token = Token.token(value); + return Token.startsWith(token, '<') ? new DBNode(new IOContent(token)) : + new FDoc().add(new FTxt(token)); } catch(final IOException ex) { throw NODEERR_X_X.get(ii, this, ex); } @@ -96,7 +96,7 @@ /** Document element type. */ DOCUMENT_NODE_ELEMENT("document-node(element())", DOCUMENT_NODE, ID.DEL) { @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) + public ANode cast(final Object value, final QueryContext qc, final InputInfo ii) throws QueryException { return DOCUMENT_NODE.cast(value, qc, ii); } @@ -109,9 +109,8 @@ throws QueryException { if(value instanceof BXAttr) return ((BXNode) value).getNode(); if(value instanceof Attr) return new FAttr((Attr) value); - final Matcher m = Pattern.compile(" (.*?)=\"(.*)\"").matcher(value.toString()); - if(m.find()) return new FAttr(m.group(1), m.group(2)); - throw NODEERR_X_X.get(ii, this, value); + final Matcher m = matcher(" ?(.*?)=\"(.*)\"", value, ii); + return new FAttr(m.group(1), m.group(2)); } }, @@ -122,9 +121,8 @@ throws QueryException { if(value instanceof BXComm) return ((BXNode) value).getNode(); if(value instanceof Comment) return new FComm((Comment) value); - final Matcher m = Pattern.compile("").matcher(value.toString()); - if(m.find()) return new FComm(m.group(1)); - throw NODEERR_X_X.get(ii, this, value); + final Matcher m = matcher("", value, ii); + return new FComm(m.group(1)); } }, @@ -194,21 +192,21 @@ } @Override - public final Item cast(final Item item, final QueryContext qc, final StaticContext sc, + public final ANode cast(final Item item, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { - return item.type == this ? item : error(item, ii); + if(item.type == this) return (ANode) item; + throw typeError(item, this, ii); } @Override - public Item cast(final Object value, final QueryContext qc, final InputInfo ii) + public ANode cast(final Object value, final QueryContext qc, final InputInfo ii) throws QueryException { - throw Util.notExpected(value); + throw FUNCCAST_X_X.get(ii, this, value); } @Override - public final Item castString(final String value, final QueryContext qc, final InputInfo ii) - throws QueryException { - return cast(value, qc, ii); + public ANode read(final DataInput in, final QueryContext qc) throws IOException, QueryException { + return cast(in.readToken(), qc, null); } @Override @@ -259,17 +257,6 @@ return id; } - /** - * Throws a casting exception. - * @param item item to be included in the error message - * @param ii input info - * @return dummy item - * @throws QueryException query exception - */ - final Item error(final Item item, final InputInfo ii) throws QueryException { - throw typeError(item, this, ii); - } - @Override public boolean nsSensitive() { return false; @@ -281,6 +268,21 @@ } /** + * Creates a matcher for the specified pattern or raises an error. + * @param pattern pattern + * @param value value + * @param ii info info + * @return matcher + * @throws QueryException query exception + */ + final Matcher matcher(final String pattern, final Object value, final InputInfo ii) + throws QueryException { + final Matcher m = Pattern.compile(pattern).matcher(Token.string(Token.token(value))); + if(m.find()) return m; + throw NODEERR_X_X.get(ii, this, value); + } + + /** * Returns a string representation with the specified argument. * @param arg argument * @return string representation diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/Type.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/Type.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/type/Type.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/type/Type.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,5 +1,8 @@ package org.basex.query.value.type; +import java.io.*; + +import org.basex.io.in.DataInput; import org.basex.query.*; import org.basex.query.expr.*; import org.basex.query.value.*; @@ -17,6 +20,8 @@ enum ID { // function types /** function(*). */ FUN(7), + /** map(*). */ MAP(30), + /** array(*). */ ARRAY(31), // node types /** node(). */ NOD(8), @@ -151,6 +156,8 @@ final ID i = get(id); if(i == null) return null; if(i == FUN) return SeqType.FUNCTION; + if(i == MAP) return SeqType.MAP; + if(i == ARRAY) return SeqType.ARRAY; final Type type = AtomType.getType(i); return type != null ? type : NodeType.getType(i); } @@ -178,14 +185,14 @@ Value cast(Object value, QueryContext qc, InputInfo ii) throws QueryException; /** - * Casts the specified string to this type. - * @param value string object + * Reads an item from the input stream. + * @param in data input * @param qc query context - * @param ii input info - * @return cast value + * @return item + * @throws IOException I/O exception * @throws QueryException query exception */ - Value castString(String value, QueryContext qc, InputInfo ii) throws QueryException; + Item read(DataInput in, QueryContext qc) throws IOException, QueryException; /** * Returns a sequence type with a single number of occurrence. diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/query/value/Value.java basex-9.7.2/basex-core/src/main/java/org/basex/query/value/Value.java --- basex-9.7.1/basex-core/src/main/java/org/basex/query/value/Value.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/query/value/Value.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,9 +4,11 @@ import java.io.*; import java.util.*; +import java.util.function.*; import org.basex.data.*; import org.basex.io.out.*; +import org.basex.io.out.DataOutput; import org.basex.io.serial.*; import org.basex.query.*; import org.basex.query.CompileContext.*; @@ -41,6 +43,17 @@ this.type = type; } + /** + * Writes the data structure to disk. + * @param out data output + * @throws IOException I/O exception + * @throws QueryException query exception + */ + @SuppressWarnings("unused") + public void write(final DataOutput out) throws IOException, QueryException { + throw Util.notExpected(); + } + @Override public final void checkUp() { } @@ -77,24 +90,26 @@ } /** - * Returns a materialized, context-independent version of this value. - * @param qc query context (if {@code null}, process cannot be interrupted) - * @param error query error - * @param info input info - * @return item copy, or {@code null}) if the value cannot be materialized + * Returns a materialized version of this value without dependencies to persistent data. + * Raises an error if the value contains function items + * @param test check if a contained node can be adopted unchanged + * @param ii input info + * @param qc query context + * @return materialized value * @throws QueryException query exception */ - public Value materialize(final QueryContext qc, final QueryError error, final InputInfo info) - throws QueryException { + public abstract Value materialize(Predicate test, InputInfo ii, QueryContext qc) + throws QueryException; - final ValueBuilder vb = new ValueBuilder(qc); - for(final Item item : this) { - final Item it = item.materialize(qc, item.persistent()); - if(it == null) throw error.get(info, item); - vb.add(it); - } - return vb.value(this); - } + /** + * Checks if this value is materialized, i.e., contains no persistent database nodes or + * function items. + * @param test check if a contained node can be adopted unchanged + * @param ii input info + * @return result of check + * @throws QueryException query exception + */ + public abstract boolean materialized(Predicate test, InputInfo ii) throws QueryException; /** * Tests if this is an empty sequence. @@ -226,6 +241,12 @@ } /** + * Checks if all items of the sequence are of the same type. + * @return result of check + */ + public abstract boolean sameType(); + + /** * Returns the item at the given position in the value. * The specified value must be lie within the valid bounds. * @param pos position diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/server/ClientListener.java basex-9.7.2/basex-core/src/main/java/org/basex/server/ClientListener.java --- basex-9.7.1/basex-core/src/main/java/org/basex/server/ClientListener.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/server/ClientListener.java 2022-05-14 08:34:33.000000000 +0000 @@ -324,7 +324,7 @@ } /** - * Stores raw data in a database. + * Stores binary data in a database. * @throws IOException I/O exception */ private void store() throws IOException { diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/server/ServerCmd.java basex-9.7.2/basex-core/src/main/java/org/basex/server/ServerCmd.java --- basex-9.7.1/basex-core/src/main/java/org/basex/server/ServerCmd.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/server/ServerCmd.java 2022-05-14 08:34:33.000000000 +0000 @@ -29,7 +29,7 @@ ADD(9), /** Code for replacing a document in a database: {path}0{input}0. */ REPLACE(12), - /** Code for storing raw data in a database: {path}0{input}0. */ + /** Code for storing binary data in a database: {path}0{input}0. */ STORE(13), /** Code for binding a context value: {id}0{val}0{type}0. */ CONTEXT(14), diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/ArrayIterator.java basex-9.7.2/basex-core/src/main/java/org/basex/util/ArrayIterator.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/ArrayIterator.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/ArrayIterator.java 2022-05-14 08:34:33.000000000 +0000 @@ -45,6 +45,10 @@ @Override public boolean hasNext() { + while(start < end) { + if(array[start] != null) return true; + ++start; + } return start < end; } diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/ConsoleReader.java basex-9.7.2/basex-core/src/main/java/org/basex/util/ConsoleReader.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/ConsoleReader.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/ConsoleReader.java 2022-05-14 08:34:33.000000000 +0000 @@ -139,6 +139,7 @@ final Class fileNameCompleter = Reflect.find(JLINE_FILE_NAME_COMPLETER); Reflect.invoke(Reflect.method(readerC, "setBellEnabled", boolean.class), reader, false); + Reflect.invoke(Reflect.method(readerC, "setExpandEvents", boolean.class), reader, false); Reflect.invoke(Reflect.method(readerC, "setHistory", history), reader, fileHistory); Reflect.invoke(Reflect.method(readerC, "setHistoryEnabled", boolean.class), reader, true); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/ft/EnglishStemmer.java basex-9.7.2/basex-core/src/main/java/org/basex/util/ft/EnglishStemmer.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/ft/EnglishStemmer.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/ft/EnglishStemmer.java 2022-05-14 08:34:33.000000000 +0000 @@ -2,16 +2,24 @@ import static org.basex.util.Token.*; +import java.io.*; import java.util.*; +import org.basex.io.*; +import org.basex.util.*; +import org.basex.util.hash.*; + /** - * English stemming algorithm, based on the publication from - * Porter (1980), "An algorithm for suffix stripping". + * English stemming algorithm, based on the publication from Porter (1980), + * "An algorithm for suffix stripping", enhanced with a basic dictionary for irregular plurals. * * @author BaseX Team 2005-22, BSD License * @author Christian Gruen */ final class EnglishStemmer extends InternalStemmer { + /** Dictionary with most frequent terms. */ + private static final TokenMap DICTIONARY = new TokenMap(); + /** Stemming character. */ private static final byte[] AT = token("at"); /** Stemming character. */ @@ -67,6 +75,18 @@ "iti", "ive", "ize", "ment", "ou", "ous", "sion", "tion" ); + /* Reads in dictionary. */ + static { + try(InputStream is = EnglishStemmer.class.getResourceAsStream("/stemmer-en.properties")) { + for(final byte[] line : split(new IOStream(is).read(), '\n')) { + final byte[][] tokens = split(line, '='); + if(!startsWith(line, '#') && tokens.length == 2) DICTIONARY.put(tokens[0], tokens[1]); + } + } catch(final Throwable ex) { + Util.stack(ex); + } + } + /** Token to be stemmed. */ private byte[] token; /** Token length. */ @@ -94,6 +114,8 @@ @Override protected byte[] stem(final byte[] str) { + final byte[] s = DICTIONARY.get(str); + if(s != null) return s; tl = str.length; token = str; return s() ? Arrays.copyOf(str, tl) : str; diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/http/HttpClient.java basex-9.7.2/basex-core/src/main/java/org/basex/util/http/HttpClient.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/http/HttpClient.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/http/HttpClient.java 2022-05-14 08:34:33.000000000 +0000 @@ -1,8 +1,6 @@ package org.basex.util.http; -import static java.net.HttpURLConnection.*; import static org.basex.query.QueryError.*; -import static org.basex.util.Token.*; import static org.basex.util.http.HttpText.*; import static org.basex.util.http.HttpText.Request.*; @@ -66,7 +64,8 @@ final HttpRequest req = new HttpRequestParser(info).parse(request, bodies); HttpURLConnection conn = null; try { - final String url = href == null || href.length == 0 ? req.attribute(HREF) : string(href); + final String url = href == null || href.length == 0 ? req.attribute(HREF) : + Token.string(href); if(url == null || url.isEmpty()) throw HC_URL.get(info); conn = send(url, req); @@ -216,7 +215,7 @@ conn.setReadTimeout(Strings.toInt(timeout) * 1000); } final String redirect = request.attribute(FOLLOW_REDIRECT); - if(redirect != null) setFollowRedirects(Strings.toBoolean(redirect)); + if(redirect != null) HttpURLConnection.setFollowRedirects(Strings.toBoolean(redirect)); request.headers.forEach(conn::addRequestProperty); } @@ -283,7 +282,7 @@ writePayload(part.bodyContents, part.bodyAtts, ao); // write boundary preceded by "--" - out.write(concat("--", boundary, CRLF)); + out.write(Token.concat("--", boundary, CRLF)); // write headers for(final Entry header : part.headers.entrySet()) @@ -295,7 +294,7 @@ out.write(ao.finish()); out.write(CRLF); } - out.write(concat("--", boundary, "--", CRLF)); + out.write(Token.concat("--", boundary, "--", CRLF)); } else { writePayload(request.payload, request.payloadAtts, out); } @@ -311,7 +310,7 @@ */ private static void writeHeader(final String key, final String value, final OutputStream out) throws IOException { - out.write(concat(key, ": ", value, CRLF)); + out.write(Token.concat(key, ": ", value, CRLF)); } /** diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/Prop.java basex-9.7.2/basex-core/src/main/java/org/basex/util/Prop.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/Prop.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/Prop.java 2022-05-14 08:34:33.000000000 +0000 @@ -23,7 +23,7 @@ /** Project name. */ public static final String NAME = "BaseX"; /** Code version (may contain major, minor and optional patch number). */ - public static final String VERSION = version("9.7.1"); + public static final String VERSION = version("9.7.2"); /** Project name. */ public static final String PROJECT = NAME.toLowerCase(Locale.ENGLISH); diff -Nru basex-9.7.1/basex-core/src/main/java/org/basex/util/Util.java basex-9.7.2/basex-core/src/main/java/org/basex/util/Util.java --- basex-9.7.1/basex-core/src/main/java/org/basex/util/Util.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/java/org/basex/util/Util.java 2022-05-14 08:34:33.000000000 +0000 @@ -4,6 +4,7 @@ import java.io.*; import java.net.*; +import java.nio.file.*; import java.util.*; import javax.net.ssl.*; @@ -175,7 +176,8 @@ String msg = throwable.getMessage(); if(msg == null || msg.isEmpty() || throwable instanceof RuntimeException) msg = throwable.toString(); - if(throwable instanceof FileNotFoundException) return info(RES_NOT_FOUND_X, msg); + if(throwable instanceof FileNotFoundException || + throwable instanceof NoSuchFileException) return info(RES_NOT_FOUND_X, msg); if(throwable instanceof UnknownHostException) return info(UNKNOWN_HOST_X, msg); if(throwable instanceof SSLException) return "SSL: " + msg; diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Chinese.lang basex-9.7.2/basex-core/src/main/resources/lang/Chinese.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Chinese.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Chinese.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = 拒绝访问:% add = 添加 add_archive_name = 在文档路径中添加压缩包文件名 -add_raw_files = 将其他文件添加为raw文件 +add_binary_files = 将其他文件添加为raw文件 add_resources = 添加资源 adjust_nodes = 将节点调整为文本 admin_static = Admin用户不能被修改 diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Dutch.lang basex-9.7.2/basex-core/src/main/resources/lang/Dutch.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Dutch.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Dutch.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Toegang geweigerd: %. add = Toevoegen add_archive_name = Include name of archive in document path -add_raw_files = Voeg overige bestanden onbewerkt toe +add_binary_files = Voeg overige bestanden onbewerkt toe add_resources = Voeg Resources toe adjust_nodes = Pas nodes aan tekst aan admin_static = Admin gebruiker kan niet gewijzigd worden. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/English.lang basex-9.7.2/basex-core/src/main/resources/lang/English.lang --- basex-9.7.1/basex-core/src/main/resources/lang/English.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/English.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Access denied: %. add = Add add_archive_name = Include name of archive in document path -add_raw_files = Add other files as raw files +add_binary_files = Add other files as binary files add_resources = Add Resources adjust_nodes = Adjust nodes to text admin_static = Admin user cannot be modified. @@ -523,8 +523,8 @@ c_repo5 = lists all installed packages c_restore1 = Restore database. c_restore2 = Restores a database. The argument may include\nthe timestamp of the backup file. -c_retrieve1 = Retrieve raw data. -c_retrieve2 = Retrieves raw data from the specified [%]. +c_retrieve1 = Retrieve binary data. +c_retrieve2 = Retrieves binary data from the specified [%]. c_run1 = Run query or command script. c_run2 = Runs the contents of [%] as query or command script. c_set1 = Set global options. @@ -534,8 +534,8 @@ c_show23 = shows current database sessions. c_show24 = shows users (on a database). c_show25 = shows backups. -c_store1 = Store raw data. -c_store2 = Stores raw data to the specified [%]. +c_store1 = Store binary data. +c_store2 = Stores binary data to the specified [%]. c_test1 = Run XQUnit tests. c_test2 = Runs all XQUnit tests in [%]. c_xquery1 = Run XQuery. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/French.lang basex-9.7.2/basex-core/src/main/resources/lang/French.lang --- basex-9.7.1/basex-core/src/main/resources/lang/French.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/French.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Accès refusé: %. add = Ajouter add_archive_name = Inclure le nom de l'archive dans le chemin du document -add_raw_files = Ajouter les fichiers restants comme fichiers bruts +add_binary_files = Ajouter les fichiers restants au format binaire add_resources = Ajouter des ressources adjust_nodes = Ajuster les nœuds au texte admin_static = L'utilisateur Admin ne peut être modifié. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/German.lang basex-9.7.2/basex-core/src/main/resources/lang/German.lang --- basex-9.7.1/basex-core/src/main/resources/lang/German.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/German.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Zugriff verweigert: %. add = Hinzufügen add_archive_name = Archivname dem Dokumentpfad hinzufügen -add_raw_files = Speichere andere Dateien im Binärformat +add_binary_files = Speichere andere Dateien im Binärformat add_resources = Neue Ressourcen adjust_nodes = Knoten an Text anpassen admin_static = Admin-Benutzer kann nicht modifiziert werden. @@ -523,8 +523,8 @@ c_repo5 = listet alle installierten Pakete auf c_restore1 = Wiederherstellung der Datenbank. c_restore2 = Stellt eine Datenbank wieder her. Das Argument\nkann den Zeitstempel des Backup-Files beinhalten. -c_retrieve1 = Anfrage von Rohdaten. -c_retrieve2 = Liefert Rohdaten vom Pfad [%] zurück. +c_retrieve1 = Anfrage von Binärdaten. +c_retrieve2 = Liefert Binärdaten vom Pfad [%] zurück. c_run1 = Ausführung einer XQuery oder eines Kommando-Skripts. c_run2 = Führt den Inhalt von [%] als XQuery oder Kommando-Skripts aus. c_set1 = Setzen von allgemeinen Optionen. @@ -534,8 +534,8 @@ c_show23 = zeigt aktuelle Datenbankverbindungen. c_show24 = zeigt registrierte Benutzer (einer Datenbank). c_show25 = zeigt Backups an. -c_store1 = Speicherung von Rohdaten. -c_store2 = Speichert Rohdaten am angegebenen Pfad [%]. +c_store1 = Speicherung von Binärdaten. +c_store2 = Speichert Binärdaten am angegebenen Pfad [%]. c_test1 = Ausführung von XQUnit-Tests. c_test2 = Führt alle XQUnit-Tests in [%] aus. c_xquery1 = Ausführung einer XQuery-Anfrage. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Hungarian.lang basex-9.7.2/basex-core/src/main/resources/lang/Hungarian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Hungarian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Hungarian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Hozzáférés megtagadva: %. add = Hozzáadás add_archive_name = Archívumnév hozzáadása a dokumentum-útvonalhoz -add_raw_files = A többi fájl raw fájlként történő hozzáadása +add_binary_files = A többi fájl raw fájlként történő hozzáadása add_resources = Erőforrások hozzáadása adjust_nodes = Csomópontok szöveggé alakítása admin_static = A Rendszergazda felhasználó nem módosítható. @@ -24,8 +24,8 @@ backup = Mentés backup_dropped_% = '%' biztonsági mentés fájljai törölve. backup_not_found_% = 'Nem található biztonsági mentés a következőhöz: '%'. -backup_not_renamed_% = Backup '%' could not be renamed. -backup_renamed_% = Backup '%' was renamed. +backup_not_renamed_% = '%' biztonsági mentés nem nevezhető át. +backup_renamed_% = '%' átnevezve. backups = Biztonsági mentések backups_% = % biztonsági mentés blue = Kék @@ -114,7 +114,7 @@ empty_db = Egy üres adatbázis létrejött. encoding = Kódolás end = Befejezés -enter_db_name = Kérem adjon meg egy adatbázisnevet. +enter_db_name = Kérem, adjon meg egy adatbázisnevet. entries_% = % bejegyzés error = Hiba escape_chars = Kódolt (escape) karakterek @@ -134,7 +134,7 @@ file_not_saved_% = "%" fájlt nem sikerült menteni. file_or_dir = Bemeneti fájl vagy könyvtár file_patterns = Fájlminták (vesszőkkel elválasztva) -file_suffixes_% = % File Suffixes +file_suffixes_% = % Fájl utótagok files_replace_% = Fájlokat lecseréli % alatt.\nBiztos folytatja? filter = Szűrő filter_selected = Kijelöltre szűrés @@ -189,15 +189,15 @@ install_from_url = Telepítés URL-ről int_parser = Belső XML-elemező használata interrupted = Megszakítva. -interval = Interval +interval = Intervallum invalid_% = % érvénytelen. italics = Dőlt jobs_% = % feladat jobs_stopped_% = % feladat leállt. jump_to_file = Ugrás a fájlhoz -jump_to_bracket = Jump to bracket +jump_to_bracket = Ugrás a zárójelbe kill_self_% = '%' nem tudja kilőni önmagát. -label_atts = Label attributes +label_atts = Címke attribútumok language = Nyelv lax_name_conversion = Lax névkonverzió liberal_parsing = Liberális elemzés @@ -280,7 +280,7 @@ pkg_deleted_% = '%' csomag törölve. pkg_installed_%_% = '%' csomag telepítve % alatt. pkg_replaced_%_% = '%' csomag lecserélve % alatt. -please_wait = Kérem várjon +please_wait = Kérem, várjon plot = Pontok port = port preferences = Beállítások @@ -331,7 +331,7 @@ save = Mentés save_as = Mentés másként save_before_execute = Mentés a futtatás előtt -scroll_tabs = Scroll editor tabs +scroll_tabs = Szerkesztőlap görgetése searching = Keresés select_all = Mind kijelölése separator = Elválasztó @@ -426,7 +426,7 @@ h_browser_error_% = Böngésző megnyitása sikertelen.\nNyissa meg manuálisan az URL-t:\n\n% h_case = Kis- és nagybetű érzékenység megmarad az indexelésben. h_chop_ws = Ez a beállítás törli a címkék és a tartalom között lévő nem látható karaktereket (whitespace-eket). -h_db_format = Az adatbázis formátuma megváltozott; kérem használjon újabb verziót. +h_db_format = Az adatbázis formátuma megváltozott; kérem, használjon újabb verziót. h_db_options_% = Ezek az beállítások csak a következő futtása után lépnek életbe: '%' h_diacritics = Ékezetek megmaradnak az indexelésben. h_fulltext_index = A teljes-szöveg index gyorsítja a teljes-szöveges (full-text) lekérdezéseket. @@ -435,7 +435,7 @@ h_int_parser = Hibatűrő, továbbá a Java alapértelmezett elemzőjénél gyorsabb. h_languauge = Nyelvfüggő szövegelemzések is használatra kerülnek. h_large_db = Az adatbázis % méretű. Bezár néhány megjelenítést,\nhogy folyamat gyorsabbá váljon? -h_version_check = Engedélyezed az automatikus frissítésellenõrzést? +h_version_check = Engedélyezi az automatikus frissítésellenõrzést? h_version_latest_% = % naprakész. h_version_new_%_% = Új verzió érhető el (% %)!\nFrissít? h_no_html_parser = Nincs elérhető HTML elemző; a bemenet közönséges XML-ként lesz kezelve. @@ -445,7 +445,7 @@ h_stopwords = Válasszon egy megállító-kulcsszavakat (stopwords) tartalmazó fájlt a gyakran figyelmen kívül hagyott kifejezésekhez. h_text_index = Ez az index a szövegek feltételekben lévő összehasonlítását gyorsítja meg. h_token_index = Tokenek gyorsabb keresése attribútumok értékeiben. -h_used_mem = Amikor kevés a memória, kérem futtassa\na BaseX-et a -Xmx Java paraméterrel. +h_used_mem = Amikor kevés a memória, kérem, futtassa\na BaseX-et a -Xmx Java paraméterrel. # Commands @@ -507,7 +507,7 @@ c_list1 = adatbázisok vagy adatbázis erőforrásainak felsorolása. c_list2 = Felsorolja az összes elérhető adatbázist, vagy \na(z) [%] adatbázis erőforrásait, opcionálisan szűrve [%]. c_open1 = Adatbázis megnyitása. -c_open2 = Megnyit egy adatbázist [%]. +c_open2 = Megnyitja az adatbázist [%]. c_optimize1 = Adatbázis optimalizálása. c_optimize2 = Optimalizálja a jelenleg megnyitott adatbázist.\nHa % kiválasztott, az adatbázis mérete a lehető legkisebb lesz. c_password1 = Jelszó cseréje. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Indonesian.lang basex-9.7.2/basex-core/src/main/resources/lang/Indonesian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Indonesian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Indonesian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Akses ditolak: %. add = Tambah add_archive_name = Tamhah nama arsip dalam rintis dokumen -add_raw_files = Tambah berkas lainnya sebagai berkas mentah +add_binary_files = Tambah berkas lainnya sebagai berkas mentah add_resources = Tambah sumber daya adjust_nodes = Sesuaikan simpul menjadi teks admin_static = Pengguna Admin tidak dapat diubah. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Italian.lang basex-9.7.2/basex-core/src/main/resources/lang/Italian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Italian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Italian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Accesso negato: %. add = Aggiungi add_archive_name = Includi il nome dell'archivio nel percorso del documento -add_raw_files = Aggiungi i risorse rimanenti come 'binaries' +add_binary_files = Aggiungi i risorse rimanenti come 'binaries' add_resources = Aggiungi risorse adjust_nodes = Adegua i nodi al testo admin_static = L'utente amministratore non può essere modificato. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Japanese.lang basex-9.7.2/basex-core/src/main/resources/lang/Japanese.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Japanese.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Japanese.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = アクセスが拒否されました: %。 add = 追加 add_archive_name = ドキュメントパスにアーカイブ名を含める -add_raw_files = 残りのファイルをRAWファイルとして追加します +add_binary_files = 残りのファイルをRAWファイルとして追加します add_resources = リソースの追加 adjust_nodes = ノードをテキストに調整 admin_static = Admin ユーザーは編集できません。 diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Mongolian.lang basex-9.7.2/basex-core/src/main/resources/lang/Mongolian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Mongolian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Mongolian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Хандалт амжилтгүй: %. add = Нэмэх add_archive_name = Include name of archive in document path -add_raw_files = Үлдсэн боловсруулагдаагүй файлуудыг нэмэх +add_binary_files = Үлдсэн боловсруулагдаагүй файлуудыг нэмэх add_resources = Add Resources adjust_nodes = Зангилаанаас текстрүү өөрчлөх admin_static = Админ хэрэглэгч өөрчлөгдөж чадахгүй байна. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Romanian.lang basex-9.7.2/basex-core/src/main/resources/lang/Romanian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Romanian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Romanian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Acces refuzat: %. add = Adăugare add_archive_name = Adaugă numele arhivei in calea documentului -add_raw_files = Adăugaţi fişiere rămase ca fişiere RAW +add_binary_files = Adăugaţi fişiere rămase ca fişiere RAW add_resources = Adăugaţi resurse adjust_nodes = Reglaţi noduri la text admin_static = Utilizatorul admin nu poate fi modificat. diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Russian.lang basex-9.7.2/basex-core/src/main/resources/lang/Russian.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Russian.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Russian.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Доступ запрещен: % add = Добавить add_archive_name = Добавить имя архива в путь документа -add_raw_files = Добавить другие файлы в исходном виде +add_binary_files = Добавить другие файлы в исходном виде add_resources = Добавить ресурсы adjust_nodes = Подгонять размер узла к ширине текста admin_static = Администратор не может быть изменен diff -Nru basex-9.7.1/basex-core/src/main/resources/lang/Spanish.lang basex-9.7.2/basex-core/src/main/resources/lang/Spanish.lang --- basex-9.7.1/basex-core/src/main/resources/lang/Spanish.lang 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/lang/Spanish.lang 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ access_denied_% = Acceso denegado: %. add = Añadir add_archive_name = Incluir el nombre de archivo en la ruta del documento -add_raw_files = Añadir otros ficheros como ficheros en bruto +add_binary_files = Añadir otros ficheros en formato binario add_resources = Añadir recursos adjust_nodes = Ajustar nodos al texto admin_static = El usuario Admin no puede ser modificado. diff -Nru basex-9.7.1/basex-core/src/main/resources/stemmer-en.properties basex-9.7.2/basex-core/src/main/resources/stemmer-en.properties --- basex-9.7.1/basex-core/src/main/resources/stemmer-en.properties 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/main/resources/stemmer-en.properties 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,207 @@ +# for $l in file:read-text-lines('stemmer-en.properties') +# let $t := tokenize($l, '=') +# return if(count($t) < 2 or starts-with($l, '#')) then $l else +# $t[1] || '=' || ft:normalize($t[2], map { 'stemming': true() }) +acropoleis=acropoli +addenda=addendum +agenda=agendum +agendas=agendum +alumna=alumnu +alumni=alumnu +analyses=analysi +anathemata=anathema +antitheses=antithesi +apices=apex +apparatuses=apparatu +appendices=appendix +aquaria=aquarium +atlases=atla +aurochsen=auroch +automata=automaton +bacilli=bacillu +bacteria=bacterium +beaux=beau +been=bee +biscotti=biscotto +blackfeet=blackfoot +boxen=box +brethren=brother +brothren=brother +bureaux=bureau +buses=bu +busses=bu +cacti=cactu +cacti=cactus +calves=calf +campuses=campu +candelabra=candelabrum +candelabras=candelabrum +celli=cello +censuses=censu +chateaux=chateau +cherubim=cherub +children=child +circuses=circu +codices=codex +concerti=concerto +corpora=corpu +corpuses=corpu +corrigenda=corrigendum +crises=crisi +criteria=criterion +curricula=curriculum +data=datum +diagnoses=diagnosi +dice=die +dogmata=dogma +dormice=dormous +dwarves=dwarf +ellipses=ellipsi +elves=elf +emphases=emphasi +enemata=enema +errata=erratum +eyen=ey +feet=foot +fezes=fez +fezzes=fez +firemen=fireman +flies=fly +foci=focu +focuses=focu +fora=forum +fungi=fungu +funguses=fungu +geese=goos +genera=genu +geneses=genesi +gentes=gen +genua=genu +genuses=genu +graffiti=graffito +halluces=hallux +halves=half +hippopotami=hippopotamu +hippopotamuses=hippopotamu +hooves=hoof +hosen=hose +housen=hous +hypotheses=hypothesi +indices=index +insignia=insign +insignias=insign +inuit=inuk +inukshuit=inukshuk +iqalummiut=iqalummiuq +irides=iri +irises=iri +kibbutzim=kibbutz +kine=cow +kneen=knee +kniazhestva=kniazhestvo +knives=knife +kobzari=kobzar +leaves=leaf +lemmata=lemma +libretti=libretto +lice=lous +lives=life +loaves=loaf +loci=locu +magmata=magma +matrices=matrix +matzot=matzah +media=medium +memoranda=memorandum +men=man +mice=mous +milieux=milieu +millennia=millennium +mongees=mongoos +moos=mees +nemeses=nemesi +neuroses=neurosi +nuclei=nucleu +nucleuses=nucleu +nunavimmiut=nunavimmiuq +oases=oasi +oblasti=oblast +octopi=octopu +octopi=octupu +octopuses=octopu +opera=opu +operas=opu +opuses=opu +ova=ovum +oxen=ox +panini=panino +paninis=panino +paparazzi=paparazzo +paralyses=paralysi +parentheses=parenthesi +pence=penni +people=person +phenomena=phenomenon +phyla=phylum +plateaux=plateau +platypi=platypu +platypuses=platypu +polyhedra=polyhedron +prognoses=prognosi +prospectuses=prospectu +quizzes=quiz +radii=radiu +radiuses=radiu +referenda=referendum +scarves=scarf +schemata=schema +selves=self +seraphim=seraph +sheaves=sheaf +shelves=shelf +shoon=shoe +spaghetti=spaghetto +spectra=spectrum +spies=spy +stadia=stadium +staves=staff +stigmata=stigma +stimuli=stimulu +stomata=stoma +strata=stratum +styli=stylu +succubi=succubu +syllabi=syllabu +syllabuses=syllabu +symposia=symposium +synopses=synopsi +syntheses=synthesi +tableaux=tableau +taliban=talib +teeth=tooth +termini=terminu +testes=testi +these=thi +theses=thesi +thieves=thief +those=that +timpani=timpano +torten=tort +treen=tree +tries=try +unices=unix +ushabtiu=ushabti +uteri=uteru +vasa=va +vaxe=vax +vertices=vertex +viruses=viru +viscera=viscu +vortices=vortex +wharves=wharf +wives=wife +wolves=wolf +women=woman +yeshivoth=yeshiva +zecchini=zecchino +zucchini=zucchino diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/build/AddBinaryOptionTest.java basex-9.7.2/basex-core/src/test/java/org/basex/build/AddBinaryOptionTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/build/AddBinaryOptionTest.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/build/AddBinaryOptionTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,67 @@ +package org.basex.build; + +import static org.junit.jupiter.api.Assertions.*; + +import org.basex.*; +import org.basex.core.*; +import org.basex.core.cmd.*; +import org.basex.io.*; +import org.basex.query.func.*; +import org.basex.util.*; +import org.basex.util.list.*; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Test; + +/** + * Tests for the {@link MainOptions#ADDRAW} option. + * @author BaseX Team 2005-22, BSD License + * @author Dimitar Popov + */ +public final class AddBinaryOptionTest extends SandboxTest { + /** Test directory. */ + private static final String DIR = "src/test/resources/dir"; + /** Test files from {@link AddBinaryOptionTest#DIR}}. */ + private static final StringList FILES = new IOFile(DIR).descendants(); + + /** + * Class set up method. + */ + @BeforeAll public static void classSetUp() { + set(MainOptions.ADDRAW, true); + } + + /** + * Set up method. + */ + @BeforeEach public void setUp() { + execute(new CreateDB(NAME)); + } + + /** + * Test if binary files are added on executing a {@code CREATE} command. + */ + @Test public void testCreate() { + execute(new CreateDB(NAME, DIR)); + assertAllFilesExist(); + } + + /** + * Test if binary files are added on executing an {@code ADD} command. + */ + @Test public void testAdd() { + execute(new Add("", DIR)); + assertAllFilesExist(); + } + + /** + * Check if all files and only they exist in the database. + */ + private static void assertAllFilesExist() { + final StringList files = new StringList(query(Function._DB_LIST.args(NAME)).split(Prop.NL)); + assertFalse(files.isEmpty(), "No files were imported"); + for(final String name : FILES) { + assertTrue(files.contains(name), "File " + name + " is not imported"); + } + assertEquals(FILES.size(), files.size(), "Expected number of imported files is different"); + } +} diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/build/AddRawOptionTest.java basex-9.7.2/basex-core/src/test/java/org/basex/build/AddRawOptionTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/build/AddRawOptionTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/build/AddRawOptionTest.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -package org.basex.build; - -import static org.junit.jupiter.api.Assertions.*; - -import org.basex.*; -import org.basex.core.*; -import org.basex.core.cmd.*; -import org.basex.io.*; -import org.basex.query.func.*; -import org.basex.util.*; -import org.basex.util.list.*; -import org.junit.jupiter.api.*; -import org.junit.jupiter.api.Test; - -/** - * Tests for the {@link MainOptions#ADDRAW} option. - * @author BaseX Team 2005-22, BSD License - * @author Dimitar Popov - */ -public final class AddRawOptionTest extends SandboxTest { - /** Test directory. */ - private static final String DIR = "src/test/resources/dir"; - /** Test files from {@link AddRawOptionTest#DIR}}. */ - private static final StringList FILES = new IOFile(DIR).descendants(); - - /** - * Class set up method. - */ - @BeforeAll public static void classSetUp() { - set(MainOptions.ADDRAW, true); - } - - /** - * Set up method. - */ - @BeforeEach public void setUp() { - execute(new CreateDB(NAME)); - } - - /** - * Test if raw files are added on executing a {@code CREATE} command. - */ - @Test public void testCreate() { - execute(new CreateDB(NAME, DIR)); - assertAllFilesExist(); - } - - /** - * Test if raw files are added on executing an {@code ADD} command. - */ - @Test public void testAdd() { - execute(new Add("", DIR)); - assertAllFilesExist(); - } - - /** - * Check if all files and only they exist in the database. - */ - private static void assertAllFilesExist() { - final StringList files = new StringList(query(Function._DB_LIST.args(NAME)).split(Prop.NL)); - assertFalse(files.isEmpty(), "No files were imported"); - for(final String name : FILES) { - assertTrue(files.contains(name), "File " + name + " is not imported"); - } - assertEquals(FILES.size(), files.size(), "Expected number of imported files is different"); - } -} diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/core/CommandTest.java basex-9.7.2/basex-core/src/test/java/org/basex/core/CommandTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/core/CommandTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/core/CommandTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -499,7 +499,7 @@ ok(new DropBackup(NAME)); } - /** Retrieves raw data. */ + /** Retrieves binary data. */ @Test public final void retrieve() { ok(new CreateDB(NAME)); // retrieve non-existing file @@ -509,7 +509,7 @@ ok(new Retrieve(NAME2)); } - /** Stores raw data. */ + /** Stores binary data. */ @Test public final void store() { ok(new CreateDB(NAME)); ok(new Store(NAME2, FILE)); diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/ast/RewritingsTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/ast/RewritingsTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/ast/RewritingsTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/ast/RewritingsTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -815,18 +815,24 @@ @Test public void gh1769number() { check("(0e0, 1e0)[number() = 1]", 1, empty(NUMBER)); check("(0e0, 1e0)[number(.) = 1]", 1, empty(NUMBER)); + check("(0e0, 1e0, 2e0, 3e0, 4e0, 5e0)[number() = 1]", 1, empty(NUMBER)); + check("(0e0, 1e0, 2e0, 3e0, 4e0, 5e0)[number(.) = 1]", 1, empty(NUMBER)); - check("<_>1[number() = 1]", "<_>1", empty(NUMBER)); - check("<_>1[number(.) = 1]", "<_>1", empty(NUMBER)); + check("<_>1[xs:double(.) = 1]", "<_>1", empty(Cast.class)); + check("<_>1[number(.) = 1]", "<_>1", exists(NUMBER)); - check("number(" + wrap(1) + ") + 2", 3, empty(NUMBER)); - check("(1e0, 2e0) ! (number() + 1)", "2\n3", empty(NUMBER)); - check("for $v in (1e0, 2e0) return number($v) + 1", "2\n3", empty(NUMBER)); + check("xs:double(" + wrap(1) + ") + 2", 3, empty(Cast.class)); + check("(1e0, 2e0) ! (xs:double(.) + 1)", "2\n3", empty(Cast.class)); + check("for $v in (1e0, 2e0, 3e0, 4e0, 5e0, 6e0) return xs:double($v) + 1", + "2\n3\n4\n5\n6\n7", empty(Cast.class)); check("for $n in (10000000000000000, 1)[. != 0] return number($n) = 10000000000000001", "true\nfalse", exists(NUMBER)); + check("for $n in (10000000000000000, 1)[. != 0] return xs:double($n) = 10000000000000001", + "true\nfalse", exists(Cast.class)); check("number() + number(<_>2)", 3, count(NUMBER, 1)); + check("xs:double() + xs:double(<_>2)", 3, count(Cast.class, 1)); } /** Inlining of where clauses. */ @@ -1199,8 +1205,24 @@ check("for $a in (, ) return [empty(($a[. = 'i'], $a[. = 'j']))]", "\n", root(DualMap.class), exists(NOT), empty(If.class)); + check("for $a in (1 to 6)[. != 0] return [exists(($a[. = 1], $a[. = 1]))]", + "", count(CmpSimpleG.class, 2), empty(EXISTS)); + check("exists(string-to-codepoints())", + true, empty(STRING_TO_CODEPOINTS), empty(EXISTS), exists(BOOLEAN), exists(STRING)); + check("empty(string-to-codepoints())", + false, empty(STRING_TO_CODEPOINTS), empty(EMPTY), exists(NOT), exists(STRING)); + check("exists(util:chars())", + true, empty(_UTIL_CHARS), empty(EXISTS), exists(BOOLEAN), exists(STRING)); + check("empty(util:chars())", + false, empty(_UTIL_CHARS), empty(EMPTY), exists(NOT), exists(STRING)); + + + check("exists(map:keys(map:entry(1, <_/>)))", + true, empty(_MAP_KEYS), empty(EXISTS), exists(_MAP_SIZE), exists(CmpSimpleG.class)); + check("empty(map:keys(map:entry(1, <_/>)))", + false, empty(_MAP_KEYS), empty(EMPTY), exists(_MAP_SIZE), exists(CmpSimpleG.class)); + // no rewritings - query("for $a in (1 to 2)[. != 0] return [empty(($a[. = 1], $a[. = 1]))]", ""); check("exists(/a) and exists(/b)", false, exists(And.class), empty(EXISTS)); check("for $i in (1 to 2)[. != 0] return exists($i[. = 1]) and exists($i[. = 2])", "false\nfalse", empty(And.class), empty(EXISTS), root(DualMap.class)); @@ -2336,11 +2358,11 @@ /** Accessing iterators with known result size. */ @Test public void gh2029() { check("((1 to 1000000000000) ! string())[last()]", 1000000000000L, - root(_UTIL_LAST)); + root(Str.class)); check("((1 to 1000000000000) ! string())[position() = 999999999999]", 999999999999L, - root(_UTIL_ITEM)); + root(Str.class)); check("((1 to 1000000000000) ! string())[position() = last() - 999999999999]", 1, - root(HEAD)); + root(Str.class)); check("util:replicate(, 200000000000)[last()]", "", root(_UTIL_LAST)); @@ -2768,4 +2790,63 @@ execute(new CreateDB(NAME, "")); check("/e[@a eq 'a'] ! name()", "e", exists(ValueAccess.class)); } + + /** Predicates: further optimize rewritings of 'if' expressions. */ + @Test public void gh2096() { + check("[if(random:double() + 1) then . = '1' else ()]", "", + empty(If.class), empty(And.class)); + check("1[if(. castable as xs:integer) then . = 1 else false()]", "1", + empty(If.class), empty(And.class)); + } + + /** Static typing: Intersection of name tests. */ + @Test public void gh2102() { + final String xml = ""; + query(xml + "[self::Q{x}a[local-name() = 'a'][namespace-uri() = 'x']]", xml); + query(xml + "[self::*:a[local-name() = 'a'][namespace-uri() = 'x']]", xml); + query(xml + "[self::*[local-name() = 'a'][namespace-uri() = 'x']]", xml); + query(xml + "[self::a[local-name() = 'a'][namespace-uri() = 'x']]", ""); + + query("<_>/Q{}n instance of element(Q{}n)", true); + query("<_>/Q{}n instance of element(Q{}o)", false); + query("<_>/Q{}n instance of element(n) ", true); + query("<_>/Q{}n instance of element(o) ", false); + query("<_>/Q{}n instance of element() ", true); + + query("<_>/Q{}* instance of element(Q{}n)", true); + query("<_>/Q{}* instance of element(Q{}o)", false); + query("<_>/Q{}* instance of element(n) ", true); + query("<_>/Q{}* instance of element(o) ", false); + query("<_>/Q{}* instance of element() ", true); + + query("<_>/*:n instance of element(Q{}n)", true); + query("<_>/*:n instance of element(Q{}o)", false); + query("<_>/*:n instance of element(n) ", true); + query("<_>/*:n instance of element(o) ", false); + query("<_>/*:n instance of element() ", true); + + query("<_>/n instance of element(Q{}n)", true); + query("<_>/n instance of element(Q{}o)", false); + query("<_>/n instance of element(n) ", true); + query("<_>/n instance of element(o) ", false); + query("<_>/n instance of element() ", true); + + query("<_>/* instance of element(Q{}n)", true); + query("<_>/* instance of element(Q{}o)", false); + query("<_>/* instance of element(n) ", true); + query("<_>/* instance of element(o) ", false); + query("<_>/* instance of element() ", true); + } + + /** Embed positional function calls in arguments. */ + @Test public void gh2104() { + check("head((1 to 10) ! <_>{ . })", "<_>1", root(CElem.class)); + check("tail((1 to 3) ! (. * 10))", "20\n30", root(DualMap.class)); + check("reverse((1 to 2) ! <_>{ . })", "<_>2\n<_>1", root(DualMap.class)); + check("subsequence((1 to 6) ! (. * 2), 2, 2)", "4\n6", root(DualMap.class)); + + check("util:init((1 to 10)[. > 7] ! (. * .))", "64\n81", root(DualMap.class)); + check("util:item((1 to 10)[. > 6] ! (. * .), 2)", 64, root(ItemMap.class)); + check("util:last((1 to 10)[. > 5] ! (. * .))", 100, root(ItemMap.class)); + } } diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/expr/MixedTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/expr/MixedTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/expr/MixedTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/expr/MixedTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -277,4 +277,14 @@ query("db:create('" + NAME + "', json-to-xml('[1]')/*/*, '" + NAME + "')"); query("db:open('" + NAME + "')/* => namespace-uri()", "http://www.w3.org/2005/xpath-functions"); } + + /** db:store: out of bounds. */ + @Test public void gh2100() { + query("db:create('x', A, 'x.xml')"); + query("db:open('x') ! (delete node x, db:store('x', 'x.bin', x))"); + query("db:retrieve('x', 'x.bin')", "A"); + + query("db:create('x', A, 'x.xml')"); + query("db:open('x') ! (delete node x, db:add('x', x, 'y.xml'))"); + } } diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/ft/FTData.java basex-9.7.2/basex-core/src/test/java/org/basex/query/ft/FTData.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/ft/FTData.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/ft/FTData.java 2022-05-14 08:34:33.000000000 +0000 @@ -322,6 +322,12 @@ " using stemming using language 'Russian'" }, { "FTStemming 11", booleans(true), "'de' contains text 'de' using stemming using language 'pt'" }, + { "FTStemming 12", booleans(true), + "'mice' contains text 'mouse' using stemming" }, + { "FTStemming 13", booleans(true), + "'symposia' contains text 'symposium' using stemming" }, + { "FTStemming 14", booleans(true), + "'men' contains text 'man' using stemming" }, { "FTLanguage 1", nodes(14), "//*[text() contains text 'hello' using language 'en']" }, diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/CacheModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/CacheModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/CacheModuleTest.java 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/CacheModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,250 @@ +package org.basex.query.func; + +import static org.basex.query.QueryError.*; +import static org.basex.query.func.Function.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.*; +import java.util.Map.*; + +import org.basex.*; +import org.junit.jupiter.api.*; + +/** + * This class tests the functions of the Caching Module. + * + * @author BaseX Team 2005-22, BSD License + * @author Christian Gruen + */ +public class CacheModuleTest extends SandboxTest { + /** Initializes a test. */ + @BeforeEach public void initTest() { + final Function clear = _CACHE_CLEAR; + query(clear.args()); + } + + /** Test method. */ + @Test public void cacheClear() { + final Function func = _CACHE_CLEAR; + query(_CACHE_PUT.args("key", "CLEAR")); + query(_CACHE_KEYS.args(), "key"); + query(func.args(), ""); + query(_CACHE_KEYS.args(), ""); + } + + /** Test method. */ + @Test public void cacheDelete() { + final Function func = _CACHE_DELETE; + query(_CACHE_PUT.args("key", "CLEAR")); + query(_CACHE_WRITE.args("DELETE")); + query(_CACHE_KEYS.args(), "key"); + query(func.args("DELETE")); + query(_CACHE_KEYS.args(), "key"); + error(func.args("DELETE"), CACHE_NOTFOUND_X); + + error(func.args("unknown"), CACHE_NOTFOUND_X); + error(func.args("I N V A L I D"), CACHE_NAME_X); + error(func.args(""), CACHE_NAME_X); + } + + /** Test method. */ + @Test public void cacheGet() { + final Function func = _CACHE_GET; + query(func.args("key"), ""); + } + + /** Test method. */ + @Test public void cacheGetOrPut() { + final Function func = _CACHE_GET_OR_PUT; + query(_CACHE_GET.args("key"), ""); + query(func.args("key", " function() { 'GET-OR-PUT' }"), "GET-OR-PUT"); + query(_CACHE_GET.args("key"), "GET-OR-PUT"); + query(_CACHE_KEYS.args(), "key"); + query(func.args("key", " function() { 'NOT' + 'INVOKED' }"), "GET-OR-PUT"); + query(_CACHE_GET.args("key"), "GET-OR-PUT"); + query(_CACHE_KEYS.args(), "key"); + } + + /** Test method. */ + @Test public void cacheKeys() { + final Function func = _CACHE_KEYS; + for(int i = 0; i < 3; i++) query(_CACHE_PUT.args(Integer.toString(i), i)); + query(func.args() + " => sort()", "0\n1\n2"); + query(_CACHE_CLEAR.args()); + query(func.args(), ""); + } + + /** Test method. */ + @Test public void cacheList() { + final Function func = _CACHE_LIST; + query(_CACHE_WRITE.args()); + query(_CACHE_WRITE.args("LIST1")); + query(_CACHE_WRITE.args("LIST2")); + query(func.args(), "LIST1\nLIST2"); + query(func.args() + " ! " + _CACHE_DELETE.args(" .")); + query(func.args(), ""); + } + + /** Test method. */ + @Test public void cachePut() { + final Function func = _CACHE_PUT; + query(func.args("key", "PUT"), ""); + query(_CACHE_GET.args("key"), "PUT"); + query(_CACHE_KEYS.args(), "key"); + query(func.args("key", " ()"), ""); + query(_CACHE_GET.args("key"), ""); + query(_CACHE_KEYS.args(), ""); + query(func.args("key", " map:merge((1 to 100000) ! map:entry(., .))"), ""); + query(_CACHE_KEYS.args(), "key"); + query(_CACHE_GET.args("key") + " => map:size()", 100000); + + error(func.args("key", " true#0"), BASEX_CACHE_X); + error(func.args("key", " [ function() { 123 } ]"), BASEX_CACHE_X); + error(func.args("key", " map { 0: concat(1, ?) }"), BASEX_CACHE_X); + error(func.args("key", " Q{java.util.Random}new()"), BASEX_CACHE_X); + } + + /** Test method. */ + @Test public void cacheRead() { + final Function func = _CACHE_READ; + query(func.args()); + query(_CACHE_PUT.args("key", "READ")); + query(_CACHE_KEYS.args(), "key"); + query(_CACHE_WRITE.args()); + query(_CACHE_CLEAR.args()); + query(_CACHE_KEYS.args(), ""); + query(func.args()); + query(_CACHE_KEYS.args(), "key"); + query(_CACHE_WRITE.args("READ")); + query(_CACHE_CLEAR.args()); + query(_CACHE_KEYS.args(), ""); + query(func.args("READ")); + query(_CACHE_KEYS.args(), "key"); + + error(func.args("unknown"), CACHE_NOTFOUND_X); + error(func.args("I N V A L I D"), CACHE_NAME_X); + error(func.args(""), CACHE_NAME_X); + } + + /** Test method. */ + @Test public void cacheRemove() { + final Function func = _CACHE_REMOVE; + query(_CACHE_PUT.args("key", "REMOVE")); + query(_CACHE_KEYS.args(), "key"); + query(func.args("key"), ""); + query(_CACHE_KEYS.args(), ""); + } + + /** Test method. */ + @Test public void cacheWrite() { + final Function func = _CACHE_WRITE; + query(_CACHE_PUT.args("key", "WRITE")); + query(func.args()); + query(_CACHE_KEYS.args(), "key"); + query(func.args("cache")); + query(_CACHE_KEYS.args(), "key"); + + error(func.args("I N V A L I D"), CACHE_NAME_X); + error(func.args(""), CACHE_NAME_X); + } + + /** Test method. */ + @Test public void values() { + unroll(true); + + final Function put = _CACHE_PUT; + query(put.args("xs:untypedAtomic", " xs:untypedAtomic('x')")); + query(put.args("xs:string", " xs:string('x')")); + query(put.args("xs:normalizedString", " xs:normalizedString('x')")); + query(put.args("xs:token", " xs:token('x')")); + query(put.args("xs:language", " xs:language('x')")); + query(put.args("xs:NMTOKEN", " xs:NMTOKEN('x')")); + query(put.args("xs:Name", " xs:Name('x')")); + query(put.args("xs:NCName", " xs:NCName('x')")); + query(put.args("xs:ID", " xs:ID('x')")); + query(put.args("xs:IDREF", " xs:IDREF('x')")); + query(put.args("xs:ENTITY", " xs:ENTITY('x')")); + query(put.args("xs:float", " xs:float(1)")); + query(put.args("xs:numeric", " xs:numeric(1)")); + query(put.args("xs:double", " xs:double(1)")); + query(put.args("xs:decimal", " xs:decimal(1)")); + query(put.args("xs:integer", " xs:integer(1)")); + query(put.args("xs:nonPositiveInteger", " xs:nonPositiveInteger(-1)")); + query(put.args("xs:negativeInteger", " xs:negativeInteger(-1)")); + query(put.args("xs:long", " xs:long(1)")); + query(put.args("xs:int", " xs:int(1)")); + query(put.args("xs:short", " xs:short(1)")); + query(put.args("xs:byte", " xs:byte(1)")); + query(put.args("xs:nonNegativeInteger", " xs:nonNegativeInteger(1)")); + query(put.args("xs:unsignedLong", " xs:unsignedLong(1)")); + query(put.args("xs:unsignedInt", " xs:unsignedInt(1)")); + query(put.args("xs:unsignedShort", " xs:unsignedShort(1)")); + query(put.args("xs:unsignedByte", " xs:unsignedByte(1)")); + query(put.args("xs:positiveInteger", " xs:positiveInteger(1)")); + query(put.args("xs:duration", " xs:duration('P1Y')")); + query(put.args("xs:yearMonthDuration", " xs:yearMonthDuration('P1Y')")); + query(put.args("xs:dayTimeDuration", " xs:dayTimeDuration('P1D')")); + query(put.args("xs:dateTime", " xs:dateTime('2001-01-01T01:01:01')")); + query(put.args("xs:date", " xs:date('2001-01-01')")); + query(put.args("xs:time", " xs:time('01:01:01')")); + query(put.args("xs:gYearMonth", " xs:gYearMonth('2001-01')")); + query(put.args("xs:gYear", " xs:gYear('2001')")); + query(put.args("xs:gMonthDay", " xs:gMonthDay('--01-01')")); + query(put.args("xs:gDay", " xs:gDay('---01')")); + query(put.args("xs:gMonth", " xs:gMonth('--01')")); + query(put.args("xs:boolean", " xs:boolean('true')")); + query(put.args("xs:base64Binary", " xs:base64Binary('1234')")); + query(put.args("xs:hexBinary", " xs:hexBinary('4142')")); + query(put.args("xs:anyURI", " xs:anyURI('x')")); + query(put.args("xs:QName", " xs:QName('x')")); + + query(put.args("text", " text { ' VALUE ' }")); + query(put.args("processing-instruction", " processing-instruction name { ' VALUE ' }")); + query(put.args("comment", " comment { ' VALUE ' }")); + query(put.args("element", " X")); + query(put.args("document-node1", " document { }")); + query(put.args("document-node2", " document { text { 'x' } }")); + query(put.args("attribute", " attribute a { ' VALUE ' }")); + + query(put.args("BlnSeq", " (0 to 4) ! xs:boolean(. mod 2)")); + query(put.args("BytSeq", " (0 to 4) ! xs:byte(.)")); + query(put.args("DblSeq", " (0 to 4) ! xs:double(.)")); + query(put.args("DecSeq", " (0 to 4) ! xs:decimal(.)")); + query(put.args("FltSeq", " (0 to 4) ! xs:float(.)")); + query(put.args("IntSeq", " (0 to 4, reverse(0 to 4))")); + query(put.args("ShrSeq", " (0 to 4) ! xs:short(.)")); + query(put.args("StrSeq", " (0 to 4) ! xs:string(.)")); + query(put.args("SingletonSeq", " (1 to 1000) ! 1")); + query(put.args("RangeSeq", " (1 to 1000)")); + + query(put.args("EmptySequence", " ()")); + query(put.args("SmallSequenceSameType", " (1 to 2) ! ")); + query(put.args("SmallSequenceDifferentTypes", " (1, 2, [ 3 ], map { 4: '4' })")); + query(put.args("BigSequenceSameType", " (1 to 1000) ! ")); + query(put.args("BigSequenceDifferentTypes", " ((1 to 10) ! string(), 11, 12.5, 13.8e0)")); + + query(put.args("XQMap1", " map { }")); + query(put.args("XQMap2", " map { 1: () }")); + query(put.args("XQMap3", " map { 'a': 'A', 'b': [ 'B' ], 'c': map { 'C': 'CC' } }")); + query(put.args("XQMap4", " map:merge((1 to 1000) ! map:entry(., string(.)))")); + + query(put.args("XQArray1", " array { }")); + query(put.args("XQArray2", " array { 1 }")); + query(put.args("XQArray3", " array { 1, [ 2 ], map { 'C': 'CC' } }")); + query(put.args("XQArray4", " array { 1 to 1000 }")); + query(put.args("XQArray5", " [ 1 to 1000 ]")); + + // write cache + query(_CACHE_WRITE.args()); + final HashMap values = new HashMap<>(); + for(final String key : query(_CACHE_KEYS.args()).split("\\s")) { + values.put(key, query(_CACHE_GET.args(key))); + } + + // check if items of all types have the same representation after reading the cache + query(_CACHE_READ.args()); + for(final Entry entry : values.entrySet()) { + assertEquals(entry.getValue(), query(_CACHE_GET.args(entry.getKey()))); + } + } +} diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/DbModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/DbModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/DbModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/DbModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -230,9 +230,9 @@ @Test public void contentType() { final Function func = _DB_CONTENT_TYPE; query(_DB_ADD.args(NAME, " ", "xml")); - query(_DB_STORE.args(NAME, "raw", "bla")); + query(_DB_STORE.args(NAME, "binary", "bla")); query(func.args(NAME, "xml"), MediaType.APPLICATION_XML.toString()); - query(func.args(NAME, "raw"), MediaType.APPLICATION_OCTET_STREAM.toString()); + query(func.args(NAME, "binary"), MediaType.APPLICATION_OCTET_STREAM.toString()); error(func.args(NAME, "test"), WHICHRES_X); } @@ -401,7 +401,12 @@ query(func.args(NAME)); query("count(" + _DB_BACKUPS.args(NAME) + ")", 1); - query(func.args(NAME, "BLA")); + final int size1 = Integer.parseInt(query(_DB_BACKUPS.args(NAME) + "/@size ! data()")); + query(func.args(NAME, " map { 'compress': false() }")); + final int size2 = Integer.parseInt(query(_DB_BACKUPS.args(NAME) + "/@size ! data()")); + assertTrue(size1 < size2, "Compressed backup is not smaller than uncompressed one"); + + query(func.args(NAME, " map { 'comment': 'BLA' }")); query(_DB_BACKUPS.args(NAME) + "/@comment ! data()", "BLA"); // invalid name @@ -422,21 +427,21 @@ @Test public void dir() { final Function func = _DB_DIR; query(_DB_ADD.args(NAME, " ", "xml/doc.xml")); - query(_DB_STORE.args(NAME, "raw/raw.data", "bla")); + query(_DB_STORE.args(NAME, "binary/binary.data", "bla")); - final String xmlCall = func.args(NAME, "xml"); - query(xmlCall + "/@raw/data()", false); - query(xmlCall + "/@content-type/data()", MediaType.APPLICATION_XML.toString()); - query(xmlCall + "/@modified-date/xs:dateTime(.)"); - query(xmlCall + "/@size/data()", ""); - query(xmlCall + "/text()", "doc.xml"); - - final String rawCall = func.args(NAME, "raw"); - query(rawCall + "/@raw/data()", true); - query(rawCall + "/@content-type/data()", MediaType.APPLICATION_OCTET_STREAM.toString()); - query(rawCall + "/@modified-date/xs:dateTime(.) > xs:dateTime('1971-01-01T00:00:01')", true); - query(rawCall + "/@size/data()", 3); - query(rawCall + "/text()", "raw.data"); + String call = func.args(NAME, "xml"); + query(call + "/@raw/data()", false); + query(call + "/@content-type/data()", MediaType.APPLICATION_XML.toString()); + query(call + "/@modified-date/xs:dateTime(.)"); + query(call + "/@size/data()", ""); + query(call + "/text()", "doc.xml"); + + call = func.args(NAME, "binary/"); + query(call + "/@raw/data()", true); + query(call + "/@content-type/data()", MediaType.APPLICATION_OCTET_STREAM.toString()); + query(call + "/@modified-date/xs:dateTime(.) > xs:dateTime('1971-01-01T00:00:01')", true); + query(call + "/@size/data()", 3); + query(call + "/text()", "binary.data"); query(func.args(NAME, "test"), ""); error(func.args("notAvailable", ""), DB_OPEN2_X); @@ -482,11 +487,11 @@ @Test public void exists() { final Function func = _DB_EXISTS; query(_DB_ADD.args(NAME, " ", "x/xml")); - query(_DB_STORE.args(NAME, "x/raw", "bla")); + query(_DB_STORE.args(NAME, "x/binary", "bla")); // checks if the specified resources exist (false expected for directories) query(func.args(NAME), true); query(func.args(NAME, "x/xml"), true); - query(func.args(NAME, "x/raw"), true); + query(func.args(NAME, "x/binary"), true); query(func.args(NAME, "xxx"), false); query(func.args(NAME, "x"), false); query(func.args(NAME, ""), false); @@ -528,9 +533,9 @@ @Test public void isRaw() { final Function func = _DB_IS_RAW; query(_DB_ADD.args(NAME, " ", "xml")); - query(_DB_STORE.args(NAME, "raw", "bla")); + query(_DB_STORE.args(NAME, "binary", "bla")); query(func.args(NAME, "xml"), false); - query(func.args(NAME, "raw"), true); + query(func.args(NAME, "binary"), true); query(func.args(NAME, "xxx"), false); } @@ -538,9 +543,9 @@ @Test public void isXML() { final Function func = _DB_IS_XML; query(_DB_ADD.args(NAME, " ", "xml")); - query(_DB_STORE.args(NAME, "raw", "bla")); + query(_DB_STORE.args(NAME, "binary", "bla")); query(func.args(NAME, "xml"), true); - query(func.args(NAME, "raw"), false); + query(func.args(NAME, "binary"), false); query(func.args(NAME, "xxx"), false); } @@ -570,22 +575,22 @@ final Function func = _DB_LIST_DETAILS; query(func.args() + "/@resources/string()", 1); - query(_DB_ADD.args(NAME, " ", "xml")); - query(_DB_STORE.args(NAME, "raw", "bla")); + query(_DB_ADD.args(NAME, " ", "xml/xml.xml")); + query(_DB_STORE.args(NAME, "binary/binary.data", "bla")); - final String xmlCall = func.args(NAME, "xml"); - query(xmlCall + "/@raw/data()", false); - query(xmlCall + "/@content-type/data()", MediaType.APPLICATION_XML.toString()); - query(xmlCall + "/@modified-date/xs:dateTime(.)"); - query(xmlCall + "/@size/data()", 2); - query(xmlCall + "/text()", "xml"); - - final String rawCall = func.args(NAME, "raw"); - query(rawCall + "/@raw/data()", true); - query(rawCall + "/@content-type/data()", MediaType.APPLICATION_OCTET_STREAM.toString()); - query(rawCall + "/@modified-date/xs:dateTime(.) > xs:dateTime('1971-01-01T00:00:01')", true); - query(rawCall + "/@size/data()", 3); - query(rawCall + "/text()", "raw"); + String call = func.args(NAME, "xml/"); + query(call + "/@raw/data()", false); + query(call + "/@content-type/data()", MediaType.APPLICATION_XML.toString()); + query(call + "/@modified-date/xs:dateTime(.)"); + query(call + "/@size/data()", 2); + query(call + "/text()", "xml/xml.xml"); + + call = func.args(NAME, "binary/"); + query(call + "/@raw/data()", true); + query(call + "/@content-type/data()", MediaType.APPLICATION_OCTET_STREAM.toString()); + query(call + "/@modified-date/xs:dateTime(.) > xs:dateTime('1971-01-01T00:00:01')", true); + query(call + "/@size/data()", 3); + query(call + "/text()", "binary/binary.data"); query(func.args(NAME, "test"), ""); error(func.args("notAvailable"), DB_OPEN2_X); @@ -872,21 +877,23 @@ /** Test method. */ @Test public void retrieve() { final Function func = _DB_RETRIEVE; - error(func.args(NAME, "raw"), WHICHRES_X); - query(_DB_STORE.args(NAME, "raw", " xs:hexBinary('41')")); - query("xs:hexBinary(" + func.args(NAME, "raw") + ')', "A"); - query(_DB_DELETE.args(NAME, "raw")); - error(func.args(NAME, "raw"), WHICHRES_X); + error(func.args(NAME, "binary"), WHICHRES_X); + query(_DB_STORE.args(NAME, "binary", " xs:hexBinary('41')")); + query("xs:hexBinary(" + func.args(NAME, "binary") + ')', "A"); + query(_DB_DELETE.args(NAME, "binary")); + error(func.args(NAME, "binary"), WHICHRES_X); } /** Test method. */ @Test public void store() { final Function func = _DB_STORE; - query(func.args(NAME, "raw1", "xs:hexBinary('41')")); - query(func.args(NAME, "raw2", "b")); - query(_DB_RETRIEVE.args(NAME, "raw2"), "b"); - query(func.args(NAME, "raw3", 123)); - query(_DB_RETRIEVE.args(NAME, "raw3"), 123); + query(func.args(NAME, "binary1", "xs:hexBinary('41')")); + query(func.args(NAME, "binary2", "b")); + query(_DB_RETRIEVE.args(NAME, "binary2"), "b"); + query(func.args(NAME, "binary3", 123)); + query(_DB_RETRIEVE.args(NAME, "binary3"), 123); + + error(func.args(NAME, "bin/x", "x") + ", " + func.args(NAME, "bin//x", "x"), DB_CONFLICT5_X); } /** Test method. */ diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/FetchModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/FetchModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/FetchModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/FetchModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -25,7 +25,7 @@ final Function func = _FETCH_BINARY; // successful queries query(func.args(XML)); - error(func.args(XML + 'x'), FETCH_EXISTS_X); + error(func.args(XML + 'x'), WHICHRES_X); error(func.args("httttp://x"), FETCH_OPEN_X); } @@ -34,8 +34,7 @@ final Function func = _FETCH_CONTENT_TYPE; // successful queries query(func.args(XML)); - error(func.args(XML + 'x'), FETCH_EXISTS_X); - error(func.args(XML + 'x'), FETCH_OPEN_X); + error(func.args(XML + 'x'), WHICHRES_X); } /** Test method. */ @@ -43,7 +42,7 @@ final Function func = _FETCH_TEXT; // successful queries query(func.args(XML)); - error(func.args(XML + 'x'), FETCH_EXISTS_X); + error(func.args(XML + 'x'), WHICHRES_X); error(func.args(XML, "xxx"), FETCH_ENCODING_X); } @@ -69,8 +68,7 @@ " map { 'catfile': '" + catalog + "catalog.xml', 'dtd': true() }"), "X"); error(func.args(XML, " map { 'parser': 'unknown' }"), BASEX_OPTIONS_X_X); - error(func.args(XML + 'x'), FETCH_EXISTS_X); - error(func.args(XML + 'x'), FETCH_OPEN_X); + error(func.args(XML + 'x'), WHICHRES_X); } /** Test method. */ diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/FnModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/FnModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/FnModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/FnModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -834,7 +834,8 @@ check(func.args(" (<_/>, ('a', 'b'))"), "b\na\n<_/>", empty(func)); - + check("(, )[. = ''] =>" + func.args() + " =>" + func.args(), + "\n", empty(func)); } /** Test method. */ diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/InspectModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/InspectModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/InspectModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/InspectModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -56,7 +56,7 @@ query(query + "/argument/@type/data()", "xs:int"); query(query + "/annotation/@name/data()", "private"); query(query + "/annotation/@uri/data()", "http://www.w3.org/2012/xquery"); - query(query + "/return/@type/data()", "xs:int"); + query(query + "/return/@type/data()", "xs:integer"); query(query + "/return/@occurrence/data()", ""); // unknown annotation diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/UpdateModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/UpdateModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/UpdateModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/UpdateModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -75,7 +75,7 @@ query(func.args(" ('x', 'y')"), "x\ny"); query(func.args(" "), ""); error(func.args("x") + ", 1", UPALL); - error(func.args(" count#1"), BASEX_FUNCTION_X); + error(func.args(" count#1"), BASEX_CACHE_X); error("copy $c := modify " + func.args("x") + " return $c", BASEX_UPDATE); } } diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/func/UtilModuleTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/func/UtilModuleTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/func/UtilModuleTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/func/UtilModuleTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -220,6 +220,9 @@ root(EXISTS), empty(COUNT)); check("let $s := (1 to 6)[. < 5] return empty($s) and count($s) < 5", false, root(EMPTY), empty(COUNT)); + + check(_UTIL_COUNT_WITHIN.args(" (1 to 100)[. > 90] ! <_>{ . }", 8, 10), true, + empty(SimpleMap.class)); } /** Test method. */ @@ -227,7 +230,19 @@ final Function func = _UTIL_DDO; query(func.args(" "), ""); query(func.args(" (, )"), "\n"); - query(func.args(" reverse((, ))"), "\n"); + + check(func.args(" util:replicate((, ), 10)"), "\n", + empty(_UTIL_REPLICATE)); + check(func.args(" util:replicate(, 2, true())"), "\n", + exists(_UTIL_REPLICATE)); + + check("( ! (., *)) => reverse() => " + func.args(), + "\n\n\n", empty(REVERSE)); + check("( ! (., *)) => sort() => " + func.args(), + "\n\n\n", empty(SORT)); + check("( ! (., *)) => sort() => reverse() => sort() => " + func.args(), + "\n\n\n", empty(SORT), empty(REVERSE)); + error(func.args(1), INVCONVERT_X_X_X); } @@ -347,7 +362,7 @@ check(func.args(func.args(" (, , , )")), "\n", root(List.class)); check(func.args(func.args(" (1 to 10) ! {. }")), "1\n2\n3\n4\n5\n6\n7\n8", - root(SUBSEQUENCE)); + root(DualMap.class)); check(func.args(" util:replicate(, 2)"), "", root(CElem.class)); check(func.args(" util:replicate(, 3)"), "\n", root(_UTIL_REPLICATE)); @@ -360,13 +375,13 @@ check(func.args(" subsequence((1 to 10) ! <_>{ . }, 1, 1)"), "", empty()); check(func.args(" subsequence((1 to 10) ! <_>{ . }, 1, 2)"), - "<_>1", root(HEAD)); + "<_>1", root(CElem.class)); check(func.args(" subsequence((1 to 10) ! <_>{ . }, 1, 3)"), - "<_>1\n<_>2", root(SUBSEQUENCE)); + "<_>1\n<_>2", root(DualMap.class)); check(func.args(" subsequence((1 to 10) ! <_>{ . }, 2, 3)"), - "<_>2\n<_>3", root(SUBSEQUENCE)); + "<_>2\n<_>3", root(DualMap.class)); check(func.args(" subsequence((1 to 10) ! <_>{ . }, 4, 2)"), - "<_>4", root(_UTIL_ITEM)); + "<_>4", root(CElem.class)); check(func.args(" subsequence((1 to 10) ! <_>{ . }, 5, 1)"), "", empty()); } diff -Nru basex-9.7.1/basex-core/src/test/java/org/basex/query/up/UpdateTest.java basex-9.7.2/basex-core/src/test/java/org/basex/query/up/UpdateTest.java --- basex-9.7.1/basex-core/src/test/java/org/basex/query/up/UpdateTest.java 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/java/org/basex/query/up/UpdateTest.java 2022-05-14 08:34:33.000000000 +0000 @@ -1153,10 +1153,10 @@ query("update:output(map { })", "map {\n}"); query("update:output(map { 1: map { 2: 3 }})", "map {\n1: map {\n2: 3\n}\n}"); - error("update:output(true#0)", BASEX_FUNCTION_X); - error("update:output([ true#0 ])", BASEX_FUNCTION_X); - error("update:output([1, (2, [ 3, true#0 ])])", BASEX_FUNCTION_X); - error("update:output(map { 1: map { 2: true#0 }})", BASEX_FUNCTION_X); + error("update:output(true#0)", BASEX_CACHE_X); + error("update:output([ true#0 ])", BASEX_CACHE_X); + error("update:output([1, (2, [ 3, true#0 ])])", BASEX_CACHE_X); + error("update:output(map { 1: map { 2: true#0 }})", BASEX_CACHE_X); } /** Test. */ diff -Nru basex-9.7.1/basex-core/src/test/resources/error.xqm basex-9.7.2/basex-core/src/test/resources/error.xqm --- basex-9.7.1/basex-core/src/test/resources/error.xqm 1970-01-01 00:00:00.000000000 +0000 +++ basex-9.7.2/basex-core/src/test/resources/error.xqm 2022-05-14 08:34:33.000000000 +0000 @@ -0,0 +1,2 @@ +module namespace x = 'x'; +X \ No newline at end of file diff -Nru basex-9.7.1/basex-examples/pom.xml basex-9.7.2/basex-examples/pom.xml --- basex-9.7.1/basex-examples/pom.xml 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-examples/pom.xml 2022-05-14 08:34:33.000000000 +0000 @@ -7,7 +7,7 @@ org.basex basex-parent - 9.7.1 + 9.7.2 .. diff -Nru basex-9.7.1/basex-tests/pom.xml basex-9.7.2/basex-tests/pom.xml --- basex-9.7.1/basex-tests/pom.xml 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/basex-tests/pom.xml 2022-05-14 08:34:33.000000000 +0000 @@ -7,7 +7,7 @@ org.basex basex-parent - 9.7.1 + 9.7.2 .. diff -Nru basex-9.7.1/CHANGELOG basex-9.7.2/CHANGELOG --- basex-9.7.1/CHANGELOG 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/CHANGELOG 2022-05-14 08:34:33.000000000 +0000 @@ -1,3 +1,9 @@ +VERSION 9.7.2 (May 14, 2022) ------------------------------------------- + + - English Stemmer: dictionary for irregular forms added + - Preview implementations of BaseX 10 features + - Performance tweaks, minor fixes + VERSION 9.7.1 (April 26, 2022) ----------------------------------------- - RESTXQ: improved caching for unmodified modules diff -Nru basex-9.7.1/debian/changelog basex-9.7.2/debian/changelog --- basex-9.7.1/debian/changelog 2022-05-08 15:12:59.000000000 +0000 +++ basex-9.7.2/debian/changelog 2022-05-30 15:11:55.000000000 +0000 @@ -1,8 +1,20 @@ +basex (9.7.2-1) unstable; urgency=medium + + * New upstream version 9.7.2 + VERSION 9.7.2 (May 14, 2022) ------------------------------------------- + - English Stemmer: dictionary for irregular forms added + - Preview implementations of BaseX 10 features + - Performance tweaks, minor fixes + * Update debian/source/include-binaries + * Tag remove-unused-source.patch as not forwarded + + -- tony mancill Mon, 30 May 2022 08:11:55 -0700 + basex (9.7.1-1) unstable; urgency=medium * New upstream version 9.7.1 VERSION 9.7.1 (April 26, 2022) ----------------------------------------- - + - RESTXQ: improved caching for unmodified modules - GUI: improved support for middle mouse button - GUI, editor: list opened files (Ctrl-F6) diff -Nru basex-9.7.1/debian/patches/remove-unused-source.patch basex-9.7.2/debian/patches/remove-unused-source.patch --- basex-9.7.1/debian/patches/remove-unused-source.patch 2022-05-08 15:12:59.000000000 +0000 +++ basex-9.7.2/debian/patches/remove-unused-source.patch 2022-05-30 15:11:55.000000000 +0000 @@ -2,6 +2,7 @@ Upstream code base contains functionality (basexhttp, dba) that is not included in this package and thus removed. Author: Alexander Holupirek +Forwarded: not-needed --- a/pom.xml +++ b/pom.xml diff -Nru basex-9.7.1/debian/source/include-binaries basex-9.7.2/debian/source/include-binaries --- basex-9.7.1/debian/source/include-binaries 2022-05-08 15:12:59.000000000 +0000 +++ basex-9.7.2/debian/source/include-binaries 2022-05-30 15:11:55.000000000 +0000 @@ -10,2204 +10,6 @@ debian/images/128x128/basex.png debian/images/192x192/basex.png debian/images/256x256/basex.png -debian/images/scalable/basex.png -../../../../dev/null -basex-core/target/basex-9.0.jar -basex-core/target/classes/img/c_close.png -basex-core/target/classes/img/c_create.png -basex-core/target/classes/img/c_editnew.png -basex-core/target/classes/img/c_editopen.png -basex-core/target/classes/img/c_filter.png -basex-core/target/classes/img/c_find.png -basex-core/target/classes/img/c_go.png -basex-core/target/classes/img/c_goback.png -basex-core/target/classes/img/c_goforward.png -basex-core/target/classes/img/c_gohome.png -basex-core/target/classes/img/c_goup.png -basex-core/target/classes/img/c_history.png -basex-core/target/classes/img/c_home.png -basex-core/target/classes/img/c_info.png -basex-core/target/classes/img/c_open_manage.png -basex-core/target/classes/img/c_save.png -basex-core/target/classes/img/c_showeditor.png -basex-core/target/classes/img/c_showexplore.png -basex-core/target/classes/img/c_showfolder.png -basex-core/target/classes/img/c_showinfo.png -basex-core/target/classes/img/c_showmap.png -basex-core/target/classes/img/c_showplot.png -basex-core/target/classes/img/c_showresult.png -basex-core/target/classes/img/c_showtable.png -basex-core/target/classes/img/c_showtree.png -basex-core/target/classes/img/c_stop.png -basex-core/target/classes/img/c_test.png -basex-core/target/classes/img/c_vars.png -basex-core/target/classes/img/e_close.png -basex-core/target/classes/img/e_close2.png -basex-core/target/classes/img/error.png -basex-core/target/classes/img/f_case.png -basex-core/target/classes/img/f_close.png -basex-core/target/classes/img/f_multi.png -basex-core/target/classes/img/f_regex.png -basex-core/target/classes/img/f_replace.png -basex-core/target/classes/img/f_word.png -basex-core/target/classes/img/file_basex.png -basex-core/target/classes/img/file_basex_32.png -basex-core/target/classes/img/file_dir1.png -basex-core/target/classes/img/file_dir1_32.png -basex-core/target/classes/img/file_dir2.png -basex-core/target/classes/img/file_dir2_32.png -basex-core/target/classes/img/file_text.png -basex-core/target/classes/img/file_text_32.png -basex-core/target/classes/img/file_unknown.png -basex-core/target/classes/img/file_unknown_32.png -basex-core/target/classes/img/file_xml.png -basex-core/target/classes/img/file_xml_32.png -basex-core/target/classes/img/file_xquery.png -basex-core/target/classes/img/file_xquery_32.png -basex-core/target/classes/img/logo_256.png -basex-core/target/classes/img/logo_64.png -basex-core/target/classes/img/ok.png -basex-core/target/classes/img/text_raw.png -basex-core/target/classes/img/text_xml.png -basex-core/target/classes/img/warn.png -basex-core/target/classes/org/basex/BaseX.class -basex-core/target/classes/org/basex/BaseXClient.class -basex-core/target/classes/org/basex/BaseXGUI.class -basex-core/target/classes/org/basex/BaseXServer$1.class -basex-core/target/classes/org/basex/BaseXServer.class -basex-core/target/classes/org/basex/api/client/ClientQuery.class -basex-core/target/classes/org/basex/api/client/ClientSession.class -basex-core/target/classes/org/basex/api/client/LocalQuery.class -basex-core/target/classes/org/basex/api/client/LocalSession.class -basex-core/target/classes/org/basex/api/client/Query.class -basex-core/target/classes/org/basex/api/client/Session.class -basex-core/target/classes/org/basex/api/dom/BXAttr.class -basex-core/target/classes/org/basex/api/dom/BXCData.class -basex-core/target/classes/org/basex/api/dom/BXChar.class -basex-core/target/classes/org/basex/api/dom/BXComm.class -basex-core/target/classes/org/basex/api/dom/BXDoc.class -basex-core/target/classes/org/basex/api/dom/BXDocFrag.class -basex-core/target/classes/org/basex/api/dom/BXDomImpl.class -basex-core/target/classes/org/basex/api/dom/BXElem.class -basex-core/target/classes/org/basex/api/dom/BXNList.class -basex-core/target/classes/org/basex/api/dom/BXNNode.class -basex-core/target/classes/org/basex/api/dom/BXNode$1.class -basex-core/target/classes/org/basex/api/dom/BXNode.class -basex-core/target/classes/org/basex/api/dom/BXPI.class -basex-core/target/classes/org/basex/api/dom/BXText.class -basex-core/target/classes/org/basex/build/BuildException.class -basex-core/target/classes/org/basex/build/BuildText$Type.class -basex-core/target/classes/org/basex/build/BuildText.class -basex-core/target/classes/org/basex/build/Builder.class -basex-core/target/classes/org/basex/build/DirParser.class -basex-core/target/classes/org/basex/build/DiskBuilder.class -basex-core/target/classes/org/basex/build/MemBuilder.class -basex-core/target/classes/org/basex/build/Parser$1.class -basex-core/target/classes/org/basex/build/Parser$2.class -basex-core/target/classes/org/basex/build/Parser.class -basex-core/target/classes/org/basex/build/SingleParser.class -basex-core/target/classes/org/basex/build/csv/CsvBuilder.class -basex-core/target/classes/org/basex/build/csv/CsvOptions$CsvFormat.class -basex-core/target/classes/org/basex/build/csv/CsvOptions$CsvSep.class -basex-core/target/classes/org/basex/build/csv/CsvOptions.class -basex-core/target/classes/org/basex/build/csv/CsvParser.class -basex-core/target/classes/org/basex/build/csv/CsvParserOptions.class -basex-core/target/classes/org/basex/build/html/HtmlOptions.class -basex-core/target/classes/org/basex/build/html/HtmlParser.class -basex-core/target/classes/org/basex/build/json/JsonOptions$JsonFormat.class -basex-core/target/classes/org/basex/build/json/JsonOptions.class -basex-core/target/classes/org/basex/build/json/JsonParser.class -basex-core/target/classes/org/basex/build/json/JsonParserOptions$JsonDuplicates.class -basex-core/target/classes/org/basex/build/json/JsonParserOptions.class -basex-core/target/classes/org/basex/build/json/JsonSerialOptions.class -basex-core/target/classes/org/basex/build/text/TextOptions.class -basex-core/target/classes/org/basex/build/text/TextParser.class -basex-core/target/classes/org/basex/build/xml/CatalogWrapper.class -basex-core/target/classes/org/basex/build/xml/DOMWrapper$NodeIterator.class -basex-core/target/classes/org/basex/build/xml/DOMWrapper.class -basex-core/target/classes/org/basex/build/xml/SAXHandler.class -basex-core/target/classes/org/basex/build/xml/SAXWrapper$1.class -basex-core/target/classes/org/basex/build/xml/SAXWrapper.class -basex-core/target/classes/org/basex/build/xml/XMLParser.class -basex-core/target/classes/org/basex/build/xml/XMLScanner$1.class -basex-core/target/classes/org/basex/build/xml/XMLScanner$Scan.class -basex-core/target/classes/org/basex/build/xml/XMLScanner.class -basex-core/target/classes/org/basex/core/BaseXException.class -basex-core/target/classes/org/basex/core/CLI.class -basex-core/target/classes/org/basex/core/Command.class -basex-core/target/classes/org/basex/core/Context.class -basex-core/target/classes/org/basex/core/Databases.class -basex-core/target/classes/org/basex/core/Datas.class -basex-core/target/classes/org/basex/core/Lang.class -basex-core/target/classes/org/basex/core/MainOptions$MainParser.class -basex-core/target/classes/org/basex/core/MainOptions.class -basex-core/target/classes/org/basex/core/Sandbox$Client.class -basex-core/target/classes/org/basex/core/Sandbox.class -basex-core/target/classes/org/basex/core/StaticOptions$AuthMethod.class -basex-core/target/classes/org/basex/core/StaticOptions.class -basex-core/target/classes/org/basex/core/Text.class -basex-core/target/classes/org/basex/core/cmd/ABackup.class -basex-core/target/classes/org/basex/core/cmd/ACreate$Code.class -basex-core/target/classes/org/basex/core/cmd/ACreate.class -basex-core/target/classes/org/basex/core/cmd/AGet.class -basex-core/target/classes/org/basex/core/cmd/AInfo.class -basex-core/target/classes/org/basex/core/cmd/AQuery.class -basex-core/target/classes/org/basex/core/cmd/ARepo.class -basex-core/target/classes/org/basex/core/cmd/AUser.class -basex-core/target/classes/org/basex/core/cmd/Add$1.class -basex-core/target/classes/org/basex/core/cmd/Add.class -basex-core/target/classes/org/basex/core/cmd/AlterDB.class -basex-core/target/classes/org/basex/core/cmd/AlterPassword.class -basex-core/target/classes/org/basex/core/cmd/AlterUser.class -basex-core/target/classes/org/basex/core/cmd/Check.class -basex-core/target/classes/org/basex/core/cmd/Close.class -basex-core/target/classes/org/basex/core/cmd/Copy.class -basex-core/target/classes/org/basex/core/cmd/CreateBackup.class -basex-core/target/classes/org/basex/core/cmd/CreateDB$1.class -basex-core/target/classes/org/basex/core/cmd/CreateDB.class -basex-core/target/classes/org/basex/core/cmd/CreateIndex$1.class -basex-core/target/classes/org/basex/core/cmd/CreateIndex$2.class -basex-core/target/classes/org/basex/core/cmd/CreateIndex.class -basex-core/target/classes/org/basex/core/cmd/CreateUser.class -basex-core/target/classes/org/basex/core/cmd/Delete$1.class -basex-core/target/classes/org/basex/core/cmd/Delete.class -basex-core/target/classes/org/basex/core/cmd/DropBackup.class -basex-core/target/classes/org/basex/core/cmd/DropDB.class -basex-core/target/classes/org/basex/core/cmd/DropIndex$1.class -basex-core/target/classes/org/basex/core/cmd/DropIndex.class -basex-core/target/classes/org/basex/core/cmd/DropUser.class -basex-core/target/classes/org/basex/core/cmd/Execute.class -basex-core/target/classes/org/basex/core/cmd/Exit.class -basex-core/target/classes/org/basex/core/cmd/Export.class -basex-core/target/classes/org/basex/core/cmd/Find.class -basex-core/target/classes/org/basex/core/cmd/Flush.class -basex-core/target/classes/org/basex/core/cmd/Get.class -basex-core/target/classes/org/basex/core/cmd/Grant.class -basex-core/target/classes/org/basex/core/cmd/Help.class -basex-core/target/classes/org/basex/core/cmd/Info.class -basex-core/target/classes/org/basex/core/cmd/InfoDB.class -basex-core/target/classes/org/basex/core/cmd/InfoIndex$1.class -basex-core/target/classes/org/basex/core/cmd/InfoIndex.class -basex-core/target/classes/org/basex/core/cmd/InfoStorage.class -basex-core/target/classes/org/basex/core/cmd/Inspect$1.class -basex-core/target/classes/org/basex/core/cmd/Inspect$Check.class -basex-core/target/classes/org/basex/core/cmd/Inspect.class -basex-core/target/classes/org/basex/core/cmd/JobsList.class -basex-core/target/classes/org/basex/core/cmd/JobsResult.class -basex-core/target/classes/org/basex/core/cmd/JobsStop.class -basex-core/target/classes/org/basex/core/cmd/Kill.class -basex-core/target/classes/org/basex/core/cmd/List.class -basex-core/target/classes/org/basex/core/cmd/Open.class -basex-core/target/classes/org/basex/core/cmd/Optimize$1.class -basex-core/target/classes/org/basex/core/cmd/Optimize.class -basex-core/target/classes/org/basex/core/cmd/OptimizeAll$1.class -basex-core/target/classes/org/basex/core/cmd/OptimizeAll$DBParser$1.class -basex-core/target/classes/org/basex/core/cmd/OptimizeAll$DBParser.class -basex-core/target/classes/org/basex/core/cmd/OptimizeAll.class -basex-core/target/classes/org/basex/core/cmd/Password.class -basex-core/target/classes/org/basex/core/cmd/Rename$1.class -basex-core/target/classes/org/basex/core/cmd/Rename.class -basex-core/target/classes/org/basex/core/cmd/Replace$1.class -basex-core/target/classes/org/basex/core/cmd/Replace.class -basex-core/target/classes/org/basex/core/cmd/RepoDelete.class -basex-core/target/classes/org/basex/core/cmd/RepoInstall.class -basex-core/target/classes/org/basex/core/cmd/RepoList.class -basex-core/target/classes/org/basex/core/cmd/Restore.class -basex-core/target/classes/org/basex/core/cmd/Retrieve.class -basex-core/target/classes/org/basex/core/cmd/Run.class -basex-core/target/classes/org/basex/core/cmd/Set.class -basex-core/target/classes/org/basex/core/cmd/ShowBackups.class -basex-core/target/classes/org/basex/core/cmd/ShowSessions.class -basex-core/target/classes/org/basex/core/cmd/ShowUsers.class -basex-core/target/classes/org/basex/core/cmd/Store$1.class -basex-core/target/classes/org/basex/core/cmd/Store.class -basex-core/target/classes/org/basex/core/cmd/Test.class -basex-core/target/classes/org/basex/core/cmd/XQuery.class -basex-core/target/classes/org/basex/core/jobs/Job$1.class -basex-core/target/classes/org/basex/core/jobs/Job.class -basex-core/target/classes/org/basex/core/jobs/JobContext.class -basex-core/target/classes/org/basex/core/jobs/JobException.class -basex-core/target/classes/org/basex/core/jobs/JobPool$1.class -basex-core/target/classes/org/basex/core/jobs/JobPool.class -basex-core/target/classes/org/basex/core/jobs/JobState.class -basex-core/target/classes/org/basex/core/jobs/Jobs.class -basex-core/target/classes/org/basex/core/jobs/JobsOptions.class -basex-core/target/classes/org/basex/core/jobs/JobsText.class -basex-core/target/classes/org/basex/core/jobs/QueryJob.class -basex-core/target/classes/org/basex/core/jobs/QueryJobResult.class -basex-core/target/classes/org/basex/core/jobs/QueryJobSpec.class -basex-core/target/classes/org/basex/core/jobs/QueryJobTask.class -basex-core/target/classes/org/basex/core/locks/FairLockQueue.class -basex-core/target/classes/org/basex/core/locks/LocalReadWriteLock.class -basex-core/target/classes/org/basex/core/locks/LockList.class -basex-core/target/classes/org/basex/core/locks/LockQueue.class -basex-core/target/classes/org/basex/core/locks/Locking.class -basex-core/target/classes/org/basex/core/locks/Locks.class -basex-core/target/classes/org/basex/core/locks/NonfairLockQueue.class -basex-core/target/classes/org/basex/core/parse/CmdBuilder.class -basex-core/target/classes/org/basex/core/parse/CommandParser.class -basex-core/target/classes/org/basex/core/parse/Commands$Cmd.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdAlter.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdCreate.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdDrop.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdIndex.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdIndexInfo.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdInfo.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdJobs.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdOptimize.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdPerm.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdRepo.class -basex-core/target/classes/org/basex/core/parse/Commands$CmdShow.class -basex-core/target/classes/org/basex/core/parse/Commands.class -basex-core/target/classes/org/basex/core/parse/PasswordReader.class -basex-core/target/classes/org/basex/core/parse/StringParser$1.class -basex-core/target/classes/org/basex/core/parse/StringParser.class -basex-core/target/classes/org/basex/core/parse/XMLParser.class -basex-core/target/classes/org/basex/core/users/Algorithm.class -basex-core/target/classes/org/basex/core/users/Code.class -basex-core/target/classes/org/basex/core/users/Perm.class -basex-core/target/classes/org/basex/core/users/User.class -basex-core/target/classes/org/basex/core/users/UserText.class -basex-core/target/classes/org/basex/core/users/Users.class -basex-core/target/classes/org/basex/data/Data$1.class -basex-core/target/classes/org/basex/data/Data.class -basex-core/target/classes/org/basex/data/DataClip.class -basex-core/target/classes/org/basex/data/DataPrinter.class -basex-core/target/classes/org/basex/data/DataText.class -basex-core/target/classes/org/basex/data/DiskData$1.class -basex-core/target/classes/org/basex/data/DiskData.class -basex-core/target/classes/org/basex/data/MemData$1.class -basex-core/target/classes/org/basex/data/MemData.class -basex-core/target/classes/org/basex/data/MetaData$1.class -basex-core/target/classes/org/basex/data/MetaData.class -basex-core/target/classes/org/basex/data/MetaProp$1.class -basex-core/target/classes/org/basex/data/MetaProp$10.class -basex-core/target/classes/org/basex/data/MetaProp$11.class -basex-core/target/classes/org/basex/data/MetaProp$12.class -basex-core/target/classes/org/basex/data/MetaProp$13.class -basex-core/target/classes/org/basex/data/MetaProp$14.class -basex-core/target/classes/org/basex/data/MetaProp$15.class -basex-core/target/classes/org/basex/data/MetaProp$16.class -basex-core/target/classes/org/basex/data/MetaProp$17.class -basex-core/target/classes/org/basex/data/MetaProp$18.class -basex-core/target/classes/org/basex/data/MetaProp$19.class -basex-core/target/classes/org/basex/data/MetaProp$2.class -basex-core/target/classes/org/basex/data/MetaProp$20.class -basex-core/target/classes/org/basex/data/MetaProp$21.class -basex-core/target/classes/org/basex/data/MetaProp$22.class -basex-core/target/classes/org/basex/data/MetaProp$23.class -basex-core/target/classes/org/basex/data/MetaProp$24.class -basex-core/target/classes/org/basex/data/MetaProp$25.class -basex-core/target/classes/org/basex/data/MetaProp$26.class -basex-core/target/classes/org/basex/data/MetaProp$27.class -basex-core/target/classes/org/basex/data/MetaProp$28.class -basex-core/target/classes/org/basex/data/MetaProp$3.class -basex-core/target/classes/org/basex/data/MetaProp$4.class -basex-core/target/classes/org/basex/data/MetaProp$5.class -basex-core/target/classes/org/basex/data/MetaProp$6.class -basex-core/target/classes/org/basex/data/MetaProp$7.class -basex-core/target/classes/org/basex/data/MetaProp$8.class -basex-core/target/classes/org/basex/data/MetaProp$9.class -basex-core/target/classes/org/basex/data/MetaProp.class -basex-core/target/classes/org/basex/data/NSNode.class -basex-core/target/classes/org/basex/data/NSScope.class -basex-core/target/classes/org/basex/data/Namespaces.class -basex-core/target/classes/org/basex/gui/GUI$1.class -basex-core/target/classes/org/basex/gui/GUI.class -basex-core/target/classes/org/basex/gui/GUICommand$1.class -basex-core/target/classes/org/basex/gui/GUICommand.class -basex-core/target/classes/org/basex/gui/GUIConstants$Msg.class -basex-core/target/classes/org/basex/gui/GUIConstants.class -basex-core/target/classes/org/basex/gui/GUIInput$1.class -basex-core/target/classes/org/basex/gui/GUIInput$GUIInputPopup.class -basex-core/target/classes/org/basex/gui/GUIInput.class -basex-core/target/classes/org/basex/gui/GUIMacOSX$AppInvocationHandler.class -basex-core/target/classes/org/basex/gui/GUIMacOSX.class -basex-core/target/classes/org/basex/gui/GUIMenu.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$1.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$10.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$11.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$12.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$13.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$14.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$15.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$16.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$17.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$18.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$19.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$2.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$20.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$21.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$22.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$23.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$24.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$25.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$26.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$27.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$28.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$29.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$3.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$30.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$31.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$32.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$33.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$34.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$35.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$36.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$37.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$38.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$39.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$4.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$40.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$41.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$42.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$43.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$44.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$45.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$46.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$47.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$48.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$49.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$5.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$50.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$51.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$52.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$53.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$54.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$55.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$56.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$57.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$58.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$59.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$6.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$7.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$8.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd$9.class -basex-core/target/classes/org/basex/gui/GUIMenuCmd.class -basex-core/target/classes/org/basex/gui/GUIOptions.class -basex-core/target/classes/org/basex/gui/GUIPopupCmd.class -basex-core/target/classes/org/basex/gui/GUIStatus.class -basex-core/target/classes/org/basex/gui/GUIToolBar.class -basex-core/target/classes/org/basex/gui/dialog/DialogAbout.class -basex-core/target/classes/org/basex/gui/dialog/DialogAdd.class -basex-core/target/classes/org/basex/gui/dialog/DialogBindings.class -basex-core/target/classes/org/basex/gui/dialog/DialogColors.class -basex-core/target/classes/org/basex/gui/dialog/DialogCsvParser.class -basex-core/target/classes/org/basex/gui/dialog/DialogEdit.class -basex-core/target/classes/org/basex/gui/dialog/DialogEditorPrefs.class -basex-core/target/classes/org/basex/gui/dialog/DialogExport.class -basex-core/target/classes/org/basex/gui/dialog/DialogFT.class -basex-core/target/classes/org/basex/gui/dialog/DialogFonts$1.class -basex-core/target/classes/org/basex/gui/dialog/DialogFonts.class -basex-core/target/classes/org/basex/gui/dialog/DialogGeneralPrefs.class -basex-core/target/classes/org/basex/gui/dialog/DialogHtmlParser.class -basex-core/target/classes/org/basex/gui/dialog/DialogImport.class -basex-core/target/classes/org/basex/gui/dialog/DialogIndex.class -basex-core/target/classes/org/basex/gui/dialog/DialogInput.class -basex-core/target/classes/org/basex/gui/dialog/DialogInsert.class -basex-core/target/classes/org/basex/gui/dialog/DialogInstallURL.class -basex-core/target/classes/org/basex/gui/dialog/DialogJsonParser.class -basex-core/target/classes/org/basex/gui/dialog/DialogLine.class -basex-core/target/classes/org/basex/gui/dialog/DialogManage.class -basex-core/target/classes/org/basex/gui/dialog/DialogMem$1.class -basex-core/target/classes/org/basex/gui/dialog/DialogMem.class -basex-core/target/classes/org/basex/gui/dialog/DialogMessage.class -basex-core/target/classes/org/basex/gui/dialog/DialogNew.class -basex-core/target/classes/org/basex/gui/dialog/DialogOptions.class -basex-core/target/classes/org/basex/gui/dialog/DialogPackages.class -basex-core/target/classes/org/basex/gui/dialog/DialogParser.class -basex-core/target/classes/org/basex/gui/dialog/DialogParsing$1.class -basex-core/target/classes/org/basex/gui/dialog/DialogParsing.class -basex-core/target/classes/org/basex/gui/dialog/DialogPass.class -basex-core/target/classes/org/basex/gui/dialog/DialogPrefs.class -basex-core/target/classes/org/basex/gui/dialog/DialogProgress.class -basex-core/target/classes/org/basex/gui/dialog/DialogProps.class -basex-core/target/classes/org/basex/gui/dialog/DialogResources$1.class -basex-core/target/classes/org/basex/gui/dialog/DialogResources$DeleteCmd.class -basex-core/target/classes/org/basex/gui/dialog/DialogResources$RenameCmd.class -basex-core/target/classes/org/basex/gui/dialog/DialogResources$TreeNodeRenderer.class -basex-core/target/classes/org/basex/gui/dialog/DialogResources.class -basex-core/target/classes/org/basex/gui/dialog/DialogSort.class -basex-core/target/classes/org/basex/gui/dialog/DialogTextParser.class -basex-core/target/classes/org/basex/gui/dialog/DialogValues.class -basex-core/target/classes/org/basex/gui/dialog/DialogVisualPrefs.class -basex-core/target/classes/org/basex/gui/dialog/DialogXmlParser.class -basex-core/target/classes/org/basex/gui/layout/BaseXBack.class -basex-core/target/classes/org/basex/gui/layout/BaseXButton.class -basex-core/target/classes/org/basex/gui/layout/BaseXCheckBox.class -basex-core/target/classes/org/basex/gui/layout/BaseXCombo$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXCombo$BaseXEditor.class -basex-core/target/classes/org/basex/gui/layout/BaseXCombo.class -basex-core/target/classes/org/basex/gui/layout/BaseXDSlider$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXDSlider$Range.class -basex-core/target/classes/org/basex/gui/layout/BaseXDSlider.class -basex-core/target/classes/org/basex/gui/layout/BaseXDialog$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXDialog.class -basex-core/target/classes/org/basex/gui/layout/BaseXFileChooser$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXFileChooser$Filter.class -basex-core/target/classes/org/basex/gui/layout/BaseXFileChooser$Mode.class -basex-core/target/classes/org/basex/gui/layout/BaseXFileChooser.class -basex-core/target/classes/org/basex/gui/layout/BaseXHeader.class -basex-core/target/classes/org/basex/gui/layout/BaseXHistory.class -basex-core/target/classes/org/basex/gui/layout/BaseXImages.class -basex-core/target/classes/org/basex/gui/layout/BaseXKeys.class -basex-core/target/classes/org/basex/gui/layout/BaseXLabel.class -basex-core/target/classes/org/basex/gui/layout/BaseXLayout$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXLayout$DropHandler.class -basex-core/target/classes/org/basex/gui/layout/BaseXLayout.class -basex-core/target/classes/org/basex/gui/layout/BaseXList$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXList$2.class -basex-core/target/classes/org/basex/gui/layout/BaseXList.class -basex-core/target/classes/org/basex/gui/layout/BaseXMem$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXMem.class -basex-core/target/classes/org/basex/gui/layout/BaseXPanel.class -basex-core/target/classes/org/basex/gui/layout/BaseXPassword.class -basex-core/target/classes/org/basex/gui/layout/BaseXPopup$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXPopup.class -basex-core/target/classes/org/basex/gui/layout/BaseXRadio.class -basex-core/target/classes/org/basex/gui/layout/BaseXScrollBar.class -basex-core/target/classes/org/basex/gui/layout/BaseXSerial.class -basex-core/target/classes/org/basex/gui/layout/BaseXSlider$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXSlider.class -basex-core/target/classes/org/basex/gui/layout/BaseXSplit.class -basex-core/target/classes/org/basex/gui/layout/BaseXSplitSep$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXSplitSep.class -basex-core/target/classes/org/basex/gui/layout/BaseXTabs$1.class -basex-core/target/classes/org/basex/gui/layout/BaseXTabs$2.class -basex-core/target/classes/org/basex/gui/layout/BaseXTabs.class -basex-core/target/classes/org/basex/gui/layout/BaseXTextField.class -basex-core/target/classes/org/basex/gui/layout/BaseXTextHint.class -basex-core/target/classes/org/basex/gui/layout/BaseXTree.class -basex-core/target/classes/org/basex/gui/layout/BaseXWindow.class -basex-core/target/classes/org/basex/gui/layout/GUICode.class -basex-core/target/classes/org/basex/gui/layout/GUIWorker$1.class -basex-core/target/classes/org/basex/gui/layout/GUIWorker.class -basex-core/target/classes/org/basex/gui/layout/ResourceFolder.class -basex-core/target/classes/org/basex/gui/layout/ResourceLeaf.class -basex-core/target/classes/org/basex/gui/layout/ResourceNode.class -basex-core/target/classes/org/basex/gui/layout/ResourceRootFolder.class -basex-core/target/classes/org/basex/gui/layout/TableLayout.class -basex-core/target/classes/org/basex/gui/listener/FocusGainedListener.class -basex-core/target/classes/org/basex/gui/listener/FocusLostListener.class -basex-core/target/classes/org/basex/gui/listener/KeyPressedListener.class -basex-core/target/classes/org/basex/gui/listener/KeyReleasedListener.class -basex-core/target/classes/org/basex/gui/listener/KeyTypedListener.class -basex-core/target/classes/org/basex/gui/listener/LinkListener.class -basex-core/target/classes/org/basex/gui/listener/MouseClickedListener.class -basex-core/target/classes/org/basex/gui/listener/MouseEnteredListener.class -basex-core/target/classes/org/basex/gui/text/ReplaceContext.class -basex-core/target/classes/org/basex/gui/text/SearchBar$1.class -basex-core/target/classes/org/basex/gui/text/SearchBar$SearchDir.class -basex-core/target/classes/org/basex/gui/text/SearchBar.class -basex-core/target/classes/org/basex/gui/text/SearchContext.class -basex-core/target/classes/org/basex/gui/text/SearchEditor.class -basex-core/target/classes/org/basex/gui/text/Syntax$1.class -basex-core/target/classes/org/basex/gui/text/Syntax.class -basex-core/target/classes/org/basex/gui/text/SyntaxJS.class -basex-core/target/classes/org/basex/gui/text/SyntaxJSON.class -basex-core/target/classes/org/basex/gui/text/SyntaxXML.class -basex-core/target/classes/org/basex/gui/text/SyntaxXQuery.class -basex-core/target/classes/org/basex/gui/text/TextEditor$1.class -basex-core/target/classes/org/basex/gui/text/TextEditor$Case.class -basex-core/target/classes/org/basex/gui/text/TextEditor.class -basex-core/target/classes/org/basex/gui/text/TextIterator.class -basex-core/target/classes/org/basex/gui/text/TextPanel$1.class -basex-core/target/classes/org/basex/gui/text/TextPanel$2.class -basex-core/target/classes/org/basex/gui/text/TextPanel$3.class -basex-core/target/classes/org/basex/gui/text/TextPanel$4.class -basex-core/target/classes/org/basex/gui/text/TextPanel$Action.class -basex-core/target/classes/org/basex/gui/text/TextPanel$AllCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$CopyCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$CutCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$DelCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$FindCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$FindNextCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$FindPrevCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$GotoCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$PasteCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$RedoCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel$UndoCmd.class -basex-core/target/classes/org/basex/gui/text/TextPanel.class -basex-core/target/classes/org/basex/gui/text/TextRenderer.class -basex-core/target/classes/org/basex/gui/view/View.class -basex-core/target/classes/org/basex/gui/view/ViewComponent.class -basex-core/target/classes/org/basex/gui/view/ViewContainer$Location.class -basex-core/target/classes/org/basex/gui/view/ViewContainer.class -basex-core/target/classes/org/basex/gui/view/ViewData.class -basex-core/target/classes/org/basex/gui/view/ViewLayout.class -basex-core/target/classes/org/basex/gui/view/ViewMover$1.class -basex-core/target/classes/org/basex/gui/view/ViewMover.class -basex-core/target/classes/org/basex/gui/view/ViewNotifier.class -basex-core/target/classes/org/basex/gui/view/ViewPanel.class -basex-core/target/classes/org/basex/gui/view/ViewRect.class -basex-core/target/classes/org/basex/gui/view/editor/EditorArea.class -basex-core/target/classes/org/basex/gui/view/editor/EditorView$1.class -basex-core/target/classes/org/basex/gui/view/editor/EditorView$2.class -basex-core/target/classes/org/basex/gui/view/editor/EditorView$3.class -basex-core/target/classes/org/basex/gui/view/editor/EditorView.class -basex-core/target/classes/org/basex/gui/view/explore/ExploreArea.class -basex-core/target/classes/org/basex/gui/view/explore/ExploreView.class -basex-core/target/classes/org/basex/gui/view/folder/FolderIterator.class -basex-core/target/classes/org/basex/gui/view/folder/FolderView.class -basex-core/target/classes/org/basex/gui/view/info/InfoView.class -basex-core/target/classes/org/basex/gui/view/map/BinaryAlgo.class -basex-core/target/classes/org/basex/gui/view/map/MapAlgo.class -basex-core/target/classes/org/basex/gui/view/map/MapDefault.class -basex-core/target/classes/org/basex/gui/view/map/MapLayout.class -basex-core/target/classes/org/basex/gui/view/map/MapList.class -basex-core/target/classes/org/basex/gui/view/map/MapPainter.class -basex-core/target/classes/org/basex/gui/view/map/MapRect.class -basex-core/target/classes/org/basex/gui/view/map/MapRects.class -basex-core/target/classes/org/basex/gui/view/map/MapRenderer.class -basex-core/target/classes/org/basex/gui/view/map/MapView.class -basex-core/target/classes/org/basex/gui/view/map/SliceDiceAlgo.class -basex-core/target/classes/org/basex/gui/view/map/SplitAlgo.class -basex-core/target/classes/org/basex/gui/view/map/SquarifiedAlgo.class -basex-core/target/classes/org/basex/gui/view/map/StripAlgo.class -basex-core/target/classes/org/basex/gui/view/plot/PlotAxis.class -basex-core/target/classes/org/basex/gui/view/plot/PlotData.class -basex-core/target/classes/org/basex/gui/view/plot/PlotView.class -basex-core/target/classes/org/basex/gui/view/project/ProjectCache.class -basex-core/target/classes/org/basex/gui/view/project/ProjectCellEditor.class -basex-core/target/classes/org/basex/gui/view/project/ProjectCellRenderer.class -basex-core/target/classes/org/basex/gui/view/project/ProjectDir.class -basex-core/target/classes/org/basex/gui/view/project/ProjectFile.class -basex-core/target/classes/org/basex/gui/view/project/ProjectFiles.class -basex-core/target/classes/org/basex/gui/view/project/ProjectFilter$1.class -basex-core/target/classes/org/basex/gui/view/project/ProjectFilter$2.class -basex-core/target/classes/org/basex/gui/view/project/ProjectFilter.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$1.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$2.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$3.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$4.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$5.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$CellRenderer$1.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList$CellRenderer.class -basex-core/target/classes/org/basex/gui/view/project/ProjectList.class -basex-core/target/classes/org/basex/gui/view/project/ProjectNode.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$CopyPathCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$DeleteCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$NewDirCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$OpenCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$OpenExternalCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$RefreshCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$RenameCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree$TestCmd.class -basex-core/target/classes/org/basex/gui/view/project/ProjectTree.class -basex-core/target/classes/org/basex/gui/view/project/ProjectView$1.class -basex-core/target/classes/org/basex/gui/view/project/ProjectView$2.class -basex-core/target/classes/org/basex/gui/view/project/ProjectView$3.class -basex-core/target/classes/org/basex/gui/view/project/ProjectView.class -basex-core/target/classes/org/basex/gui/view/table/TableContent.class -basex-core/target/classes/org/basex/gui/view/table/TableData$TableCol.class -basex-core/target/classes/org/basex/gui/view/table/TableData.class -basex-core/target/classes/org/basex/gui/view/table/TableHeader$1.class -basex-core/target/classes/org/basex/gui/view/table/TableHeader.class -basex-core/target/classes/org/basex/gui/view/table/TableInput$1.class -basex-core/target/classes/org/basex/gui/view/table/TableInput.class -basex-core/target/classes/org/basex/gui/view/table/TableIterator.class -basex-core/target/classes/org/basex/gui/view/table/TableView.class -basex-core/target/classes/org/basex/gui/view/text/TextView.class -basex-core/target/classes/org/basex/gui/view/tree/TreeBorder.class -basex-core/target/classes/org/basex/gui/view/tree/TreeConstants$Draw.class -basex-core/target/classes/org/basex/gui/view/tree/TreeConstants$Refresh.class -basex-core/target/classes/org/basex/gui/view/tree/TreeConstants.class -basex-core/target/classes/org/basex/gui/view/tree/TreeNodeCache.class -basex-core/target/classes/org/basex/gui/view/tree/TreeRect.class -basex-core/target/classes/org/basex/gui/view/tree/TreeRects.class -basex-core/target/classes/org/basex/gui/view/tree/TreeSubtree.class -basex-core/target/classes/org/basex/gui/view/tree/TreeView$1.class -basex-core/target/classes/org/basex/gui/view/tree/TreeView.class -basex-core/target/classes/org/basex/index/IdPreMap.class -basex-core/target/classes/org/basex/index/Index.class -basex-core/target/classes/org/basex/index/IndexBuilder$1.class -basex-core/target/classes/org/basex/index/IndexBuilder.class -basex-core/target/classes/org/basex/index/IndexCache$BucketEntry.class -basex-core/target/classes/org/basex/index/IndexCache.class -basex-core/target/classes/org/basex/index/IndexEntry.class -basex-core/target/classes/org/basex/index/IndexNames.class -basex-core/target/classes/org/basex/index/IndexTree.class -basex-core/target/classes/org/basex/index/IndexType.class -basex-core/target/classes/org/basex/index/ValuesBuilder.class -basex-core/target/classes/org/basex/index/ft/FTBuilder.class -basex-core/target/classes/org/basex/index/ft/FTIndex$1.class -basex-core/target/classes/org/basex/index/ft/FTIndex$2.class -basex-core/target/classes/org/basex/index/ft/FTIndex$FTCache.class -basex-core/target/classes/org/basex/index/ft/FTIndex.class -basex-core/target/classes/org/basex/index/ft/FTIndexTree.class -basex-core/target/classes/org/basex/index/ft/FTIndexTrees.class -basex-core/target/classes/org/basex/index/ft/FTList.class -basex-core/target/classes/org/basex/index/name/Names$1.class -basex-core/target/classes/org/basex/index/name/Names.class -basex-core/target/classes/org/basex/index/path/PathIndex.class -basex-core/target/classes/org/basex/index/path/PathNode.class -basex-core/target/classes/org/basex/index/query/EntryIterator.class -basex-core/target/classes/org/basex/index/query/FTIndexIterator$1.class -basex-core/target/classes/org/basex/index/query/FTIndexIterator$2.class -basex-core/target/classes/org/basex/index/query/FTIndexIterator$3.class -basex-core/target/classes/org/basex/index/query/FTIndexIterator.class -basex-core/target/classes/org/basex/index/query/IndexEntries.class -basex-core/target/classes/org/basex/index/query/IndexIterator$1.class -basex-core/target/classes/org/basex/index/query/IndexIterator.class -basex-core/target/classes/org/basex/index/query/IndexToken.class -basex-core/target/classes/org/basex/index/query/NumericRange.class -basex-core/target/classes/org/basex/index/query/StringRange.class -basex-core/target/classes/org/basex/index/query/StringToken.class -basex-core/target/classes/org/basex/index/resource/Binaries.class -basex-core/target/classes/org/basex/index/resource/Docs.class -basex-core/target/classes/org/basex/index/resource/Resources.class -basex-core/target/classes/org/basex/index/stats/IndexStats.class -basex-core/target/classes/org/basex/index/stats/Stats.class -basex-core/target/classes/org/basex/index/stats/StatsType.class -basex-core/target/classes/org/basex/index/value/DiskValues$1.class -basex-core/target/classes/org/basex/index/value/DiskValues$2.class -basex-core/target/classes/org/basex/index/value/DiskValues$3.class -basex-core/target/classes/org/basex/index/value/DiskValues$4.class -basex-core/target/classes/org/basex/index/value/DiskValues.class -basex-core/target/classes/org/basex/index/value/DiskValuesBuilder.class -basex-core/target/classes/org/basex/index/value/DiskValuesMerger.class -basex-core/target/classes/org/basex/index/value/MemValues$1.class -basex-core/target/classes/org/basex/index/value/MemValues$2.class -basex-core/target/classes/org/basex/index/value/MemValues.class -basex-core/target/classes/org/basex/index/value/MemValuesBuilder.class -basex-core/target/classes/org/basex/index/value/UpdatableDiskValues.class -basex-core/target/classes/org/basex/index/value/ValueCache.class -basex-core/target/classes/org/basex/index/value/ValueIndex.class -basex-core/target/classes/org/basex/io/IO.class -basex-core/target/classes/org/basex/io/IOContent.class -basex-core/target/classes/org/basex/io/IOFile.class -basex-core/target/classes/org/basex/io/IOStream.class -basex-core/target/classes/org/basex/io/IOUrl$1.class -basex-core/target/classes/org/basex/io/IOUrl.class -basex-core/target/classes/org/basex/io/Zip.class -basex-core/target/classes/org/basex/io/in/ArrayInput.class -basex-core/target/classes/org/basex/io/in/BufferInput.class -basex-core/target/classes/org/basex/io/in/DataInput.class -basex-core/target/classes/org/basex/io/in/EncodingException.class -basex-core/target/classes/org/basex/io/in/InputException.class -basex-core/target/classes/org/basex/io/in/LookupInput.class -basex-core/target/classes/org/basex/io/in/NewlineInput.class -basex-core/target/classes/org/basex/io/in/ServerInput.class -basex-core/target/classes/org/basex/io/in/TarEntry.class -basex-core/target/classes/org/basex/io/in/TarInputStream.class -basex-core/target/classes/org/basex/io/in/TextDecoder$1.class -basex-core/target/classes/org/basex/io/in/TextDecoder$Generic.class -basex-core/target/classes/org/basex/io/in/TextDecoder$UTF16BE.class -basex-core/target/classes/org/basex/io/in/TextDecoder$UTF16LE.class -basex-core/target/classes/org/basex/io/in/TextDecoder$UTF32.class -basex-core/target/classes/org/basex/io/in/TextDecoder$UTF8.class -basex-core/target/classes/org/basex/io/in/TextDecoder.class -basex-core/target/classes/org/basex/io/in/TextInput.class -basex-core/target/classes/org/basex/io/in/XMLInput.class -basex-core/target/classes/org/basex/io/out/ArrayOutput.class -basex-core/target/classes/org/basex/io/out/BufferOutput.class -basex-core/target/classes/org/basex/io/out/DataOutput.class -basex-core/target/classes/org/basex/io/out/EncoderOutput.class -basex-core/target/classes/org/basex/io/out/NewlineOutput.class -basex-core/target/classes/org/basex/io/out/NullOutput.class -basex-core/target/classes/org/basex/io/out/PrintOutput.class -basex-core/target/classes/org/basex/io/out/ServerOutput.class -basex-core/target/classes/org/basex/io/out/TableOutput.class -basex-core/target/classes/org/basex/io/parse/csv/CsvConverter$1.class -basex-core/target/classes/org/basex/io/parse/csv/CsvConverter.class -basex-core/target/classes/org/basex/io/parse/csv/CsvDirectConverter.class -basex-core/target/classes/org/basex/io/parse/csv/CsvParser.class -basex-core/target/classes/org/basex/io/parse/csv/CsvXQueryConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonAttsConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonBasicConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonConstants.class -basex-core/target/classes/org/basex/io/parse/json/JsonConverter$1.class -basex-core/target/classes/org/basex/io/parse/json/JsonConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonDirectConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonFallback.class -basex-core/target/classes/org/basex/io/parse/json/JsonMLConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonParser.class -basex-core/target/classes/org/basex/io/parse/json/JsonXQueryConverter.class -basex-core/target/classes/org/basex/io/parse/json/JsonXmlConverter$1.class -basex-core/target/classes/org/basex/io/parse/json/JsonXmlConverter$TypeCache.class -basex-core/target/classes/org/basex/io/parse/json/JsonXmlConverter.class -basex-core/target/classes/org/basex/io/parse/xml/XmlParser$1.class -basex-core/target/classes/org/basex/io/parse/xml/XmlParser$XmlHandler.class -basex-core/target/classes/org/basex/io/parse/xml/XmlParser.class -basex-core/target/classes/org/basex/io/random/Buffer.class -basex-core/target/classes/org/basex/io/random/Buffers.class -basex-core/target/classes/org/basex/io/random/DataAccess.class -basex-core/target/classes/org/basex/io/random/TableAccess.class -basex-core/target/classes/org/basex/io/random/TableDiskAccess.class -basex-core/target/classes/org/basex/io/random/TableMemAccess.class -basex-core/target/classes/org/basex/io/serial/AdaptiveSerializer.class -basex-core/target/classes/org/basex/io/serial/BaseXSerializer.class -basex-core/target/classes/org/basex/io/serial/BuilderSerializer.class -basex-core/target/classes/org/basex/io/serial/HTMLSerializer.class -basex-core/target/classes/org/basex/io/serial/MarkupSerializer.class -basex-core/target/classes/org/basex/io/serial/OutputSerializer.class -basex-core/target/classes/org/basex/io/serial/SAXSerializer$1.class -basex-core/target/classes/org/basex/io/serial/SAXSerializer$NSDecl.class -basex-core/target/classes/org/basex/io/serial/SAXSerializer.class -basex-core/target/classes/org/basex/io/serial/SerialMethod.class -basex-core/target/classes/org/basex/io/serial/Serializer$1.class -basex-core/target/classes/org/basex/io/serial/Serializer.class -basex-core/target/classes/org/basex/io/serial/SerializerMode$1.class -basex-core/target/classes/org/basex/io/serial/SerializerMode$2.class -basex-core/target/classes/org/basex/io/serial/SerializerMode$3.class -basex-core/target/classes/org/basex/io/serial/SerializerMode$4.class -basex-core/target/classes/org/basex/io/serial/SerializerMode.class -basex-core/target/classes/org/basex/io/serial/SerializerOptions$Newline.class -basex-core/target/classes/org/basex/io/serial/SerializerOptions.class -basex-core/target/classes/org/basex/io/serial/StandardSerializer.class -basex-core/target/classes/org/basex/io/serial/TextSerializer.class -basex-core/target/classes/org/basex/io/serial/XHTMLSerializer.class -basex-core/target/classes/org/basex/io/serial/XMLSerializer.class -basex-core/target/classes/org/basex/io/serial/csv/CsvDirectSerializer.class -basex-core/target/classes/org/basex/io/serial/csv/CsvSerializer.class -basex-core/target/classes/org/basex/io/serial/csv/CsvXQuerySerializer.class -basex-core/target/classes/org/basex/io/serial/dot/DOTData.class -basex-core/target/classes/org/basex/io/serial/dot/DOTSerializer.class -basex-core/target/classes/org/basex/io/serial/json/JsonBasicSerializer.class -basex-core/target/classes/org/basex/io/serial/json/JsonMLSerializer.class -basex-core/target/classes/org/basex/io/serial/json/JsonNodeSerializer.class -basex-core/target/classes/org/basex/io/serial/json/JsonSerializer.class -basex-core/target/classes/org/basex/query/CompileContext.class -basex-core/target/classes/org/basex/query/QueryCompiler$1.class -basex-core/target/classes/org/basex/query/QueryCompiler$2.class -basex-core/target/classes/org/basex/query/QueryCompiler.class -basex-core/target/classes/org/basex/query/QueryContext.class -basex-core/target/classes/org/basex/query/QueryDateTime.class -basex-core/target/classes/org/basex/query/QueryError$ErrType.class -basex-core/target/classes/org/basex/query/QueryError.class -basex-core/target/classes/org/basex/query/QueryException$1.class -basex-core/target/classes/org/basex/query/QueryException.class -basex-core/target/classes/org/basex/query/QueryFocus.class -basex-core/target/classes/org/basex/query/QueryFunction.class -basex-core/target/classes/org/basex/query/QueryIOException.class -basex-core/target/classes/org/basex/query/QueryInfo$1.class -basex-core/target/classes/org/basex/query/QueryInfo.class -basex-core/target/classes/org/basex/query/QueryInput.class -basex-core/target/classes/org/basex/query/QueryModule$ContextDependent.class -basex-core/target/classes/org/basex/query/QueryModule$Deterministic.class -basex-core/target/classes/org/basex/query/QueryModule$FocusDependent.class -basex-core/target/classes/org/basex/query/QueryModule$Lock.class -basex-core/target/classes/org/basex/query/QueryModule$Permission.class -basex-core/target/classes/org/basex/query/QueryModule$Requires.class -basex-core/target/classes/org/basex/query/QueryModule.class -basex-core/target/classes/org/basex/query/QueryParser$1.class -basex-core/target/classes/org/basex/query/QueryParser.class -basex-core/target/classes/org/basex/query/QueryProcessor.class -basex-core/target/classes/org/basex/query/QueryRTException.class -basex-core/target/classes/org/basex/query/QueryResource.class -basex-core/target/classes/org/basex/query/QueryResources.class -basex-core/target/classes/org/basex/query/QuerySuggest.class -basex-core/target/classes/org/basex/query/QueryText.class -basex-core/target/classes/org/basex/query/QueryTracer.class -basex-core/target/classes/org/basex/query/StaticContext.class -basex-core/target/classes/org/basex/query/ann/Ann.class -basex-core/target/classes/org/basex/query/ann/Annotation.class -basex-core/target/classes/org/basex/query/expr/And.class -basex-core/target/classes/org/basex/query/expr/Arith.class -basex-core/target/classes/org/basex/query/expr/Arr.class -basex-core/target/classes/org/basex/query/expr/BaseXPragma.class -basex-core/target/classes/org/basex/query/expr/CachedFilter.class -basex-core/target/classes/org/basex/query/expr/CachedMap.class -basex-core/target/classes/org/basex/query/expr/Calc$1.class -basex-core/target/classes/org/basex/query/expr/Calc$2.class -basex-core/target/classes/org/basex/query/expr/Calc$3.class -basex-core/target/classes/org/basex/query/expr/Calc$4.class -basex-core/target/classes/org/basex/query/expr/Calc$5.class -basex-core/target/classes/org/basex/query/expr/Calc$6.class -basex-core/target/classes/org/basex/query/expr/Calc.class -basex-core/target/classes/org/basex/query/expr/Cast.class -basex-core/target/classes/org/basex/query/expr/Castable.class -basex-core/target/classes/org/basex/query/expr/Catch.class -basex-core/target/classes/org/basex/query/expr/Cmp.class -basex-core/target/classes/org/basex/query/expr/CmpG$1.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$1.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$2.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$3.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$4.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$5.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG$6.class -basex-core/target/classes/org/basex/query/expr/CmpG$OpG.class -basex-core/target/classes/org/basex/query/expr/CmpG.class -basex-core/target/classes/org/basex/query/expr/CmpHashG$1.class -basex-core/target/classes/org/basex/query/expr/CmpHashG$CmpCache.class -basex-core/target/classes/org/basex/query/expr/CmpHashG.class -basex-core/target/classes/org/basex/query/expr/CmpN$1.class -basex-core/target/classes/org/basex/query/expr/CmpN$OpN$1.class -basex-core/target/classes/org/basex/query/expr/CmpN$OpN$2.class -basex-core/target/classes/org/basex/query/expr/CmpN$OpN$3.class -basex-core/target/classes/org/basex/query/expr/CmpN$OpN.class -basex-core/target/classes/org/basex/query/expr/CmpN.class -basex-core/target/classes/org/basex/query/expr/CmpR$1.class -basex-core/target/classes/org/basex/query/expr/CmpR.class -basex-core/target/classes/org/basex/query/expr/CmpSR$1.class -basex-core/target/classes/org/basex/query/expr/CmpSR.class -basex-core/target/classes/org/basex/query/expr/CmpSimpleG.class -basex-core/target/classes/org/basex/query/expr/CmpV$1.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$1.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$2.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$3.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$4.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$5.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV$6.class -basex-core/target/classes/org/basex/query/expr/CmpV$OpV.class -basex-core/target/classes/org/basex/query/expr/CmpV.class -basex-core/target/classes/org/basex/query/expr/ContextValue.class -basex-core/target/classes/org/basex/query/expr/DBPragma.class -basex-core/target/classes/org/basex/query/expr/Except$1.class -basex-core/target/classes/org/basex/query/expr/Except.class -basex-core/target/classes/org/basex/query/expr/Expr$1.class -basex-core/target/classes/org/basex/query/expr/Expr$2.class -basex-core/target/classes/org/basex/query/expr/Expr.class -basex-core/target/classes/org/basex/query/expr/ExprInfo.class -basex-core/target/classes/org/basex/query/expr/Extension.class -basex-core/target/classes/org/basex/query/expr/Filter.class -basex-core/target/classes/org/basex/query/expr/If.class -basex-core/target/classes/org/basex/query/expr/Instance.class -basex-core/target/classes/org/basex/query/expr/Intersect$1.class -basex-core/target/classes/org/basex/query/expr/Intersect.class -basex-core/target/classes/org/basex/query/expr/ItemMap.class -basex-core/target/classes/org/basex/query/expr/IterFilter$1.class -basex-core/target/classes/org/basex/query/expr/IterFilter.class -basex-core/target/classes/org/basex/query/expr/IterMap$1.class -basex-core/target/classes/org/basex/query/expr/IterMap.class -basex-core/target/classes/org/basex/query/expr/ItrPos$1.class -basex-core/target/classes/org/basex/query/expr/ItrPos.class -basex-core/target/classes/org/basex/query/expr/List$1.class -basex-core/target/classes/org/basex/query/expr/List.class -basex-core/target/classes/org/basex/query/expr/Logical.class -basex-core/target/classes/org/basex/query/expr/Lookup.class -basex-core/target/classes/org/basex/query/expr/Or.class -basex-core/target/classes/org/basex/query/expr/ParseExpr.class -basex-core/target/classes/org/basex/query/expr/Pos$1.class -basex-core/target/classes/org/basex/query/expr/Pos.class -basex-core/target/classes/org/basex/query/expr/Pragma.class -basex-core/target/classes/org/basex/query/expr/Preds.class -basex-core/target/classes/org/basex/query/expr/Quantifier.class -basex-core/target/classes/org/basex/query/expr/Range.class -basex-core/target/classes/org/basex/query/expr/Root.class -basex-core/target/classes/org/basex/query/expr/Set$SetIter.class -basex-core/target/classes/org/basex/query/expr/Set.class -basex-core/target/classes/org/basex/query/expr/Simple.class -basex-core/target/classes/org/basex/query/expr/SimpleFilter.class -basex-core/target/classes/org/basex/query/expr/SimpleMap.class -basex-core/target/classes/org/basex/query/expr/Single.class -basex-core/target/classes/org/basex/query/expr/Switch.class -basex-core/target/classes/org/basex/query/expr/SwitchGroup.class -basex-core/target/classes/org/basex/query/expr/Treat$1.class -basex-core/target/classes/org/basex/query/expr/Treat.class -basex-core/target/classes/org/basex/query/expr/Try.class -basex-core/target/classes/org/basex/query/expr/TypeCheck$1.class -basex-core/target/classes/org/basex/query/expr/TypeCheck.class -basex-core/target/classes/org/basex/query/expr/Typeswitch.class -basex-core/target/classes/org/basex/query/expr/TypeswitchGroup.class -basex-core/target/classes/org/basex/query/expr/Unary.class -basex-core/target/classes/org/basex/query/expr/Union$1.class -basex-core/target/classes/org/basex/query/expr/Union.class -basex-core/target/classes/org/basex/query/expr/constr/CArray.class -basex-core/target/classes/org/basex/query/expr/constr/CAttr.class -basex-core/target/classes/org/basex/query/expr/constr/CComm.class -basex-core/target/classes/org/basex/query/expr/constr/CDoc.class -basex-core/target/classes/org/basex/query/expr/constr/CElem.class -basex-core/target/classes/org/basex/query/expr/constr/CMap.class -basex-core/target/classes/org/basex/query/expr/constr/CNSpace.class -basex-core/target/classes/org/basex/query/expr/constr/CName.class -basex-core/target/classes/org/basex/query/expr/constr/CNode.class -basex-core/target/classes/org/basex/query/expr/constr/CPI.class -basex-core/target/classes/org/basex/query/expr/constr/CTxt.class -basex-core/target/classes/org/basex/query/expr/constr/Constr.class -basex-core/target/classes/org/basex/query/expr/ft/FTAnd$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTAnd.class -basex-core/target/classes/org/basex/query/expr/ft/FTContains.class -basex-core/target/classes/org/basex/query/expr/ft/FTContent.class -basex-core/target/classes/org/basex/query/expr/ft/FTDistance.class -basex-core/target/classes/org/basex/query/expr/ft/FTExpr.class -basex-core/target/classes/org/basex/query/expr/ft/FTExtension.class -basex-core/target/classes/org/basex/query/expr/ft/FTFilter$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTFilter.class -basex-core/target/classes/org/basex/query/expr/ft/FTIndexAccess$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTIndexAccess.class -basex-core/target/classes/org/basex/query/expr/ft/FTMildNot$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTMildNot.class -basex-core/target/classes/org/basex/query/expr/ft/FTNot$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTNot.class -basex-core/target/classes/org/basex/query/expr/ft/FTOptions.class -basex-core/target/classes/org/basex/query/expr/ft/FTOr$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTOr.class -basex-core/target/classes/org/basex/query/expr/ft/FTOrder.class -basex-core/target/classes/org/basex/query/expr/ft/FTScope.class -basex-core/target/classes/org/basex/query/expr/ft/FTTokenizer.class -basex-core/target/classes/org/basex/query/expr/ft/FTTokens.class -basex-core/target/classes/org/basex/query/expr/ft/FTWeight$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTWeight.class -basex-core/target/classes/org/basex/query/expr/ft/FTWildcard.class -basex-core/target/classes/org/basex/query/expr/ft/FTWindow.class -basex-core/target/classes/org/basex/query/expr/ft/FTWords$1.class -basex-core/target/classes/org/basex/query/expr/ft/FTWords$2.class -basex-core/target/classes/org/basex/query/expr/ft/FTWords$3.class -basex-core/target/classes/org/basex/query/expr/ft/FTWords.class -basex-core/target/classes/org/basex/query/expr/ft/ThesQuery.class -basex-core/target/classes/org/basex/query/expr/ft/Thesaurus$1.class -basex-core/target/classes/org/basex/query/expr/ft/Thesaurus$ThesNode.class -basex-core/target/classes/org/basex/query/expr/ft/Thesaurus.class -basex-core/target/classes/org/basex/query/expr/gflwor/Clause$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/Clause.class -basex-core/target/classes/org/basex/query/expr/gflwor/Condition.class -basex-core/target/classes/org/basex/query/expr/gflwor/Count$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/Count.class -basex-core/target/classes/org/basex/query/expr/gflwor/For$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/For.class -basex-core/target/classes/org/basex/query/expr/gflwor/ForLet.class -basex-core/target/classes/org/basex/query/expr/gflwor/GFLWOR$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/GFLWOR$2.class -basex-core/target/classes/org/basex/query/expr/gflwor/GFLWOR$Eval.class -basex-core/target/classes/org/basex/query/expr/gflwor/GFLWOR$StartEval.class -basex-core/target/classes/org/basex/query/expr/gflwor/GFLWOR.class -basex-core/target/classes/org/basex/query/expr/gflwor/Group.class -basex-core/target/classes/org/basex/query/expr/gflwor/GroupBy$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/GroupBy.class -basex-core/target/classes/org/basex/query/expr/gflwor/GroupSpec.class -basex-core/target/classes/org/basex/query/expr/gflwor/Let$LetEval.class -basex-core/target/classes/org/basex/query/expr/gflwor/Let.class -basex-core/target/classes/org/basex/query/expr/gflwor/OrderBy$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/OrderBy.class -basex-core/target/classes/org/basex/query/expr/gflwor/OrderKey.class -basex-core/target/classes/org/basex/query/expr/gflwor/Where$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/Where.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window$1.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window$2.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window$3.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window$TumblingEval.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window$WindowEval.class -basex-core/target/classes/org/basex/query/expr/gflwor/Window.class -basex-core/target/classes/org/basex/query/expr/index/IndexAccess.class -basex-core/target/classes/org/basex/query/expr/index/IndexDb.class -basex-core/target/classes/org/basex/query/expr/index/IndexDynDb.class -basex-core/target/classes/org/basex/query/expr/index/IndexStaticDb.class -basex-core/target/classes/org/basex/query/expr/index/RangeAccess$1.class -basex-core/target/classes/org/basex/query/expr/index/RangeAccess.class -basex-core/target/classes/org/basex/query/expr/index/StringRangeAccess$1.class -basex-core/target/classes/org/basex/query/expr/index/StringRangeAccess$2.class -basex-core/target/classes/org/basex/query/expr/index/StringRangeAccess.class -basex-core/target/classes/org/basex/query/expr/index/ValueAccess$1.class -basex-core/target/classes/org/basex/query/expr/index/ValueAccess$2.class -basex-core/target/classes/org/basex/query/expr/index/ValueAccess$3.class -basex-core/target/classes/org/basex/query/expr/index/ValueAccess.class -basex-core/target/classes/org/basex/query/expr/path/Axis$1.class -basex-core/target/classes/org/basex/query/expr/path/Axis$10.class -basex-core/target/classes/org/basex/query/expr/path/Axis$11.class -basex-core/target/classes/org/basex/query/expr/path/Axis$12.class -basex-core/target/classes/org/basex/query/expr/path/Axis$13.class -basex-core/target/classes/org/basex/query/expr/path/Axis$2.class -basex-core/target/classes/org/basex/query/expr/path/Axis$3.class -basex-core/target/classes/org/basex/query/expr/path/Axis$4.class -basex-core/target/classes/org/basex/query/expr/path/Axis$5.class -basex-core/target/classes/org/basex/query/expr/path/Axis$6.class -basex-core/target/classes/org/basex/query/expr/path/Axis$7.class -basex-core/target/classes/org/basex/query/expr/path/Axis$8.class -basex-core/target/classes/org/basex/query/expr/path/Axis$9.class -basex-core/target/classes/org/basex/query/expr/path/Axis.class -basex-core/target/classes/org/basex/query/expr/path/AxisPath$1.class -basex-core/target/classes/org/basex/query/expr/path/AxisPath.class -basex-core/target/classes/org/basex/query/expr/path/CachedPath.class -basex-core/target/classes/org/basex/query/expr/path/CachedStep.class -basex-core/target/classes/org/basex/query/expr/path/DocTest.class -basex-core/target/classes/org/basex/query/expr/path/InvDocTest.class -basex-core/target/classes/org/basex/query/expr/path/IterLastStep$1.class -basex-core/target/classes/org/basex/query/expr/path/IterLastStep.class -basex-core/target/classes/org/basex/query/expr/path/IterPath$1.class -basex-core/target/classes/org/basex/query/expr/path/IterPath.class -basex-core/target/classes/org/basex/query/expr/path/IterPosStep$1.class -basex-core/target/classes/org/basex/query/expr/path/IterPosStep.class -basex-core/target/classes/org/basex/query/expr/path/IterStep$1.class -basex-core/target/classes/org/basex/query/expr/path/IterStep.class -basex-core/target/classes/org/basex/query/expr/path/KindTest$1.class -basex-core/target/classes/org/basex/query/expr/path/KindTest$2.class -basex-core/target/classes/org/basex/query/expr/path/KindTest.class -basex-core/target/classes/org/basex/query/expr/path/MixedPath.class -basex-core/target/classes/org/basex/query/expr/path/NameTest$1.class -basex-core/target/classes/org/basex/query/expr/path/NameTest.class -basex-core/target/classes/org/basex/query/expr/path/NodeTest.class -basex-core/target/classes/org/basex/query/expr/path/Path$1.class -basex-core/target/classes/org/basex/query/expr/path/Path.class -basex-core/target/classes/org/basex/query/expr/path/PathCache$State.class -basex-core/target/classes/org/basex/query/expr/path/PathCache.class -basex-core/target/classes/org/basex/query/expr/path/Step.class -basex-core/target/classes/org/basex/query/expr/path/Test$Kind.class -basex-core/target/classes/org/basex/query/expr/path/Test.class -basex-core/target/classes/org/basex/query/func/Closure.class -basex-core/target/classes/org/basex/query/func/DynFuncCall.class -basex-core/target/classes/org/basex/query/func/FuncCall.class -basex-core/target/classes/org/basex/query/func/FuncLit.class -basex-core/target/classes/org/basex/query/func/FuncOptions.class -basex-core/target/classes/org/basex/query/func/Function.class -basex-core/target/classes/org/basex/query/func/Functions.class -basex-core/target/classes/org/basex/query/func/JavaFunc.class -basex-core/target/classes/org/basex/query/func/JavaFunction.class -basex-core/target/classes/org/basex/query/func/JavaMapping.class -basex-core/target/classes/org/basex/query/func/JavaModuleFunc.class -basex-core/target/classes/org/basex/query/func/PartFunc.class -basex-core/target/classes/org/basex/query/func/StandardFunc.class -basex-core/target/classes/org/basex/query/func/StaticFunc$1.class -basex-core/target/classes/org/basex/query/func/StaticFunc.class -basex-core/target/classes/org/basex/query/func/StaticFuncCall.class -basex-core/target/classes/org/basex/query/func/StaticFuncs$FuncCache.class -basex-core/target/classes/org/basex/query/func/StaticFuncs.class -basex-core/target/classes/org/basex/query/func/TypedFunc.class -basex-core/target/classes/org/basex/query/func/XQFunction.class -basex-core/target/classes/org/basex/query/func/XQFunctionExpr.class -basex-core/target/classes/org/basex/query/func/admin/AdminDeleteLogs.class -basex-core/target/classes/org/basex/query/func/admin/AdminFn.class -basex-core/target/classes/org/basex/query/func/admin/AdminLogs.class -basex-core/target/classes/org/basex/query/func/admin/AdminSessions.class -basex-core/target/classes/org/basex/query/func/admin/AdminWriteLog.class -basex-core/target/classes/org/basex/query/func/archive/ArchOptions.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveCreate.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveCreateFrom.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveDelete.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveEntries.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveExtractBinary.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveExtractText.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveExtractTo.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveFn.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveIn.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveOptions.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveOut.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveText.class -basex-core/target/classes/org/basex/query/func/archive/ArchiveUpdate.class -basex-core/target/classes/org/basex/query/func/archive/GZIPIn.class -basex-core/target/classes/org/basex/query/func/archive/GZIPOut.class -basex-core/target/classes/org/basex/query/func/archive/ZIPIn.class -basex-core/target/classes/org/basex/query/func/archive/ZIPOut.class -basex-core/target/classes/org/basex/query/func/array/ArrayAppend.class -basex-core/target/classes/org/basex/query/func/array/ArrayFilter.class -basex-core/target/classes/org/basex/query/func/array/ArrayFlatten$1$1.class -basex-core/target/classes/org/basex/query/func/array/ArrayFlatten$1.class -basex-core/target/classes/org/basex/query/func/array/ArrayFlatten.class -basex-core/target/classes/org/basex/query/func/array/ArrayFn.class -basex-core/target/classes/org/basex/query/func/array/ArrayFoldLeft.class -basex-core/target/classes/org/basex/query/func/array/ArrayFoldRight.class -basex-core/target/classes/org/basex/query/func/array/ArrayForEach.class -basex-core/target/classes/org/basex/query/func/array/ArrayForEachPair.class -basex-core/target/classes/org/basex/query/func/array/ArrayGet.class -basex-core/target/classes/org/basex/query/func/array/ArrayHead.class -basex-core/target/classes/org/basex/query/func/array/ArrayInsertBefore.class -basex-core/target/classes/org/basex/query/func/array/ArrayJoin.class -basex-core/target/classes/org/basex/query/func/array/ArrayPut.class -basex-core/target/classes/org/basex/query/func/array/ArrayRemove.class -basex-core/target/classes/org/basex/query/func/array/ArrayReverse.class -basex-core/target/classes/org/basex/query/func/array/ArraySize.class -basex-core/target/classes/org/basex/query/func/array/ArraySort.class -basex-core/target/classes/org/basex/query/func/array/ArraySubarray.class -basex-core/target/classes/org/basex/query/func/array/ArrayTail.class -basex-core/target/classes/org/basex/query/func/bin/BinAnd.class -basex-core/target/classes/org/basex/query/func/bin/BinBin.class -basex-core/target/classes/org/basex/query/func/bin/BinDecodeString.class -basex-core/target/classes/org/basex/query/func/bin/BinEncodeString.class -basex-core/target/classes/org/basex/query/func/bin/BinFind.class -basex-core/target/classes/org/basex/query/func/bin/BinFn.class -basex-core/target/classes/org/basex/query/func/bin/BinFromOctets.class -basex-core/target/classes/org/basex/query/func/bin/BinHex.class -basex-core/target/classes/org/basex/query/func/bin/BinInsertBefore.class -basex-core/target/classes/org/basex/query/func/bin/BinJoin.class -basex-core/target/classes/org/basex/query/func/bin/BinLength.class -basex-core/target/classes/org/basex/query/func/bin/BinNot.class -basex-core/target/classes/org/basex/query/func/bin/BinOctal.class -basex-core/target/classes/org/basex/query/func/bin/BinOr.class -basex-core/target/classes/org/basex/query/func/bin/BinPackDouble.class -basex-core/target/classes/org/basex/query/func/bin/BinPackFloat.class -basex-core/target/classes/org/basex/query/func/bin/BinPackInteger.class -basex-core/target/classes/org/basex/query/func/bin/BinPadLeft.class -basex-core/target/classes/org/basex/query/func/bin/BinPadRight.class -basex-core/target/classes/org/basex/query/func/bin/BinPart.class -basex-core/target/classes/org/basex/query/func/bin/BinShift.class -basex-core/target/classes/org/basex/query/func/bin/BinToOctets$1.class -basex-core/target/classes/org/basex/query/func/bin/BinToOctets.class -basex-core/target/classes/org/basex/query/func/bin/BinUnpackDouble.class -basex-core/target/classes/org/basex/query/func/bin/BinUnpackFloat.class -basex-core/target/classes/org/basex/query/func/bin/BinUnpackInteger.class -basex-core/target/classes/org/basex/query/func/bin/BinUnpackUnsignedInteger.class -basex-core/target/classes/org/basex/query/func/bin/BinXor.class -basex-core/target/classes/org/basex/query/func/bin/Bit$1.class -basex-core/target/classes/org/basex/query/func/bin/Bit$2.class -basex-core/target/classes/org/basex/query/func/bin/Bit$3.class -basex-core/target/classes/org/basex/query/func/bin/Bit.class -basex-core/target/classes/org/basex/query/func/client/ClientClose.class -basex-core/target/classes/org/basex/query/func/client/ClientConnect.class -basex-core/target/classes/org/basex/query/func/client/ClientExecute.class -basex-core/target/classes/org/basex/query/func/client/ClientFn.class -basex-core/target/classes/org/basex/query/func/client/ClientInfo.class -basex-core/target/classes/org/basex/query/func/client/ClientQuery.class -basex-core/target/classes/org/basex/query/func/client/ClientSessions.class -basex-core/target/classes/org/basex/query/func/convert/ConvertBinaryToBytes.class -basex-core/target/classes/org/basex/query/func/convert/ConvertBinaryToIntegers$1.class -basex-core/target/classes/org/basex/query/func/convert/ConvertBinaryToIntegers.class -basex-core/target/classes/org/basex/query/func/convert/ConvertBinaryToString.class -basex-core/target/classes/org/basex/query/func/convert/ConvertDateTimeToInteger.class -basex-core/target/classes/org/basex/query/func/convert/ConvertDayTimeToInteger.class -basex-core/target/classes/org/basex/query/func/convert/ConvertFn.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegerFromBase.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegerToBase.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegerToDateTime.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegerToDayTime.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegersToBase64.class -basex-core/target/classes/org/basex/query/func/convert/ConvertIntegersToHex.class -basex-core/target/classes/org/basex/query/func/convert/ConvertStringToBase64.class -basex-core/target/classes/org/basex/query/func/convert/ConvertStringToHex.class -basex-core/target/classes/org/basex/query/func/crypto/CryptoDecrypt.class -basex-core/target/classes/org/basex/query/func/crypto/CryptoEncrypt.class -basex-core/target/classes/org/basex/query/func/crypto/CryptoGenerateSignature.class -basex-core/target/classes/org/basex/query/func/crypto/CryptoHmac.class -basex-core/target/classes/org/basex/query/func/crypto/CryptoValidateSignature.class -basex-core/target/classes/org/basex/query/func/crypto/DigitalSignature.class -basex-core/target/classes/org/basex/query/func/crypto/Encryption.class -basex-core/target/classes/org/basex/query/func/crypto/MyKeySelector$MyKeySelectorResult.class -basex-core/target/classes/org/basex/query/func/crypto/MyKeySelector.class -basex-core/target/classes/org/basex/query/func/csv/CsvParse.class -basex-core/target/classes/org/basex/query/func/csv/CsvSerialize.class -basex-core/target/classes/org/basex/query/func/db/DbAccess$1.class -basex-core/target/classes/org/basex/query/func/db/DbAccess.class -basex-core/target/classes/org/basex/query/func/db/DbAdd.class -basex-core/target/classes/org/basex/query/func/db/DbAlter.class -basex-core/target/classes/org/basex/query/func/db/DbAttribute.class -basex-core/target/classes/org/basex/query/func/db/DbAttributeRange.class -basex-core/target/classes/org/basex/query/func/db/DbBackups$1.class -basex-core/target/classes/org/basex/query/func/db/DbBackups.class -basex-core/target/classes/org/basex/query/func/db/DbContentType.class -basex-core/target/classes/org/basex/query/func/db/DbCopy.class -basex-core/target/classes/org/basex/query/func/db/DbCreate.class -basex-core/target/classes/org/basex/query/func/db/DbCreateBackup.class -basex-core/target/classes/org/basex/query/func/db/DbDelete.class -basex-core/target/classes/org/basex/query/func/db/DbDrop.class -basex-core/target/classes/org/basex/query/func/db/DbDropBackup.class -basex-core/target/classes/org/basex/query/func/db/DbExists.class -basex-core/target/classes/org/basex/query/func/db/DbExport.class -basex-core/target/classes/org/basex/query/func/db/DbFlush.class -basex-core/target/classes/org/basex/query/func/db/DbFn.class -basex-core/target/classes/org/basex/query/func/db/DbInfo.class -basex-core/target/classes/org/basex/query/func/db/DbIsRaw.class -basex-core/target/classes/org/basex/query/func/db/DbIsXml.class -basex-core/target/classes/org/basex/query/func/db/DbList$1.class -basex-core/target/classes/org/basex/query/func/db/DbList.class -basex-core/target/classes/org/basex/query/func/db/DbListDetails$1.class -basex-core/target/classes/org/basex/query/func/db/DbListDetails$2.class -basex-core/target/classes/org/basex/query/func/db/DbListDetails.class -basex-core/target/classes/org/basex/query/func/db/DbName.class -basex-core/target/classes/org/basex/query/func/db/DbNew.class -basex-core/target/classes/org/basex/query/func/db/DbNodeId$1.class -basex-core/target/classes/org/basex/query/func/db/DbNodeId.class -basex-core/target/classes/org/basex/query/func/db/DbNodePre$1.class -basex-core/target/classes/org/basex/query/func/db/DbNodePre.class -basex-core/target/classes/org/basex/query/func/db/DbOpen.class -basex-core/target/classes/org/basex/query/func/db/DbOpenId.class -basex-core/target/classes/org/basex/query/func/db/DbOpenPre.class -basex-core/target/classes/org/basex/query/func/db/DbOptimize.class -basex-core/target/classes/org/basex/query/func/db/DbOption.class -basex-core/target/classes/org/basex/query/func/db/DbOutput.class -basex-core/target/classes/org/basex/query/func/db/DbOutputCache.class -basex-core/target/classes/org/basex/query/func/db/DbPath.class -basex-core/target/classes/org/basex/query/func/db/DbProperty.class -basex-core/target/classes/org/basex/query/func/db/DbRename.class -basex-core/target/classes/org/basex/query/func/db/DbReplace.class -basex-core/target/classes/org/basex/query/func/db/DbRestore.class -basex-core/target/classes/org/basex/query/func/db/DbRetrieve.class -basex-core/target/classes/org/basex/query/func/db/DbStore.class -basex-core/target/classes/org/basex/query/func/db/DbSystem.class -basex-core/target/classes/org/basex/query/func/db/DbText.class -basex-core/target/classes/org/basex/query/func/db/DbTextRange.class -basex-core/target/classes/org/basex/query/func/db/DbToken.class -basex-core/target/classes/org/basex/query/func/fetch/FetchBinary.class -basex-core/target/classes/org/basex/query/func/fetch/FetchContentType.class -basex-core/target/classes/org/basex/query/func/fetch/FetchText.class -basex-core/target/classes/org/basex/query/func/fetch/FetchXml.class -basex-core/target/classes/org/basex/query/func/fetch/FetchXmlBinary.class -basex-core/target/classes/org/basex/query/func/file/FileAppend.class -basex-core/target/classes/org/basex/query/func/file/FileAppendBinary.class -basex-core/target/classes/org/basex/query/func/file/FileAppendText.class -basex-core/target/classes/org/basex/query/func/file/FileAppendTextLines.class -basex-core/target/classes/org/basex/query/func/file/FileBaseDir.class -basex-core/target/classes/org/basex/query/func/file/FileChildren.class -basex-core/target/classes/org/basex/query/func/file/FileCopy.class -basex-core/target/classes/org/basex/query/func/file/FileCreateDir.class -basex-core/target/classes/org/basex/query/func/file/FileCreateTempDir.class -basex-core/target/classes/org/basex/query/func/file/FileCreateTempFile.class -basex-core/target/classes/org/basex/query/func/file/FileCurrentDir.class -basex-core/target/classes/org/basex/query/func/file/FileDelete.class -basex-core/target/classes/org/basex/query/func/file/FileDirSeparator.class -basex-core/target/classes/org/basex/query/func/file/FileExists.class -basex-core/target/classes/org/basex/query/func/file/FileFn.class -basex-core/target/classes/org/basex/query/func/file/FileIsAbsolute.class -basex-core/target/classes/org/basex/query/func/file/FileIsDir.class -basex-core/target/classes/org/basex/query/func/file/FileIsFile.class -basex-core/target/classes/org/basex/query/func/file/FileLastModified.class -basex-core/target/classes/org/basex/query/func/file/FileLineSeparator.class -basex-core/target/classes/org/basex/query/func/file/FileList.class -basex-core/target/classes/org/basex/query/func/file/FileMove.class -basex-core/target/classes/org/basex/query/func/file/FileName.class -basex-core/target/classes/org/basex/query/func/file/FileParent.class -basex-core/target/classes/org/basex/query/func/file/FilePathSeparator.class -basex-core/target/classes/org/basex/query/func/file/FilePathToNative.class -basex-core/target/classes/org/basex/query/func/file/FilePathToUri.class -basex-core/target/classes/org/basex/query/func/file/FileRead.class -basex-core/target/classes/org/basex/query/func/file/FileReadBinary.class -basex-core/target/classes/org/basex/query/func/file/FileReadText.class -basex-core/target/classes/org/basex/query/func/file/FileReadTextLines.class -basex-core/target/classes/org/basex/query/func/file/FileResolvePath.class -basex-core/target/classes/org/basex/query/func/file/FileSize.class -basex-core/target/classes/org/basex/query/func/file/FileTempDir.class -basex-core/target/classes/org/basex/query/func/file/FileWrite.class -basex-core/target/classes/org/basex/query/func/file/FileWriteBinary.class -basex-core/target/classes/org/basex/query/func/file/FileWriteText.class -basex-core/target/classes/org/basex/query/func/file/FileWriteTextLines.class -basex-core/target/classes/org/basex/query/func/fn/ContextFn.class -basex-core/target/classes/org/basex/query/func/fn/DateTime.class -basex-core/target/classes/org/basex/query/func/fn/DeepEqual$Mode.class -basex-core/target/classes/org/basex/query/func/fn/DeepEqual.class -basex-core/target/classes/org/basex/query/func/fn/Docs.class -basex-core/target/classes/org/basex/query/func/fn/FnAbs.class -basex-core/target/classes/org/basex/query/func/fn/FnAdjustDateToTimezone.class -basex-core/target/classes/org/basex/query/func/fn/FnAdjustTimeToTimezone.class -basex-core/target/classes/org/basex/query/func/fn/FnAdustDateTimeToTimezone.class -basex-core/target/classes/org/basex/query/func/fn/FnAnalyzeString.class -basex-core/target/classes/org/basex/query/func/fn/FnApply.class -basex-core/target/classes/org/basex/query/func/fn/FnAvailableEnvironmentVariables.class -basex-core/target/classes/org/basex/query/func/fn/FnAvg.class -basex-core/target/classes/org/basex/query/func/fn/FnBaseUri.class -basex-core/target/classes/org/basex/query/func/fn/FnBoolean.class -basex-core/target/classes/org/basex/query/func/fn/FnCeiling.class -basex-core/target/classes/org/basex/query/func/fn/FnCodepointEqual.class -basex-core/target/classes/org/basex/query/func/fn/FnCodepointsToString.class -basex-core/target/classes/org/basex/query/func/fn/FnCollection.class -basex-core/target/classes/org/basex/query/func/fn/FnCompare.class -basex-core/target/classes/org/basex/query/func/fn/FnConcat.class -basex-core/target/classes/org/basex/query/func/fn/FnContains.class -basex-core/target/classes/org/basex/query/func/fn/FnContainsToken.class -basex-core/target/classes/org/basex/query/func/fn/FnCount.class -basex-core/target/classes/org/basex/query/func/fn/FnCurrentDate.class -basex-core/target/classes/org/basex/query/func/fn/FnCurrentDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnCurrentTime.class -basex-core/target/classes/org/basex/query/func/fn/FnData.class -basex-core/target/classes/org/basex/query/func/fn/FnDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnDayFromDate.class -basex-core/target/classes/org/basex/query/func/fn/FnDayFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnDayFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnDeepEqual.class -basex-core/target/classes/org/basex/query/func/fn/FnDefaultCollation.class -basex-core/target/classes/org/basex/query/func/fn/FnDefaultLanguage.class -basex-core/target/classes/org/basex/query/func/fn/FnDistinctValues$1.class -basex-core/target/classes/org/basex/query/func/fn/FnDistinctValues.class -basex-core/target/classes/org/basex/query/func/fn/FnDoc.class -basex-core/target/classes/org/basex/query/func/fn/FnDocAvailable.class -basex-core/target/classes/org/basex/query/func/fn/FnDocumentUri.class -basex-core/target/classes/org/basex/query/func/fn/FnElementWithId.class -basex-core/target/classes/org/basex/query/func/fn/FnEmpty.class -basex-core/target/classes/org/basex/query/func/fn/FnEncodeForUri.class -basex-core/target/classes/org/basex/query/func/fn/FnEndsWith.class -basex-core/target/classes/org/basex/query/func/fn/FnEnvironmentVariable.class -basex-core/target/classes/org/basex/query/func/fn/FnError$1.class -basex-core/target/classes/org/basex/query/func/fn/FnError.class -basex-core/target/classes/org/basex/query/func/fn/FnEscapeHtmlUri.class -basex-core/target/classes/org/basex/query/func/fn/FnExactlyOne.class -basex-core/target/classes/org/basex/query/func/fn/FnExists.class -basex-core/target/classes/org/basex/query/func/fn/FnFalse.class -basex-core/target/classes/org/basex/query/func/fn/FnFilter$1.class -basex-core/target/classes/org/basex/query/func/fn/FnFilter.class -basex-core/target/classes/org/basex/query/func/fn/FnFloor.class -basex-core/target/classes/org/basex/query/func/fn/FnFoldLeft.class -basex-core/target/classes/org/basex/query/func/fn/FnFoldRight.class -basex-core/target/classes/org/basex/query/func/fn/FnForEach$1.class -basex-core/target/classes/org/basex/query/func/fn/FnForEach.class -basex-core/target/classes/org/basex/query/func/fn/FnForEachPair$1.class -basex-core/target/classes/org/basex/query/func/fn/FnForEachPair.class -basex-core/target/classes/org/basex/query/func/fn/FnFormatDate.class -basex-core/target/classes/org/basex/query/func/fn/FnFormatDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnFormatInteger.class -basex-core/target/classes/org/basex/query/func/fn/FnFormatNumber.class -basex-core/target/classes/org/basex/query/func/fn/FnFormatTime.class -basex-core/target/classes/org/basex/query/func/fn/FnFunctionArity.class -basex-core/target/classes/org/basex/query/func/fn/FnFunctionLookup.class -basex-core/target/classes/org/basex/query/func/fn/FnFunctionName.class -basex-core/target/classes/org/basex/query/func/fn/FnGenerateId.class -basex-core/target/classes/org/basex/query/func/fn/FnHasChildren.class -basex-core/target/classes/org/basex/query/func/fn/FnHead.class -basex-core/target/classes/org/basex/query/func/fn/FnHoursFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnHoursFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnHoursFromTime.class -basex-core/target/classes/org/basex/query/func/fn/FnId.class -basex-core/target/classes/org/basex/query/func/fn/FnIdref.class -basex-core/target/classes/org/basex/query/func/fn/FnImplicitTimezone.class -basex-core/target/classes/org/basex/query/func/fn/FnInScopePrefixes.class -basex-core/target/classes/org/basex/query/func/fn/FnIndexOf$1.class -basex-core/target/classes/org/basex/query/func/fn/FnIndexOf.class -basex-core/target/classes/org/basex/query/func/fn/FnInnermost.class -basex-core/target/classes/org/basex/query/func/fn/FnInsertBefore$1.class -basex-core/target/classes/org/basex/query/func/fn/FnInsertBefore.class -basex-core/target/classes/org/basex/query/func/fn/FnIriToUri.class -basex-core/target/classes/org/basex/query/func/fn/FnJsonDoc.class -basex-core/target/classes/org/basex/query/func/fn/FnJsonToXml.class -basex-core/target/classes/org/basex/query/func/fn/FnLang.class -basex-core/target/classes/org/basex/query/func/fn/FnLast.class -basex-core/target/classes/org/basex/query/func/fn/FnLocalName.class -basex-core/target/classes/org/basex/query/func/fn/FnLocalNameFromQName.class -basex-core/target/classes/org/basex/query/func/fn/FnLowerCase.class -basex-core/target/classes/org/basex/query/func/fn/FnMatches.class -basex-core/target/classes/org/basex/query/func/fn/FnMax.class -basex-core/target/classes/org/basex/query/func/fn/FnMin.class -basex-core/target/classes/org/basex/query/func/fn/FnMinutesFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnMinutesFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnMinutesFromTime.class -basex-core/target/classes/org/basex/query/func/fn/FnMonthFromDate.class -basex-core/target/classes/org/basex/query/func/fn/FnMonthFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnMonthsFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnName.class -basex-core/target/classes/org/basex/query/func/fn/FnNamespaceUri.class -basex-core/target/classes/org/basex/query/func/fn/FnNamespaceUriForPrefix.class -basex-core/target/classes/org/basex/query/func/fn/FnNamespaceUriFromQName.class -basex-core/target/classes/org/basex/query/func/fn/FnNilled.class -basex-core/target/classes/org/basex/query/func/fn/FnNodeName.class -basex-core/target/classes/org/basex/query/func/fn/FnNormalizeSpace.class -basex-core/target/classes/org/basex/query/func/fn/FnNormalizeUnicode.class -basex-core/target/classes/org/basex/query/func/fn/FnNot.class -basex-core/target/classes/org/basex/query/func/fn/FnNumber.class -basex-core/target/classes/org/basex/query/func/fn/FnOneOrMore$1.class -basex-core/target/classes/org/basex/query/func/fn/FnOneOrMore.class -basex-core/target/classes/org/basex/query/func/fn/FnOutermost.class -basex-core/target/classes/org/basex/query/func/fn/FnParseIetfDate$1.class -basex-core/target/classes/org/basex/query/func/fn/FnParseIetfDate$DateParser.class -basex-core/target/classes/org/basex/query/func/fn/FnParseIetfDate.class -basex-core/target/classes/org/basex/query/func/fn/FnParseJson.class -basex-core/target/classes/org/basex/query/func/fn/FnParseXml.class -basex-core/target/classes/org/basex/query/func/fn/FnParseXmlFragment.class -basex-core/target/classes/org/basex/query/func/fn/FnPath.class -basex-core/target/classes/org/basex/query/func/fn/FnPosition.class -basex-core/target/classes/org/basex/query/func/fn/FnPrefixFromQName.class -basex-core/target/classes/org/basex/query/func/fn/FnPut.class -basex-core/target/classes/org/basex/query/func/fn/FnQName.class -basex-core/target/classes/org/basex/query/func/fn/FnRandomNumberGenerator.class -basex-core/target/classes/org/basex/query/func/fn/FnRemove$1.class -basex-core/target/classes/org/basex/query/func/fn/FnRemove.class -basex-core/target/classes/org/basex/query/func/fn/FnReplace.class -basex-core/target/classes/org/basex/query/func/fn/FnResolveQName.class -basex-core/target/classes/org/basex/query/func/fn/FnResolveUri.class -basex-core/target/classes/org/basex/query/func/fn/FnReverse$1.class -basex-core/target/classes/org/basex/query/func/fn/FnReverse.class -basex-core/target/classes/org/basex/query/func/fn/FnRoot.class -basex-core/target/classes/org/basex/query/func/fn/FnRound.class -basex-core/target/classes/org/basex/query/func/fn/FnRoundHalfToEven.class -basex-core/target/classes/org/basex/query/func/fn/FnSecondsFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnSecondsFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnSecondsFromTime.class -basex-core/target/classes/org/basex/query/func/fn/FnSerialize.class -basex-core/target/classes/org/basex/query/func/fn/FnSort$1.class -basex-core/target/classes/org/basex/query/func/fn/FnSort.class -basex-core/target/classes/org/basex/query/func/fn/FnStartsWith.class -basex-core/target/classes/org/basex/query/func/fn/FnStaticBaseUri.class -basex-core/target/classes/org/basex/query/func/fn/FnString.class -basex-core/target/classes/org/basex/query/func/fn/FnStringJoin.class -basex-core/target/classes/org/basex/query/func/fn/FnStringLength.class -basex-core/target/classes/org/basex/query/func/fn/FnStringToCodepoints$1.class -basex-core/target/classes/org/basex/query/func/fn/FnStringToCodepoints.class -basex-core/target/classes/org/basex/query/func/fn/FnSubsequence$1.class -basex-core/target/classes/org/basex/query/func/fn/FnSubsequence$2.class -basex-core/target/classes/org/basex/query/func/fn/FnSubsequence.class -basex-core/target/classes/org/basex/query/func/fn/FnSubstring.class -basex-core/target/classes/org/basex/query/func/fn/FnSubstringAfter.class -basex-core/target/classes/org/basex/query/func/fn/FnSubstringBefore.class -basex-core/target/classes/org/basex/query/func/fn/FnSum.class -basex-core/target/classes/org/basex/query/func/fn/FnTail$1.class -basex-core/target/classes/org/basex/query/func/fn/FnTail$2.class -basex-core/target/classes/org/basex/query/func/fn/FnTail.class -basex-core/target/classes/org/basex/query/func/fn/FnTimezoneFromDate.class -basex-core/target/classes/org/basex/query/func/fn/FnTimezoneFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnTimezoneFromTime.class -basex-core/target/classes/org/basex/query/func/fn/FnTokenize.class -basex-core/target/classes/org/basex/query/func/fn/FnTrace.class -basex-core/target/classes/org/basex/query/func/fn/FnTranslate.class -basex-core/target/classes/org/basex/query/func/fn/FnTrue.class -basex-core/target/classes/org/basex/query/func/fn/FnUnordered.class -basex-core/target/classes/org/basex/query/func/fn/FnUnparsedText.class -basex-core/target/classes/org/basex/query/func/fn/FnUnparsedTextAvailable.class -basex-core/target/classes/org/basex/query/func/fn/FnUnparsedTextLines$1.class -basex-core/target/classes/org/basex/query/func/fn/FnUnparsedTextLines$LinesIter.class -basex-core/target/classes/org/basex/query/func/fn/FnUnparsedTextLines.class -basex-core/target/classes/org/basex/query/func/fn/FnUpperCase.class -basex-core/target/classes/org/basex/query/func/fn/FnUriCollection$1.class -basex-core/target/classes/org/basex/query/func/fn/FnUriCollection.class -basex-core/target/classes/org/basex/query/func/fn/FnXmlToJson.class -basex-core/target/classes/org/basex/query/func/fn/FnYearFromDate.class -basex-core/target/classes/org/basex/query/func/fn/FnYearFromDateTime.class -basex-core/target/classes/org/basex/query/func/fn/FnYearsFromDuration.class -basex-core/target/classes/org/basex/query/func/fn/FnZeroOrOne.class -basex-core/target/classes/org/basex/query/func/fn/Format.class -basex-core/target/classes/org/basex/query/func/fn/Ids.class -basex-core/target/classes/org/basex/query/func/fn/Parse.class -basex-core/target/classes/org/basex/query/func/fn/RegEx.class -basex-core/target/classes/org/basex/query/func/ft/FtAccess.class -basex-core/target/classes/org/basex/query/func/ft/FtContains.class -basex-core/target/classes/org/basex/query/func/ft/FtContainsOptions.class -basex-core/target/classes/org/basex/query/func/ft/FtCount.class -basex-core/target/classes/org/basex/query/func/ft/FtExtract.class -basex-core/target/classes/org/basex/query/func/ft/FtIndexOptions.class -basex-core/target/classes/org/basex/query/func/ft/FtMark$1.class -basex-core/target/classes/org/basex/query/func/ft/FtMark.class -basex-core/target/classes/org/basex/query/func/ft/FtNormalize.class -basex-core/target/classes/org/basex/query/func/ft/FtScore.class -basex-core/target/classes/org/basex/query/func/ft/FtSearch.class -basex-core/target/classes/org/basex/query/func/ft/FtTokenize.class -basex-core/target/classes/org/basex/query/func/ft/FtTokenizeOptions.class -basex-core/target/classes/org/basex/query/func/ft/FtTokens.class -basex-core/target/classes/org/basex/query/func/hash/HashFn.class -basex-core/target/classes/org/basex/query/func/hash/HashHash.class -basex-core/target/classes/org/basex/query/func/hash/HashMd5.class -basex-core/target/classes/org/basex/query/func/hash/HashSha1.class -basex-core/target/classes/org/basex/query/func/hash/HashSha256.class -basex-core/target/classes/org/basex/query/func/hof/HofConst.class -basex-core/target/classes/org/basex/query/func/hof/HofFn.class -basex-core/target/classes/org/basex/query/func/hof/HofFoldLeft1.class -basex-core/target/classes/org/basex/query/func/hof/HofId.class -basex-core/target/classes/org/basex/query/func/hof/HofScanLeft$1.class -basex-core/target/classes/org/basex/query/func/hof/HofScanLeft.class -basex-core/target/classes/org/basex/query/func/hof/HofSortWith.class -basex-core/target/classes/org/basex/query/func/hof/HofTakeWhile$1.class -basex-core/target/classes/org/basex/query/func/hof/HofTakeWhile.class -basex-core/target/classes/org/basex/query/func/hof/HofTopKBy.class -basex-core/target/classes/org/basex/query/func/hof/HofTopKWith.class -basex-core/target/classes/org/basex/query/func/hof/HofUntil.class -basex-core/target/classes/org/basex/query/func/html/HtmlParse.class -basex-core/target/classes/org/basex/query/func/html/HtmlParser.class -basex-core/target/classes/org/basex/query/func/http/HttpSendRequest.class -basex-core/target/classes/org/basex/query/func/index/IndexAttributeNames.class -basex-core/target/classes/org/basex/query/func/index/IndexAttributes.class -basex-core/target/classes/org/basex/query/func/index/IndexElementNames.class -basex-core/target/classes/org/basex/query/func/index/IndexFacets.class -basex-core/target/classes/org/basex/query/func/index/IndexFn$1.class -basex-core/target/classes/org/basex/query/func/index/IndexFn.class -basex-core/target/classes/org/basex/query/func/index/IndexTexts.class -basex-core/target/classes/org/basex/query/func/index/IndexTokens.class -basex-core/target/classes/org/basex/query/func/inspect/Inspect.class -basex-core/target/classes/org/basex/query/func/inspect/InspectContext.class -basex-core/target/classes/org/basex/query/func/inspect/InspectFunction.class -basex-core/target/classes/org/basex/query/func/inspect/InspectFunctionAnnotations.class -basex-core/target/classes/org/basex/query/func/inspect/InspectFunctions.class -basex-core/target/classes/org/basex/query/func/inspect/InspectModule.class -basex-core/target/classes/org/basex/query/func/inspect/InspectStaticContext.class -basex-core/target/classes/org/basex/query/func/inspect/InspectXqdoc.class -basex-core/target/classes/org/basex/query/func/inspect/PlainDoc.class -basex-core/target/classes/org/basex/query/func/inspect/XQDoc.class -basex-core/target/classes/org/basex/query/func/jobs/JobsCurrent.class -basex-core/target/classes/org/basex/query/func/jobs/JobsEval.class -basex-core/target/classes/org/basex/query/func/jobs/JobsFinished.class -basex-core/target/classes/org/basex/query/func/jobs/JobsInvoke.class -basex-core/target/classes/org/basex/query/func/jobs/JobsList.class -basex-core/target/classes/org/basex/query/func/jobs/JobsListDetails.class -basex-core/target/classes/org/basex/query/func/jobs/JobsResult.class -basex-core/target/classes/org/basex/query/func/jobs/JobsServices.class -basex-core/target/classes/org/basex/query/func/jobs/JobsStop$StopOptions.class -basex-core/target/classes/org/basex/query/func/jobs/JobsStop.class -basex-core/target/classes/org/basex/query/func/jobs/JobsWait.class -basex-core/target/classes/org/basex/query/func/json/JsonParse.class -basex-core/target/classes/org/basex/query/func/json/JsonSerialize.class -basex-core/target/classes/org/basex/query/func/lazy/LazyCache.class -basex-core/target/classes/org/basex/query/func/lazy/LazyIsCached.class -basex-core/target/classes/org/basex/query/func/lazy/LazyIsLazy.class -basex-core/target/classes/org/basex/query/func/map/MapContains.class -basex-core/target/classes/org/basex/query/func/map/MapEntry.class -basex-core/target/classes/org/basex/query/func/map/MapFind.class -basex-core/target/classes/org/basex/query/func/map/MapForEach.class -basex-core/target/classes/org/basex/query/func/map/MapGet.class -basex-core/target/classes/org/basex/query/func/map/MapKeys.class -basex-core/target/classes/org/basex/query/func/map/MapMerge$MergeOptions.class -basex-core/target/classes/org/basex/query/func/map/MapMerge.class -basex-core/target/classes/org/basex/query/func/map/MapPut.class -basex-core/target/classes/org/basex/query/func/map/MapRemove.class -basex-core/target/classes/org/basex/query/func/map/MapSize.class -basex-core/target/classes/org/basex/query/func/math/MathAcos.class -basex-core/target/classes/org/basex/query/func/math/MathAsin.class -basex-core/target/classes/org/basex/query/func/math/MathAtan.class -basex-core/target/classes/org/basex/query/func/math/MathAtan2.class -basex-core/target/classes/org/basex/query/func/math/MathCos.class -basex-core/target/classes/org/basex/query/func/math/MathCosh.class -basex-core/target/classes/org/basex/query/func/math/MathCrc32.class -basex-core/target/classes/org/basex/query/func/math/MathE.class -basex-core/target/classes/org/basex/query/func/math/MathExp.class -basex-core/target/classes/org/basex/query/func/math/MathExp10.class -basex-core/target/classes/org/basex/query/func/math/MathLog.class -basex-core/target/classes/org/basex/query/func/math/MathLog10.class -basex-core/target/classes/org/basex/query/func/math/MathPi.class -basex-core/target/classes/org/basex/query/func/math/MathPow.class -basex-core/target/classes/org/basex/query/func/math/MathSin.class -basex-core/target/classes/org/basex/query/func/math/MathSinh.class -basex-core/target/classes/org/basex/query/func/math/MathSqrt.class -basex-core/target/classes/org/basex/query/func/math/MathTan.class -basex-core/target/classes/org/basex/query/func/math/MathTanh.class -basex-core/target/classes/org/basex/query/func/out/OutCr.class -basex-core/target/classes/org/basex/query/func/out/OutFormat.class -basex-core/target/classes/org/basex/query/func/out/OutNl.class -basex-core/target/classes/org/basex/query/func/out/OutTab.class -basex-core/target/classes/org/basex/query/func/proc/ProcExecute.class -basex-core/target/classes/org/basex/query/func/proc/ProcFn.class -basex-core/target/classes/org/basex/query/func/proc/ProcFork.class -basex-core/target/classes/org/basex/query/func/proc/ProcOptions.class -basex-core/target/classes/org/basex/query/func/proc/ProcProperty.class -basex-core/target/classes/org/basex/query/func/proc/ProcPropertyNames.class -basex-core/target/classes/org/basex/query/func/proc/ProcResult.class -basex-core/target/classes/org/basex/query/func/proc/ProcSystem.class -basex-core/target/classes/org/basex/query/func/prof/ProfCurrentMs.class -basex-core/target/classes/org/basex/query/func/prof/ProfCurrentNs.class -basex-core/target/classes/org/basex/query/func/prof/ProfDump.class -basex-core/target/classes/org/basex/query/func/prof/ProfHuman.class -basex-core/target/classes/org/basex/query/func/prof/ProfMemory.class -basex-core/target/classes/org/basex/query/func/prof/ProfSleep.class -basex-core/target/classes/org/basex/query/func/prof/ProfTime.class -basex-core/target/classes/org/basex/query/func/prof/ProfTrack$TrackOptions.class -basex-core/target/classes/org/basex/query/func/prof/ProfTrack.class -basex-core/target/classes/org/basex/query/func/prof/ProfType.class -basex-core/target/classes/org/basex/query/func/prof/ProfVariables.class -basex-core/target/classes/org/basex/query/func/prof/ProfVoid.class -basex-core/target/classes/org/basex/query/func/random/RandomDouble.class -basex-core/target/classes/org/basex/query/func/random/RandomGaussian$1.class -basex-core/target/classes/org/basex/query/func/random/RandomGaussian.class -basex-core/target/classes/org/basex/query/func/random/RandomInteger.class -basex-core/target/classes/org/basex/query/func/random/RandomSeededDouble$1.class -basex-core/target/classes/org/basex/query/func/random/RandomSeededDouble.class -basex-core/target/classes/org/basex/query/func/random/RandomSeededInteger$1.class -basex-core/target/classes/org/basex/query/func/random/RandomSeededInteger.class -basex-core/target/classes/org/basex/query/func/random/RandomSeededPermutation.class -basex-core/target/classes/org/basex/query/func/random/RandomUuid.class -basex-core/target/classes/org/basex/query/func/repo/RepoDelete.class -basex-core/target/classes/org/basex/query/func/repo/RepoFn.class -basex-core/target/classes/org/basex/query/func/repo/RepoInstall.class -basex-core/target/classes/org/basex/query/func/repo/RepoList.class -basex-core/target/classes/org/basex/query/func/sql/JDBCConnections.class -basex-core/target/classes/org/basex/query/func/sql/SqlClose.class -basex-core/target/classes/org/basex/query/func/sql/SqlCommit.class -basex-core/target/classes/org/basex/query/func/sql/SqlConnect.class -basex-core/target/classes/org/basex/query/func/sql/SqlExecute$1.class -basex-core/target/classes/org/basex/query/func/sql/SqlExecute$StatementOptions.class -basex-core/target/classes/org/basex/query/func/sql/SqlExecute.class -basex-core/target/classes/org/basex/query/func/sql/SqlExecutePrepared.class -basex-core/target/classes/org/basex/query/func/sql/SqlFn.class -basex-core/target/classes/org/basex/query/func/sql/SqlInit.class -basex-core/target/classes/org/basex/query/func/sql/SqlPrepare.class -basex-core/target/classes/org/basex/query/func/sql/SqlRollback.class -basex-core/target/classes/org/basex/query/func/strings/StringsColognePhonetic.class -basex-core/target/classes/org/basex/query/func/strings/StringsLevenshtein.class -basex-core/target/classes/org/basex/query/func/strings/StringsSoundex.class -basex-core/target/classes/org/basex/query/func/unit/Constants.class -basex-core/target/classes/org/basex/query/func/unit/Suite.class -basex-core/target/classes/org/basex/query/func/unit/Unit.class -basex-core/target/classes/org/basex/query/func/unit/UnitAssert.class -basex-core/target/classes/org/basex/query/func/unit/UnitAssertEquals.class -basex-core/target/classes/org/basex/query/func/unit/UnitException.class -basex-core/target/classes/org/basex/query/func/unit/UnitFail.class -basex-core/target/classes/org/basex/query/func/unit/UnitFn.class -basex-core/target/classes/org/basex/query/func/update/UpdateApply.class -basex-core/target/classes/org/basex/query/func/update/UpdateCache.class -basex-core/target/classes/org/basex/query/func/update/UpdateForEach.class -basex-core/target/classes/org/basex/query/func/update/UpdateForEachPair.class -basex-core/target/classes/org/basex/query/func/update/UpdateMapForEach.class -basex-core/target/classes/org/basex/query/func/update/UpdateOutput.class -basex-core/target/classes/org/basex/query/func/user/UserAlter$1.class -basex-core/target/classes/org/basex/query/func/user/UserAlter$Alter.class -basex-core/target/classes/org/basex/query/func/user/UserAlter.class -basex-core/target/classes/org/basex/query/func/user/UserCheck.class -basex-core/target/classes/org/basex/query/func/user/UserCreate$1.class -basex-core/target/classes/org/basex/query/func/user/UserCreate$Create.class -basex-core/target/classes/org/basex/query/func/user/UserCreate.class -basex-core/target/classes/org/basex/query/func/user/UserCurrent.class -basex-core/target/classes/org/basex/query/func/user/UserDrop$1.class -basex-core/target/classes/org/basex/query/func/user/UserDrop$Drop.class -basex-core/target/classes/org/basex/query/func/user/UserDrop.class -basex-core/target/classes/org/basex/query/func/user/UserExists.class -basex-core/target/classes/org/basex/query/func/user/UserFn.class -basex-core/target/classes/org/basex/query/func/user/UserGrant$1.class -basex-core/target/classes/org/basex/query/func/user/UserGrant$Grant.class -basex-core/target/classes/org/basex/query/func/user/UserGrant.class -basex-core/target/classes/org/basex/query/func/user/UserInfo.class -basex-core/target/classes/org/basex/query/func/user/UserList.class -basex-core/target/classes/org/basex/query/func/user/UserListDetails.class -basex-core/target/classes/org/basex/query/func/user/UserPassword$1.class -basex-core/target/classes/org/basex/query/func/user/UserPassword$Password.class -basex-core/target/classes/org/basex/query/func/user/UserPassword.class -basex-core/target/classes/org/basex/query/func/user/UserUpdateInfo$1.class -basex-core/target/classes/org/basex/query/func/user/UserUpdateInfo$UpdateInfo.class -basex-core/target/classes/org/basex/query/func/user/UserUpdateInfo.class -basex-core/target/classes/org/basex/query/func/util/UtilDeepEqual.class -basex-core/target/classes/org/basex/query/func/util/UtilItemAt.class -basex-core/target/classes/org/basex/query/func/util/UtilItemRange.class -basex-core/target/classes/org/basex/query/func/util/UtilLastFrom.class -basex-core/target/classes/org/basex/query/func/util/UtilReplicate.class -basex-core/target/classes/org/basex/query/func/validate/ErrorInfo.class -basex-core/target/classes/org/basex/query/func/validate/ValidateDtd$1.class -basex-core/target/classes/org/basex/query/func/validate/ValidateDtd.class -basex-core/target/classes/org/basex/query/func/validate/ValidateDtdInfo.class -basex-core/target/classes/org/basex/query/func/validate/ValidateDtdReport.class -basex-core/target/classes/org/basex/query/func/validate/ValidateFn.class -basex-core/target/classes/org/basex/query/func/validate/ValidateRng$1.class -basex-core/target/classes/org/basex/query/func/validate/ValidateRng.class -basex-core/target/classes/org/basex/query/func/validate/ValidateRngInfo.class -basex-core/target/classes/org/basex/query/func/validate/ValidateRngReport.class -basex-core/target/classes/org/basex/query/func/validate/ValidateXsd$1.class -basex-core/target/classes/org/basex/query/func/validate/ValidateXsd.class -basex-core/target/classes/org/basex/query/func/validate/ValidateXsdInfo.class -basex-core/target/classes/org/basex/query/func/validate/ValidateXsdReport.class -basex-core/target/classes/org/basex/query/func/validate/Validation.class -basex-core/target/classes/org/basex/query/func/validate/ValidationHandler.class -basex-core/target/classes/org/basex/query/func/web/WebContentType.class -basex-core/target/classes/org/basex/query/func/web/WebCreateUrl.class -basex-core/target/classes/org/basex/query/func/web/WebDecodeUrl.class -basex-core/target/classes/org/basex/query/func/web/WebEncodeUrl.class -basex-core/target/classes/org/basex/query/func/web/WebFn.class -basex-core/target/classes/org/basex/query/func/web/WebRedirect.class -basex-core/target/classes/org/basex/query/func/web/WebResponseHeader$ResponseOptions.class -basex-core/target/classes/org/basex/query/func/web/WebResponseHeader.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryEval$1.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryEval$2.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryEval$XQueryOptions.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryEval.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryEvalUpdate.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryForkJoin.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryInvoke.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryInvokeUpdate.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryParse$XQueryOptions.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryParse.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryParseUri.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryTask.class -basex-core/target/classes/org/basex/query/func/xquery/XQueryUpdate.class -basex-core/target/classes/org/basex/query/func/xslt/XsltFn.class -basex-core/target/classes/org/basex/query/func/xslt/XsltInit.class -basex-core/target/classes/org/basex/query/func/xslt/XsltProcessor.class -basex-core/target/classes/org/basex/query/func/xslt/XsltTransform$XsltOptions.class -basex-core/target/classes/org/basex/query/func/xslt/XsltTransform.class -basex-core/target/classes/org/basex/query/func/xslt/XsltTransformText.class -basex-core/target/classes/org/basex/query/func/xslt/XsltVersion.class -basex-core/target/classes/org/basex/query/func/zip/ZipBinaryEntry.class -basex-core/target/classes/org/basex/query/func/zip/ZipEntries.class -basex-core/target/classes/org/basex/query/func/zip/ZipFn.class -basex-core/target/classes/org/basex/query/func/zip/ZipHtmlEntry.class -basex-core/target/classes/org/basex/query/func/zip/ZipTextEntry.class -basex-core/target/classes/org/basex/query/func/zip/ZipUpdateEntries.class -basex-core/target/classes/org/basex/query/func/zip/ZipXmlEntry.class -basex-core/target/classes/org/basex/query/func/zip/ZipZipFile.class -basex-core/target/classes/org/basex/query/iter/AtomIter.class -basex-core/target/classes/org/basex/query/iter/BasicIter$1.class -basex-core/target/classes/org/basex/query/iter/BasicIter.class -basex-core/target/classes/org/basex/query/iter/BasicNodeIter$1.class -basex-core/target/classes/org/basex/query/iter/BasicNodeIter$2.class -basex-core/target/classes/org/basex/query/iter/BasicNodeIter.class -basex-core/target/classes/org/basex/query/iter/DBNodeIter.class -basex-core/target/classes/org/basex/query/iter/FTIter.class -basex-core/target/classes/org/basex/query/iter/Iter.class -basex-core/target/classes/org/basex/query/iter/NodeIter.class -basex-core/target/classes/org/basex/query/scope/LibraryModule.class -basex-core/target/classes/org/basex/query/scope/MainModule$1.class -basex-core/target/classes/org/basex/query/scope/MainModule$LockVisitor.class -basex-core/target/classes/org/basex/query/scope/MainModule.class -basex-core/target/classes/org/basex/query/scope/Module.class -basex-core/target/classes/org/basex/query/scope/Scope.class -basex-core/target/classes/org/basex/query/scope/StaticDecl.class -basex-core/target/classes/org/basex/query/scope/StaticScope.class -basex-core/target/classes/org/basex/query/up/ContextModifier.class -basex-core/target/classes/org/basex/query/up/DataUpdates.class -basex-core/target/classes/org/basex/query/up/DatabaseModifier.class -basex-core/target/classes/org/basex/query/up/NamePool$1.class -basex-core/target/classes/org/basex/query/up/NamePool$NameCache.class -basex-core/target/classes/org/basex/query/up/NamePool.class -basex-core/target/classes/org/basex/query/up/NameUpdates.class -basex-core/target/classes/org/basex/query/up/NodeUpdateComparator.class -basex-core/target/classes/org/basex/query/up/NodeUpdates.class -basex-core/target/classes/org/basex/query/up/TransformModifier.class -basex-core/target/classes/org/basex/query/up/Updates.class -basex-core/target/classes/org/basex/query/up/UserUpdates.class -basex-core/target/classes/org/basex/query/up/atomic/AtomicUpdateCache.class -basex-core/target/classes/org/basex/query/up/atomic/BasicUpdate.class -basex-core/target/classes/org/basex/query/up/atomic/Delete.class -basex-core/target/classes/org/basex/query/up/atomic/Insert.class -basex-core/target/classes/org/basex/query/up/atomic/InsertAttr.class -basex-core/target/classes/org/basex/query/up/atomic/Rename.class -basex-core/target/classes/org/basex/query/up/atomic/Replace.class -basex-core/target/classes/org/basex/query/up/atomic/StructuralUpdate.class -basex-core/target/classes/org/basex/query/up/atomic/UpdateValue.class -basex-core/target/classes/org/basex/query/up/expr/Delete.class -basex-core/target/classes/org/basex/query/up/expr/Insert$1.class -basex-core/target/classes/org/basex/query/up/expr/Insert$Mode.class -basex-core/target/classes/org/basex/query/up/expr/Insert.class -basex-core/target/classes/org/basex/query/up/expr/Rename.class -basex-core/target/classes/org/basex/query/up/expr/Replace.class -basex-core/target/classes/org/basex/query/up/expr/Transform.class -basex-core/target/classes/org/basex/query/up/expr/TransformWith.class -basex-core/target/classes/org/basex/query/up/expr/Update.class -basex-core/target/classes/org/basex/query/up/primitives/DBNew.class -basex-core/target/classes/org/basex/query/up/primitives/DBOptions.class -basex-core/target/classes/org/basex/query/up/primitives/DataUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/NewInput.class -basex-core/target/classes/org/basex/query/up/primitives/Update.class -basex-core/target/classes/org/basex/query/up/primitives/UpdateType.class -basex-core/target/classes/org/basex/query/up/primitives/UserPermUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/UserUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBAdd.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBDelete.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBFlush.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBOptimize.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBRename.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBStore.class -basex-core/target/classes/org/basex/query/up/primitives/db/DBUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/db/Put.class -basex-core/target/classes/org/basex/query/up/primitives/name/BackupCreate.class -basex-core/target/classes/org/basex/query/up/primitives/name/BackupDrop.class -basex-core/target/classes/org/basex/query/up/primitives/name/DBAlter.class -basex-core/target/classes/org/basex/query/up/primitives/name/DBCopy.class -basex-core/target/classes/org/basex/query/up/primitives/name/DBCreate.class -basex-core/target/classes/org/basex/query/up/primitives/name/DBDrop.class -basex-core/target/classes/org/basex/query/up/primitives/name/DBRestore.class -basex-core/target/classes/org/basex/query/up/primitives/name/NameUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/node/DeleteNode.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertAfter.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertAttribute.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertBefore.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertInto.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertIntoAsFirst.class -basex-core/target/classes/org/basex/query/up/primitives/node/InsertIntoAsLast.class -basex-core/target/classes/org/basex/query/up/primitives/node/NodeCopy.class -basex-core/target/classes/org/basex/query/up/primitives/node/NodeUpdate.class -basex-core/target/classes/org/basex/query/up/primitives/node/RenameNode.class -basex-core/target/classes/org/basex/query/up/primitives/node/ReplaceContent.class -basex-core/target/classes/org/basex/query/up/primitives/node/ReplaceDoc.class -basex-core/target/classes/org/basex/query/up/primitives/node/ReplaceNode.class -basex-core/target/classes/org/basex/query/up/primitives/node/ReplaceValue.class -basex-core/target/classes/org/basex/query/util/ASTVisitor.class -basex-core/target/classes/org/basex/query/util/DataBuilder$1.class -basex-core/target/classes/org/basex/query/util/DataBuilder.class -basex-core/target/classes/org/basex/query/util/DataFTBuilder$1.class -basex-core/target/classes/org/basex/query/util/DataFTBuilder$DataFTMarker.class -basex-core/target/classes/org/basex/query/util/DataFTBuilder.class -basex-core/target/classes/org/basex/query/util/Flag.class -basex-core/target/classes/org/basex/query/util/IndexCosts.class -basex-core/target/classes/org/basex/query/util/IndexInfo.class -basex-core/target/classes/org/basex/query/util/NSContext.class -basex-core/target/classes/org/basex/query/util/NSGlobal.class -basex-core/target/classes/org/basex/query/util/UriParser$ParsedUri.class -basex-core/target/classes/org/basex/query/util/UriParser.class -basex-core/target/classes/org/basex/query/util/UriResolver.class -basex-core/target/classes/org/basex/query/util/collation/BaseXCollation.class -basex-core/target/classes/org/basex/query/util/collation/BaseXCollationOptions$Decomposition.class -basex-core/target/classes/org/basex/query/util/collation/BaseXCollationOptions$Strength.class -basex-core/target/classes/org/basex/query/util/collation/BaseXCollationOptions.class -basex-core/target/classes/org/basex/query/util/collation/Collation$Mode.class -basex-core/target/classes/org/basex/query/util/collation/Collation.class -basex-core/target/classes/org/basex/query/util/collation/CollationItemSet.class -basex-core/target/classes/org/basex/query/util/collation/CollationOptions$Locales.class -basex-core/target/classes/org/basex/query/util/collation/CollationOptions.class -basex-core/target/classes/org/basex/query/util/collation/NoCaseCollation.class -basex-core/target/classes/org/basex/query/util/collation/UCACollation.class -basex-core/target/classes/org/basex/query/util/collation/UCAOptions.class -basex-core/target/classes/org/basex/query/util/fingertree/DeepTree.class -basex-core/target/classes/org/basex/query/util/fingertree/EmptyTree.class -basex-core/target/classes/org/basex/query/util/fingertree/FingerTree.class -basex-core/target/classes/org/basex/query/util/fingertree/FingerTreeBuilder$BufferNode.class -basex-core/target/classes/org/basex/query/util/fingertree/FingerTreeBuilder$BufferNodeIterator.class -basex-core/target/classes/org/basex/query/util/fingertree/FingerTreeBuilder.class -basex-core/target/classes/org/basex/query/util/fingertree/FingerTreeIterator.class -basex-core/target/classes/org/basex/query/util/fingertree/InnerNode.class -basex-core/target/classes/org/basex/query/util/fingertree/Node.class -basex-core/target/classes/org/basex/query/util/fingertree/NodeLike.class -basex-core/target/classes/org/basex/query/util/fingertree/PartialInnerNode.class -basex-core/target/classes/org/basex/query/util/fingertree/SingletonTree.class -basex-core/target/classes/org/basex/query/util/fingertree/TreeSlice.class -basex-core/target/classes/org/basex/query/util/format/DateFormat.class -basex-core/target/classes/org/basex/query/util/format/DateParser.class -basex-core/target/classes/org/basex/query/util/format/DecFormatter$1.class -basex-core/target/classes/org/basex/query/util/format/DecFormatter$Picture.class -basex-core/target/classes/org/basex/query/util/format/DecFormatter.class -basex-core/target/classes/org/basex/query/util/format/FormatParser.class -basex-core/target/classes/org/basex/query/util/format/FormatUtil$Case.class -basex-core/target/classes/org/basex/query/util/format/FormatUtil.class -basex-core/target/classes/org/basex/query/util/format/Formatter.class -basex-core/target/classes/org/basex/query/util/format/FormatterDE.class -basex-core/target/classes/org/basex/query/util/format/FormatterEN.class -basex-core/target/classes/org/basex/query/util/format/IntFormat.class -basex-core/target/classes/org/basex/query/util/ft/FTMatch.class -basex-core/target/classes/org/basex/query/util/ft/FTMatches.class -basex-core/target/classes/org/basex/query/util/ft/FTPos.class -basex-core/target/classes/org/basex/query/util/ft/FTPosData.class -basex-core/target/classes/org/basex/query/util/ft/FTStringMatch.class -basex-core/target/classes/org/basex/query/util/hash/HashItemSet.class -basex-core/target/classes/org/basex/query/util/hash/ItemSet.class -basex-core/target/classes/org/basex/query/util/list/ANodeBuilder$1.class -basex-core/target/classes/org/basex/query/util/list/ANodeBuilder$State.class -basex-core/target/classes/org/basex/query/util/list/ANodeBuilder.class -basex-core/target/classes/org/basex/query/util/list/ANodeList$1.class -basex-core/target/classes/org/basex/query/util/list/ANodeList.class -basex-core/target/classes/org/basex/query/util/list/AnnList.class -basex-core/target/classes/org/basex/query/util/list/ElementNodes$Node.class -basex-core/target/classes/org/basex/query/util/list/ElementNodes$NodeIterator.class -basex-core/target/classes/org/basex/query/util/list/ElementNodes.class -basex-core/target/classes/org/basex/query/util/list/ExprList.class -basex-core/target/classes/org/basex/query/util/list/ItemList$1.class -basex-core/target/classes/org/basex/query/util/list/ItemList.class -basex-core/target/classes/org/basex/query/util/list/ValueList.class -basex-core/target/classes/org/basex/query/util/parse/LocalVars.class -basex-core/target/classes/org/basex/query/util/parse/ModInfo.class -basex-core/target/classes/org/basex/query/util/parse/QNmCache.class -basex-core/target/classes/org/basex/query/util/parse/QNmCheck.class -basex-core/target/classes/org/basex/query/util/parse/VarContext.class -basex-core/target/classes/org/basex/query/util/pkg/EXPathRepo.class -basex-core/target/classes/org/basex/query/util/pkg/JarDesc.class -basex-core/target/classes/org/basex/query/util/pkg/JarParser.class -basex-core/target/classes/org/basex/query/util/pkg/ModuleLoader.class -basex-core/target/classes/org/basex/query/util/pkg/Pkg.class -basex-core/target/classes/org/basex/query/util/pkg/PkgComponent.class -basex-core/target/classes/org/basex/query/util/pkg/PkgDep.class -basex-core/target/classes/org/basex/query/util/pkg/PkgParser$1.class -basex-core/target/classes/org/basex/query/util/pkg/PkgParser.class -basex-core/target/classes/org/basex/query/util/pkg/PkgText.class -basex-core/target/classes/org/basex/query/util/pkg/PkgType.class -basex-core/target/classes/org/basex/query/util/pkg/PkgValidator.class -basex-core/target/classes/org/basex/query/util/pkg/RepoManager.class -basex-core/target/classes/org/basex/query/util/regex/BackRef.class -basex-core/target/classes/org/basex/query/util/regex/Branch.class -basex-core/target/classes/org/basex/query/util/regex/CharClass.class -basex-core/target/classes/org/basex/query/util/regex/CharGroup.class -basex-core/target/classes/org/basex/query/util/regex/CharRange.class -basex-core/target/classes/org/basex/query/util/regex/Disjunction.class -basex-core/target/classes/org/basex/query/util/regex/Escape.class -basex-core/target/classes/org/basex/query/util/regex/Group.class -basex-core/target/classes/org/basex/query/util/regex/LineBorder.class -basex-core/target/classes/org/basex/query/util/regex/Literal.class -basex-core/target/classes/org/basex/query/util/regex/Piece.class -basex-core/target/classes/org/basex/query/util/regex/Quantifier.class -basex-core/target/classes/org/basex/query/util/regex/RegExp.class -basex-core/target/classes/org/basex/query/util/regex/RegExpList.class -basex-core/target/classes/org/basex/query/util/regex/Wildcard.class -basex-core/target/classes/org/basex/query/util/regex/parse/ParseException.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExLexer$RegExToken.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExLexer.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExParser$1.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExParser$JJCalls.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExParser$LookaheadSuccess.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExParser.class -basex-core/target/classes/org/basex/query/util/regex/parse/RegExParserConstants.class -basex-core/target/classes/org/basex/query/util/regex/parse/Token.class -basex-core/target/classes/org/basex/query/util/regex/parse/TokenManager.class -basex-core/target/classes/org/basex/query/util/regex/parse/TokenMgrError.class -basex-core/target/classes/org/basex/query/value/Value.class -basex-core/target/classes/org/basex/query/value/ValueBuilder.class -basex-core/target/classes/org/basex/query/value/array/Array.class -basex-core/target/classes/org/basex/query/value/array/ArrayBuilder.class -basex-core/target/classes/org/basex/query/value/array/BigArray$1.class -basex-core/target/classes/org/basex/query/value/array/BigArray.class -basex-core/target/classes/org/basex/query/value/array/EmptyArray.class -basex-core/target/classes/org/basex/query/value/array/LeafNode.class -basex-core/target/classes/org/basex/query/value/array/PartialLeafNode.class -basex-core/target/classes/org/basex/query/value/array/SmallArray$1.class -basex-core/target/classes/org/basex/query/value/array/SmallArray.class -basex-core/target/classes/org/basex/query/value/item/ADate.class -basex-core/target/classes/org/basex/query/value/item/ADateDur.class -basex-core/target/classes/org/basex/query/value/item/ANum.class -basex-core/target/classes/org/basex/query/value/item/AStr.class -basex-core/target/classes/org/basex/query/value/item/Atm.class -basex-core/target/classes/org/basex/query/value/item/B64.class -basex-core/target/classes/org/basex/query/value/item/B64Lazy.class -basex-core/target/classes/org/basex/query/value/item/Bin.class -basex-core/target/classes/org/basex/query/value/item/Bln.class -basex-core/target/classes/org/basex/query/value/item/DTDur.class -basex-core/target/classes/org/basex/query/value/item/Dat.class -basex-core/target/classes/org/basex/query/value/item/Dbl.class -basex-core/target/classes/org/basex/query/value/item/Dec.class -basex-core/target/classes/org/basex/query/value/item/Dtm.class -basex-core/target/classes/org/basex/query/value/item/Dummy.class -basex-core/target/classes/org/basex/query/value/item/Dur.class -basex-core/target/classes/org/basex/query/value/item/FItem.class -basex-core/target/classes/org/basex/query/value/item/Flt.class -basex-core/target/classes/org/basex/query/value/item/FuncItem$1.class -basex-core/target/classes/org/basex/query/value/item/FuncItem.class -basex-core/target/classes/org/basex/query/value/item/GDt.class -basex-core/target/classes/org/basex/query/value/item/Hex.class -basex-core/target/classes/org/basex/query/value/item/Int$1.class -basex-core/target/classes/org/basex/query/value/item/Int.class -basex-core/target/classes/org/basex/query/value/item/Item$1.class -basex-core/target/classes/org/basex/query/value/item/Item.class -basex-core/target/classes/org/basex/query/value/item/Jav.class -basex-core/target/classes/org/basex/query/value/item/Lazy.class -basex-core/target/classes/org/basex/query/value/item/QNm.class -basex-core/target/classes/org/basex/query/value/item/Str.class -basex-core/target/classes/org/basex/query/value/item/StrLazy.class -basex-core/target/classes/org/basex/query/value/item/Tim.class -basex-core/target/classes/org/basex/query/value/item/Uln.class -basex-core/target/classes/org/basex/query/value/item/Uri.class -basex-core/target/classes/org/basex/query/value/item/YMDur.class -basex-core/target/classes/org/basex/query/value/map/Map.class -basex-core/target/classes/org/basex/query/value/map/MergeDuplicates.class -basex-core/target/classes/org/basex/query/value/map/TrieBranch.class -basex-core/target/classes/org/basex/query/value/map/TrieLeaf$1.class -basex-core/target/classes/org/basex/query/value/map/TrieLeaf.class -basex-core/target/classes/org/basex/query/value/map/TrieList$1.class -basex-core/target/classes/org/basex/query/value/map/TrieList.class -basex-core/target/classes/org/basex/query/value/map/TrieNode$1.class -basex-core/target/classes/org/basex/query/value/map/TrieNode.class -basex-core/target/classes/org/basex/query/value/node/ANode$1.class -basex-core/target/classes/org/basex/query/value/node/ANode$2.class -basex-core/target/classes/org/basex/query/value/node/ANode$3.class -basex-core/target/classes/org/basex/query/value/node/ANode$4.class -basex-core/target/classes/org/basex/query/value/node/ANode$5.class -basex-core/target/classes/org/basex/query/value/node/ANode.class -basex-core/target/classes/org/basex/query/value/node/DBNode$1.class -basex-core/target/classes/org/basex/query/value/node/DBNode$2.class -basex-core/target/classes/org/basex/query/value/node/DBNode$3.class -basex-core/target/classes/org/basex/query/value/node/DBNode$4.class -basex-core/target/classes/org/basex/query/value/node/DBNode$5.class -basex-core/target/classes/org/basex/query/value/node/DBNode$6.class -basex-core/target/classes/org/basex/query/value/node/DBNode$7.class -basex-core/target/classes/org/basex/query/value/node/DBNode$8.class -basex-core/target/classes/org/basex/query/value/node/DBNode$9.class -basex-core/target/classes/org/basex/query/value/node/DBNode.class -basex-core/target/classes/org/basex/query/value/node/FAttr.class -basex-core/target/classes/org/basex/query/value/node/FComm.class -basex-core/target/classes/org/basex/query/value/node/FDoc.class -basex-core/target/classes/org/basex/query/value/node/FElem.class -basex-core/target/classes/org/basex/query/value/node/FNSpace.class -basex-core/target/classes/org/basex/query/value/node/FNode$1.class -basex-core/target/classes/org/basex/query/value/node/FNode$2.class -basex-core/target/classes/org/basex/query/value/node/FNode$3.class -basex-core/target/classes/org/basex/query/value/node/FNode$4.class -basex-core/target/classes/org/basex/query/value/node/FNode$5.class -basex-core/target/classes/org/basex/query/value/node/FNode$6.class -basex-core/target/classes/org/basex/query/value/node/FNode.class -basex-core/target/classes/org/basex/query/value/node/FPI.class -basex-core/target/classes/org/basex/query/value/node/FTNode.class -basex-core/target/classes/org/basex/query/value/node/FTPosNode.class -basex-core/target/classes/org/basex/query/value/node/FTxt.class -basex-core/target/classes/org/basex/query/value/seq/BlnSeq.class -basex-core/target/classes/org/basex/query/value/seq/BytSeq.class -basex-core/target/classes/org/basex/query/value/seq/DBNodeSeq.class -basex-core/target/classes/org/basex/query/value/seq/DBNodes.class -basex-core/target/classes/org/basex/query/value/seq/DblSeq.class -basex-core/target/classes/org/basex/query/value/seq/DecSeq.class -basex-core/target/classes/org/basex/query/value/seq/Empty$1.class -basex-core/target/classes/org/basex/query/value/seq/Empty.class -basex-core/target/classes/org/basex/query/value/seq/FltSeq.class -basex-core/target/classes/org/basex/query/value/seq/IntSeq$1.class -basex-core/target/classes/org/basex/query/value/seq/IntSeq.class -basex-core/target/classes/org/basex/query/value/seq/NativeSeq.class -basex-core/target/classes/org/basex/query/value/seq/RangeSeq.class -basex-core/target/classes/org/basex/query/value/seq/Seq$1.class -basex-core/target/classes/org/basex/query/value/seq/Seq.class -basex-core/target/classes/org/basex/query/value/seq/SingletonSeq.class -basex-core/target/classes/org/basex/query/value/seq/StrSeq.class -basex-core/target/classes/org/basex/query/value/seq/SubSeq.class -basex-core/target/classes/org/basex/query/value/seq/tree/BigSeq$1.class -basex-core/target/classes/org/basex/query/value/seq/tree/BigSeq$2.class -basex-core/target/classes/org/basex/query/value/seq/tree/BigSeq.class -basex-core/target/classes/org/basex/query/value/seq/tree/LeafNode.class -basex-core/target/classes/org/basex/query/value/seq/tree/PartialLeafNode.class -basex-core/target/classes/org/basex/query/value/seq/tree/SmallSeq$1.class -basex-core/target/classes/org/basex/query/value/seq/tree/SmallSeq$2.class -basex-core/target/classes/org/basex/query/value/seq/tree/SmallSeq.class -basex-core/target/classes/org/basex/query/value/seq/tree/TreeSeq.class -basex-core/target/classes/org/basex/query/value/seq/tree/TreeSeqBuilder$1.class -basex-core/target/classes/org/basex/query/value/seq/tree/TreeSeqBuilder.class -basex-core/target/classes/org/basex/query/value/type/ArrayType.class -basex-core/target/classes/org/basex/query/value/type/AtomType$1.class -basex-core/target/classes/org/basex/query/value/type/AtomType$10.class -basex-core/target/classes/org/basex/query/value/type/AtomType$11.class -basex-core/target/classes/org/basex/query/value/type/AtomType$12.class -basex-core/target/classes/org/basex/query/value/type/AtomType$13.class -basex-core/target/classes/org/basex/query/value/type/AtomType$14.class -basex-core/target/classes/org/basex/query/value/type/AtomType$15.class -basex-core/target/classes/org/basex/query/value/type/AtomType$16.class -basex-core/target/classes/org/basex/query/value/type/AtomType$17.class -basex-core/target/classes/org/basex/query/value/type/AtomType$18.class -basex-core/target/classes/org/basex/query/value/type/AtomType$19.class -basex-core/target/classes/org/basex/query/value/type/AtomType$2.class -basex-core/target/classes/org/basex/query/value/type/AtomType$20.class -basex-core/target/classes/org/basex/query/value/type/AtomType$21.class -basex-core/target/classes/org/basex/query/value/type/AtomType$22.class -basex-core/target/classes/org/basex/query/value/type/AtomType$23.class -basex-core/target/classes/org/basex/query/value/type/AtomType$24.class -basex-core/target/classes/org/basex/query/value/type/AtomType$25.class -basex-core/target/classes/org/basex/query/value/type/AtomType$26.class -basex-core/target/classes/org/basex/query/value/type/AtomType$27.class -basex-core/target/classes/org/basex/query/value/type/AtomType$28.class -basex-core/target/classes/org/basex/query/value/type/AtomType$29.class -basex-core/target/classes/org/basex/query/value/type/AtomType$3.class -basex-core/target/classes/org/basex/query/value/type/AtomType$30.class -basex-core/target/classes/org/basex/query/value/type/AtomType$31.class -basex-core/target/classes/org/basex/query/value/type/AtomType$32.class -basex-core/target/classes/org/basex/query/value/type/AtomType$33.class -basex-core/target/classes/org/basex/query/value/type/AtomType$34.class -basex-core/target/classes/org/basex/query/value/type/AtomType$35.class -basex-core/target/classes/org/basex/query/value/type/AtomType$36.class -basex-core/target/classes/org/basex/query/value/type/AtomType$37.class -basex-core/target/classes/org/basex/query/value/type/AtomType$38.class -basex-core/target/classes/org/basex/query/value/type/AtomType$39.class -basex-core/target/classes/org/basex/query/value/type/AtomType$4.class -basex-core/target/classes/org/basex/query/value/type/AtomType$40.class -basex-core/target/classes/org/basex/query/value/type/AtomType$41.class -basex-core/target/classes/org/basex/query/value/type/AtomType$42.class -basex-core/target/classes/org/basex/query/value/type/AtomType$43.class -basex-core/target/classes/org/basex/query/value/type/AtomType$44.class -basex-core/target/classes/org/basex/query/value/type/AtomType$45.class -basex-core/target/classes/org/basex/query/value/type/AtomType$46.class -basex-core/target/classes/org/basex/query/value/type/AtomType$5.class -basex-core/target/classes/org/basex/query/value/type/AtomType$6.class -basex-core/target/classes/org/basex/query/value/type/AtomType$7.class -basex-core/target/classes/org/basex/query/value/type/AtomType$8.class -basex-core/target/classes/org/basex/query/value/type/AtomType$9.class -basex-core/target/classes/org/basex/query/value/type/AtomType.class -basex-core/target/classes/org/basex/query/value/type/ExprType.class -basex-core/target/classes/org/basex/query/value/type/FuncType.class -basex-core/target/classes/org/basex/query/value/type/ListType.class -basex-core/target/classes/org/basex/query/value/type/MapType.class -basex-core/target/classes/org/basex/query/value/type/NodeType$1.class -basex-core/target/classes/org/basex/query/value/type/NodeType$2.class -basex-core/target/classes/org/basex/query/value/type/NodeType$3.class -basex-core/target/classes/org/basex/query/value/type/NodeType$4.class -basex-core/target/classes/org/basex/query/value/type/NodeType$5.class -basex-core/target/classes/org/basex/query/value/type/NodeType$6.class -basex-core/target/classes/org/basex/query/value/type/NodeType$7.class -basex-core/target/classes/org/basex/query/value/type/NodeType.class -basex-core/target/classes/org/basex/query/value/type/Occ.class -basex-core/target/classes/org/basex/query/value/type/SeqType.class -basex-core/target/classes/org/basex/query/value/type/Type$ID.class -basex-core/target/classes/org/basex/query/value/type/Type.class -basex-core/target/classes/org/basex/query/var/QueryStack.class -basex-core/target/classes/org/basex/query/var/StaticVar.class -basex-core/target/classes/org/basex/query/var/StaticVarRef.class -basex-core/target/classes/org/basex/query/var/Var.class -basex-core/target/classes/org/basex/query/var/VarRef.class -basex-core/target/classes/org/basex/query/var/VarScope$1.class -basex-core/target/classes/org/basex/query/var/VarScope.class -basex-core/target/classes/org/basex/query/var/VarStack.class -basex-core/target/classes/org/basex/query/var/VarUsage.class -basex-core/target/classes/org/basex/query/var/Variables$1.class -basex-core/target/classes/org/basex/query/var/Variables$VarEntry.class -basex-core/target/classes/org/basex/query/var/Variables.class -basex-core/target/classes/org/basex/server/ClientBlocker.class -basex-core/target/classes/org/basex/server/ClientInfo.class -basex-core/target/classes/org/basex/server/ClientListener.class -basex-core/target/classes/org/basex/server/Log$LogType.class -basex-core/target/classes/org/basex/server/Log.class -basex-core/target/classes/org/basex/server/LogEntry.class -basex-core/target/classes/org/basex/server/LogFile.class -basex-core/target/classes/org/basex/server/LoginException.class -basex-core/target/classes/org/basex/server/ServerCmd.class -basex-core/target/classes/org/basex/server/ServerQuery.class -basex-core/target/classes/org/basex/server/Sessions.class -basex-core/target/classes/org/basex/util/Array.class -basex-core/target/classes/org/basex/util/ArrayIterator.class -basex-core/target/classes/org/basex/util/Atts.class -basex-core/target/classes/org/basex/util/Base64.class -basex-core/target/classes/org/basex/util/BitArray.class -basex-core/target/classes/org/basex/util/Compress.class -basex-core/target/classes/org/basex/util/ConsoleReader$JLineConsoleReader.class -basex-core/target/classes/org/basex/util/ConsoleReader$SimpleConsoleReader.class -basex-core/target/classes/org/basex/util/ConsoleReader.class -basex-core/target/classes/org/basex/util/DateTime.class -basex-core/target/classes/org/basex/util/FTToken.class -basex-core/target/classes/org/basex/util/FreeSlots.class -basex-core/target/classes/org/basex/util/History.class -basex-core/target/classes/org/basex/util/Inline.class -basex-core/target/classes/org/basex/util/InputInfo.class -basex-core/target/classes/org/basex/util/InputParser.class -basex-core/target/classes/org/basex/util/InterruptibleString.class -basex-core/target/classes/org/basex/util/JarLoader.class -basex-core/target/classes/org/basex/util/JarManifest.class -basex-core/target/classes/org/basex/util/Main.class -basex-core/target/classes/org/basex/util/MainParser.class -basex-core/target/classes/org/basex/util/MinHeap.class -basex-core/target/classes/org/basex/util/Num.class -basex-core/target/classes/org/basex/util/Pair.class -basex-core/target/classes/org/basex/util/Performance.class -basex-core/target/classes/org/basex/util/Prop.class -basex-core/target/classes/org/basex/util/Reflect.class -basex-core/target/classes/org/basex/util/Strings.class -basex-core/target/classes/org/basex/util/Table.class -basex-core/target/classes/org/basex/util/Token.class -basex-core/target/classes/org/basex/util/TokenBuilder.class -basex-core/target/classes/org/basex/util/TokenParser.class -basex-core/target/classes/org/basex/util/Util.class -basex-core/target/classes/org/basex/util/Version.class -basex-core/target/classes/org/basex/util/XMLAccess$1.class -basex-core/target/classes/org/basex/util/XMLAccess.class -basex-core/target/classes/org/basex/util/XMLToken.class -basex-core/target/classes/org/basex/util/ft/DictionaryStemmer.class -basex-core/target/classes/org/basex/util/ft/DummyStemmer.class -basex-core/target/classes/org/basex/util/ft/EnglishStemmer.class -basex-core/target/classes/org/basex/util/ft/FTBigUnit.class -basex-core/target/classes/org/basex/util/ft/FTBitapSearch$TokenComparator.class -basex-core/target/classes/org/basex/util/ft/FTBitapSearch.class -basex-core/target/classes/org/basex/util/ft/FTCase.class -basex-core/target/classes/org/basex/util/ft/FTContents.class -basex-core/target/classes/org/basex/util/ft/FTDiacritics.class -basex-core/target/classes/org/basex/util/ft/FTDistanceOptions.class -basex-core/target/classes/org/basex/util/ft/FTFlag.class -basex-core/target/classes/org/basex/util/ft/FTIterator.class -basex-core/target/classes/org/basex/util/ft/FTLexer.class -basex-core/target/classes/org/basex/util/ft/FTMode.class -basex-core/target/classes/org/basex/util/ft/FTOpt.class -basex-core/target/classes/org/basex/util/ft/FTScopeOptions.class -basex-core/target/classes/org/basex/util/ft/FTSpan.class -basex-core/target/classes/org/basex/util/ft/FTUnit.class -basex-core/target/classes/org/basex/util/ft/FTWindowOptions.class -basex-core/target/classes/org/basex/util/ft/GermanStemmer.class -basex-core/target/classes/org/basex/util/ft/GreekStemmer.class -basex-core/target/classes/org/basex/util/ft/IndonesianStemmer.class -basex-core/target/classes/org/basex/util/ft/InternalStemmer.class -basex-core/target/classes/org/basex/util/ft/JapaneseTokenizer$1.class -basex-core/target/classes/org/basex/util/ft/JapaneseTokenizer$Morpheme.class -basex-core/target/classes/org/basex/util/ft/JapaneseTokenizer.class -basex-core/target/classes/org/basex/util/ft/Language.class -basex-core/target/classes/org/basex/util/ft/LanguageImpl.class -basex-core/target/classes/org/basex/util/ft/LuceneStemmer$StemmerClass.class -basex-core/target/classes/org/basex/util/ft/LuceneStemmer.class -basex-core/target/classes/org/basex/util/ft/Scoring.class -basex-core/target/classes/org/basex/util/ft/SnowballStemmer$StemmerClass.class -basex-core/target/classes/org/basex/util/ft/SnowballStemmer.class -basex-core/target/classes/org/basex/util/ft/StemDir.class -basex-core/target/classes/org/basex/util/ft/Stemmer.class -basex-core/target/classes/org/basex/util/ft/StopWords.class -basex-core/target/classes/org/basex/util/ft/Tokenizer.class -basex-core/target/classes/org/basex/util/ft/WesternTokenizer.class -basex-core/target/classes/org/basex/util/ft/WordnetStemmer.class -basex-core/target/classes/org/basex/util/hash/ASet.class -basex-core/target/classes/org/basex/util/hash/IntMap.class -basex-core/target/classes/org/basex/util/hash/IntObjMap.class -basex-core/target/classes/org/basex/util/hash/IntSet.class -basex-core/target/classes/org/basex/util/hash/TokenBoolMap.class -basex-core/target/classes/org/basex/util/hash/TokenIntMap.class -basex-core/target/classes/org/basex/util/hash/TokenMap.class -basex-core/target/classes/org/basex/util/hash/TokenObjMap.class -basex-core/target/classes/org/basex/util/hash/TokenSet.class -basex-core/target/classes/org/basex/util/http/HttpClient.class -basex-core/target/classes/org/basex/util/http/HttpMethod.class -basex-core/target/classes/org/basex/util/http/HttpPayload.class -basex-core/target/classes/org/basex/util/http/HttpRequest$Part.class -basex-core/target/classes/org/basex/util/http/HttpRequest.class -basex-core/target/classes/org/basex/util/http/HttpRequestParser.class -basex-core/target/classes/org/basex/util/http/HttpResponse.class -basex-core/target/classes/org/basex/util/http/HttpText$Request.class -basex-core/target/classes/org/basex/util/http/HttpText.class -basex-core/target/classes/org/basex/util/http/MediaType.class -basex-core/target/classes/org/basex/util/list/BoolList.class -basex-core/target/classes/org/basex/util/list/ByteList.class -basex-core/target/classes/org/basex/util/list/ElementList.class -basex-core/target/classes/org/basex/util/list/IntList.class -basex-core/target/classes/org/basex/util/list/LongList.class -basex-core/target/classes/org/basex/util/list/ObjectList.class -basex-core/target/classes/org/basex/util/list/StringList.class -basex-core/target/classes/org/basex/util/list/TokenList.class -basex-core/target/classes/org/basex/util/options/BooleanOption.class -basex-core/target/classes/org/basex/util/options/Comment.class -basex-core/target/classes/org/basex/util/options/EnumOption.class -basex-core/target/classes/org/basex/util/options/FuncOption.class -basex-core/target/classes/org/basex/util/options/NumberOption.class -basex-core/target/classes/org/basex/util/options/NumbersOption.class -basex-core/target/classes/org/basex/util/options/Option.class -basex-core/target/classes/org/basex/util/options/Options$YesNo.class -basex-core/target/classes/org/basex/util/options/Options$YesNoOmit.class -basex-core/target/classes/org/basex/util/options/Options.class -basex-core/target/classes/org/basex/util/options/OptionsOption.class -basex-core/target/classes/org/basex/util/options/StringOption.class -basex-core/target/classes/org/basex/util/options/StringsOption.class -basex-core/target/classes/org/basex/util/similarity/ColognePhonetic.class -basex-core/target/classes/org/basex/util/similarity/Levenshtein.class -basex-core/target/classes/org/basex/util/similarity/Soundex.class +basex-core/src/test/resources/repo/Hello.jar +basex-core/src/test/resources/repo/testJarInJar.jar +basex-examples/src/main/resources/modules/hello/HelloWorld.jar diff -Nru basex-9.7.1/pom.xml basex-9.7.2/pom.xml --- basex-9.7.1/pom.xml 2022-04-26 08:26:01.000000000 +0000 +++ basex-9.7.2/pom.xml 2022-05-14 08:34:33.000000000 +0000 @@ -5,7 +5,7 @@ org.basex basex-parent - 9.7.1 + 9.7.2 pom @@ -29,7 +29,7 @@ UTF-8 UTF-8 lib - 9.4.45.v20220203 + 9.4.46.v20220331 5.8.2