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 extends StandardFunc> 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 extends StandardFunc> 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 extends StandardFunc> 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