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
Hi Marcus,
thanks for your nice and helpful feedback. Some quick comments:
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@uni-konstanz.de), is currently combining REST and BaseX as well; you are invited to exchange your experiences.
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.
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
Am Thu, 21 Jan 2010 12:01:45 +0100 schrieb Christian Grün christian.gruen@gmail.com:
Hi Christian,
thanks for your interest!
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
basex-talk@mailman.uni-konstanz.de