One Problem with XQJ API and one with XQuery Update
Thursday, 21 January 2010 · 3 messages
MK
Marcus Kessel21 Jan 2010 11:04 #
Hi,
first of all: Great work! BaseX is the fastest/feature-rich XQuery Processor I have found so far.
Currently, I'm working on a RESTful Service, where your processor is a great enhancement.
So far, I've encountered a few problems.
First: There is problem with XQuery Update, especially with "insert", which is not always reproducable.
Example query:
declare variable $newrec as node() external;
insert node $newrec as first into basex:db('Recordings')/recordings
The variable $newrec is bound to a "recording" Node with XQJ
*.bindNode(new QName("newrec"), node, null);Sometimes, a ArrayIndexOutOfBoundsException is thrown in
"org.basex.query.up.Primitives" at line 51.
I did a quick hack, and replaced the null constraint with:
} else if(l.length < pos) {
l = new UpdatePrimitive[PrimitiveType.values().length];
l[pos] = p;But I think it's only a quick hack ..
The second problem I've encountered is with "order by" clause and XQJ API. Order by has no effect, if I use the XQJ Api something like this:
XQResultSequence result = null;
XQExpression loadExp = null;
try {
loadExp = this.xqueryManager.createExpression();
result = loadExp.executeQuery(queryString);
while(result.next()) {
// do something
}
}But when I use the classes of BaseX directly, "order by" orders correctly. For example:
QueryProcessor processor = new QueryProcessor(queryString, context);
Result resultX = processor.query();
resultX.serialize(new XMLSerializer(out));Sample query:
element recordings {
for $rec at $pos in basex:db('Recordings')/recordings/recording
order by xs:dateTime($rec/startDate) descending
return $rec }Any comments are appreciated ;)
Thanks!
Bye,
Marcus
CG
Christian Grün21 Jan 2010 12:01 #
Hi Marcus,
thanks for your nice and helpful feedback. Some quick comments:
Quoted text · Marcus Kessel · 2 lines
> Currently, I'm working on a RESTful Service, where your processor is a > great enhancement.
This is an interesting note; one of our members, Lukas
(lukas.lewandowski at uni-konstanz.de), is currently combining REST and BaseX as well; you are invited to exchange your experiences.
Quoted text · Marcus Kessel · 12 lines
> First: There is problem with XQuery Update, especially with "insert", > which is not always reproducable. > Example query: > > declare variable $newrec as node() external; > insert node $newrec as first into basex:db('Recordings')/recordings > > The variable $newrec is bound to a "recording" Node with XQJ > *.bindNode(new QName("newrec"), node, null); > > Sometimes, a ArrayIndexOutOfBoundsException is thrown in > "org.basex.query.up.Primitives" at line 51.
Yes, this pretty much looks like a bug - you'll get an answer on this soon.
Quoted text · Marcus Kessel · 11 lines
> The second problem I've encountered is with "order by" clause and XQJ > API. Order by has no effect, if I use the XQJ Api something like this: > XQResultSequence result = null; > XQExpression loadExp = null; > try { > loadExp = this.xqueryManager.createExpression(); > result = loadExp.executeQuery(queryString); > while(result.next()) { > // do something > } > }
An interesting one.. Could you provide us with a complete example (incl. a sample XML snippet) which demonstrates the behaviour? I just tried a small example query, which seems to be correctly evaluated by the XQJ API..
result = loadExp.executeQuery("for $i in (3,2,1) order by $i return $i");
while(result.next()) {
System.out.println(result.getInt());
}Note that, in the long term, most BaseX developers tend to use our own code APIs, as both the XQJ and XML:DB APIs lack too many requested features. After all, however, we try to keep all APIs bug free, so all kind of feedback is welcome.
Hope this helps,
Christian
___________________________
Christian Gruen
Universitaet Konstanz
Department of Computer & Information Science
D-78457 Konstanz, Germany
Tel: +49 (0)7531/88-4449, Fax: +49 (0)7531/88-3577
http://www.inf.uni-konstanz.de/~gruen
MK
Marcus Kessel21 Jan 2010 17:22 #
Quoted text · +0100 · 2 lines
Am Thu, 21 Jan 2010 12:01:45 +0100 schrieb Christian Grün <christian.gruen at gmail.com>:
Hi Christian,
thanks for your interest!
Quoted text · Christian Grün · 9 lines
> An interesting one.. Could you provide us with a complete example > (incl. a sample XML snippet) which demonstrates the behaviour? I just > tried a small example query, which seems to be correctly evaluated by > the XQJ API.. > > result = loadExp.executeQuery("for $i in (3,2,1) order by $i > return $i"); while(result.next()) { > System.out.println(result.getInt()); > }
I debugged my own implementation again and found that the "order by" problem is not caused by BaseX (XQJ), but was my own fault.
To put in a nutshell, the resulting XML is given to an JAXB
unmarshaller, who unmarshals the XML to Java objects.
The content is described as a Java Collection, but it seems
that JAXB doesn't (?) care about the order in the the generated Collection.
When I get the result Sequence as a String, the ordering is correct.
So there is no problem with ordering in BaseX (XQJ) at all ;-)
Bye,
Marcus
Written for BaseX 6. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery