user6276653
user6276653

Reputation: 140

How to implement XQL Join using JAVA?

I am quite new to XQL and recently studied XQL Joins (join on XML documents) here :- http://www.ibiblio.org/xql/xql-proposal.html#Joins . I was just wondering that if I want to implement an XQL Join in JAVA, how can I do that using JAVA ?

Join is a new feature of XQL. I tried searching XQL Join examples in XQuery and XPath APIs in JAVA but haven't found anything (as of now) to supoort XQL Join.

An example of XQL join is as follows :-

Suppose we have a source of books and a source of reviews:-

<book>
  <isbn> 84-7169-020-9 </isbn>
  <title> Tales of the Alhambra </title>
  <author> Washington Irving </author>
</book>

<review>
  <isbn> 84-7169-020-9 </isbn>
  <title> Tales of the Alhambra </title>
  <reviewer> Ricardo Sanchez </reviewer>
  <comments>
    A romantic and humorous account of the time that
    the author of "The Legend of Sleepy Hollow" lived
    in an Arabian palace in Spain.
  </comments>
</review>

We may want to combine these to create a view of the book that includes the comments found in reviews:

<book>
  <isbn> 84-7169-020-9 </isbn>
  <title> Tales of the Alhambra </title>
  <author> Washington Irving </author>

  <review>
     <reviewer> Ricardo Sanchez </reviewer>
     <comments>
          A romantic and humorous account of the time that
          the author of "The Legend of Sleepy Hollow" lived
          in an Arabian palace in Spain.
     </comments>
  </review>
</book>

In order to achieve that, we can write the following XQL query :-

/book[isbn][$i:=isbn] {
    $i  | title  | author
    | //review[isbn=$i] { reviewer | comments }
}

Though I haven't found any such support in XPath and XQuery APIs in JAVA, but still for the sake of trying, I tried the same using XPath JAVA API. The details are as follows :-

The XML is kept in a test file (books.txt), that contains the following data :-

<?xml version="1.0"?>

<catalog>

  <book>
    <isbn>0470192747</isbn>
    <author>Kay, Michael</author>
    <title>XSLT 2.0 and XPath 2.0 (4th Edition)</title>
    <genre>Computer</genre>
    <price>33.99</price>
    <publish_date>2008-06-03</publish_date>
    <description>This book is primarily a practical reference
    book for professional XSLT developers.</description>
  </book>

  <book>
    <isbn>0596006349</isbn>
    <author>Walmsley, Priscilla</author>
    <title>XQuery</title>
    <genre>Computer</genre>
    <price>38.50</price>
    <publish_date>2007-03-30</publish_date>
    <description>This in-depth tutorial not only walks you through
    the XQuery specification, but also teaches you how to program with
    this widely anticipated query language.</description>
  </book>

  <book>
    <isbn>059652112X</isbn>
    <author>Kalin, Martin</author>
    <title>Java Web Services: Up and Running</title>
    <genre>Computer</genre>
    <price>26.99</price>
    <publish_date>2009-02-23</publish_date>
    <description>With this example-driven book, you get a quick, practical,
    and thorough introduction to Java's API for XML Web Services (JAX-WS)
    and the Java API for RESTful Web Services (JAX-RS).</description>
  </book>

  <book>
    <isbn>0321356683</isbn>
    <author>Bloch, Joshua</author>
    <title>Effective Java (2nd Edition)</title>
    <genre>Computer</genre>
    <price>35.99</price>
    <publish_date>2008-05-22</publish_date>
    <description>Presents the most practical, authoritative guidelines
    available for writing efficient,well-designed programs.</description>
  </book>

  <book>
    <isbn>0141014865</isbn>
    <author>de Botton, Alain</author>
    <title>Status Anxiety</title>
    <genre>Philosophy</genre>
    <price>9.99</price>
    <publish_date>2005-01-13</publish_date>
    <description>The author presents a universal condition of which
    many of us suffer from called Status Anxiety, investigates it's
    origins and possible solutions.</description>
  </book>

  <book>
    <isbn>0201771861</isbn>
    <author>Rusty Harold, Elliotte</author>
    <title>Processing XML with Java (SAX, DOM, JDOM, JAXP &amp; TrAX)</title>
    <genre>Computer</genre>
    <price>37.99</price>
    <publish_date>2002-11-14</publish_date>
    <description>Handing and processing XML in
    the Java programming language.</description>
  </book>

  <book>
    <isbn>1887521143</isbn>
    <author>Poomsan Becker, Benjawan</author>
    <title>Thai-English and English-Thai Dictionary</title>
    <genre>Dictionary</genre>
    <price>14.95</price>
    <publish_date>2005-04-30</publish_date>
    <description>With Transliteration for Non-Thai Speakers -
    Complete with Thai Alphabet Guide</description>
  </book>

  <book>
    <isbn>0415071771</isbn>
    <author>Jung, Carl Gustav</author>
    <title>Psychological Types</title>
    <genre>Psychology</genre>
    <price>19.99</price>
    <publish_date>1992-01-02</publish_date>
    <description>Essential reading for anyone requiring a proper
    understanding of Jung's psychology, this was the work in which Jung
    set out his theory of psychological types as a means of understanding
    ourselves and the world around us.</description>
  </book>

  <book>
    <isbn>0596003552</isbn>
    <author>Pawson, Dave</author>
    <title>XSL-FO: Making XML Look Good in Print</title>
    <genre>Computer</genre>
    <price>26.99</price>
    <publish_date>2002-08-19</publish_date>
    <description>Outlines XSL FO's strengths and weaknesses, provides
    a tutorial and reference guide.</description>
  </book>

  <book>
    <isbn>0321392795</isbn>
    <author>Gray, Simon</author>
    <title>Data Structures in Java</title>
    <genre>Computer</genre>
    <price>53.99</price>
    <publish_date>2006-11-13</publish_date>
    <description>From Abstract Data Types to the
    Java Collections Framework.</description>
  </book>

  <review>
      <isbn>0321392795</isbn>
      <title> Tales of the Alhambra </title>
      <reviewer> Ricardo Sanchez </reviewer>
      <comments>
        A romantic and humorous account of the time that
        the author of "The Legend of Sleepy Hollow" lived
        in an Arabian palace in Spain.
      </comments>
  </review>

</catalog>

The JAVA code for implementation is as follows :-

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class XQLJoin {

   public static void main(String[] args) {

      try {
         File inputFile = new File("books.txt");
         DocumentBuilderFactory dbFactory 
            = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder;

         dBuilder = dbFactory.newDocumentBuilder();

         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();

         XPath xPath =  XPathFactory.newInstance().newXPath();

         String expression = "/catalog/book[isbn][$i:=isbn] {  $i  | title  | author | //review[isbn=$i] { reviewer | comments }}";         
         NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
         for (int i = 0; i < nodeList.getLength(); i++) {
            Node nNode = nodeList.item(i);
            System.out.println("\nCurrent Element :" 
               + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
              System.out.println("Title : " 
                  + eElement
                     .getElementsByTagName("title")
                     .item(0)
                     .getTextContent());
               System.out.println("Reviewer : " 
                  + eElement
                     .getElementsByTagName("reviewer")
                     .item(0)
                     .getTextContent());
            }
         }
      } catch (ParserConfigurationException e) {
         e.printStackTrace();
      } catch (SAXException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (XPathExpressionException e) {
         e.printStackTrace();
      }
   }
}

The above code threw an exception with the following stacktrace :-

javax.xml.transform.TransformerException: Expected ], but found: isbn
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
    at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
    at XQLJoin.main(XQLJoin.java:36)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Expected ], but found: isbn
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
    at XQLJoin.main(XQLJoin.java:36)
Caused by: javax.xml.transform.TransformerException: Expected ], but found: isbn
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
    at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
    at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
    at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
    ... 2 more

Please suggest how to implement this functionality using Java. Any clues ?

Upvotes: 0

Views: 347

Answers (1)

adamretter
adamretter

Reputation: 3517

First let's start with XQL; XQL is obsolete, as far as I know there are no current implementations, I believe that XQL was a pre-cursor to XQuery, so you should really be starting from XQuery 3.1 rather than worrying about XQL.

That being said, XQuery lacks the explicit joins described in XQL. XQuery does have the facility for creating joins, but there is no implicit merge of the results. You can explicitly merge the results using 1 of 3 methods that immediately come to mind:

  1. XQuery Update to take the result of the first query and insert the result of the join.
  2. An identity transform on the result of the first query, injecting the result of the join.
  3. Using element-constructors to output the shape of XML that you want and placing the queries into that structure (shown below).

The problem with your code above is that your XPath is invalid, which is exactly what the error you are receiving is telling you, i.e. [$i:=isbn] is the initial problem, but then the {{ part isn't valid XPath or XQuery either.

For an XQuery expression to do what you are looking for, I will present perhaps the easier approach for beginners (i.e. option 3 from above):

<catalog>
{
    for $book in /catalog/book
    let $reviews := /catalog/review[isbn eq $book/isbn]
    return
        <book>
        {
            $book/*,
            for $review in $reviews
            return
                <review>
                {
                    $review/(reviewer | comments)
                }
                </review>
        }
        </book>
}
</catalog>

This will produce the following output (from the source document that you described in your question):

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
   <book>
      <isbn>0470192747</isbn>
      <author>Kay, Michael</author>
      <title>XSLT 2.0 and XPath 2.0 (4th Edition)</title>
      <genre>Computer</genre>
      <price>33.99</price>
      <publish_date>2008-06-03</publish_date>
      <description>This book is primarily a practical reference
            book for professional XSLT developers.</description>
   </book>
   <book>
      <isbn>0596006349</isbn>
      <author>Walmsley, Priscilla</author>
      <title>XQuery</title>
      <genre>Computer</genre>
      <price>38.50</price>
      <publish_date>2007-03-30</publish_date>
      <description>This in-depth tutorial not only walks you through
            the XQuery specification, but also teaches you how to program with
            this widely anticipated query language.</description>
   </book>
   <book>
      <isbn>059652112X</isbn>
      <author>Kalin, Martin</author>
      <title>Java Web Services: Up and Running</title>
      <genre>Computer</genre>
      <price>26.99</price>
      <publish_date>2009-02-23</publish_date>
      <description>With this example-driven book, you get a quick, practical,
            and thorough introduction to Java's API for XML Web Services (JAX-WS)
            and the Java API for RESTful Web Services (JAX-RS).</description>
   </book>
   <book>
      <isbn>0321356683</isbn>
      <author>Bloch, Joshua</author>
      <title>Effective Java (2nd Edition)</title>
      <genre>Computer</genre>
      <price>35.99</price>
      <publish_date>2008-05-22</publish_date>
      <description>Presents the most practical, authoritative guidelines
            available for writing efficient,well-designed programs.</description>
   </book>
   <book>
      <isbn>0141014865</isbn>
      <author>de Botton, Alain</author>
      <title>Status Anxiety</title>
      <genre>Philosophy</genre>
      <price>9.99</price>
      <publish_date>2005-01-13</publish_date>
      <description>The author presents a universal condition of which
            many of us suffer from called Status Anxiety, investigates it's
            origins and possible solutions.</description>
   </book>
   <book>
      <isbn>0201771861</isbn>
      <author>Rusty Harold, Elliotte</author>
      <title>Processing XML with Java (SAX, DOM, JDOM, JAXP &amp; TrAX)</title>
      <genre>Computer</genre>
      <price>37.99</price>
      <publish_date>2002-11-14</publish_date>
      <description>Handing and processing XML in
            the Java programming language.</description>
   </book>
   <book>
      <isbn>1887521143</isbn>
      <author>Poomsan Becker, Benjawan</author>
      <title>Thai-English and English-Thai Dictionary</title>
      <genre>Dictionary</genre>
      <price>14.95</price>
      <publish_date>2005-04-30</publish_date>
      <description>With Transliteration for Non-Thai Speakers -
            Complete with Thai Alphabet Guide</description>
   </book>
   <book>
      <isbn>0415071771</isbn>
      <author>Jung, Carl Gustav</author>
      <title>Psychological Types</title>
      <genre>Psychology</genre>
      <price>19.99</price>
      <publish_date>1992-01-02</publish_date>
      <description>Essential reading for anyone requiring a proper
            understanding of Jung's psychology, this was the work in which Jung
            set out his theory of psychological types as a means of understanding
            ourselves and the world around us.</description>
   </book>
   <book>
      <isbn>0596003552</isbn>
      <author>Pawson, Dave</author>
      <title>XSL-FO: Making XML Look Good in Print</title>
      <genre>Computer</genre>
      <price>26.99</price>
      <publish_date>2002-08-19</publish_date>
      <description>Outlines XSL FO's strengths and weaknesses, provides
            a tutorial and reference guide.</description>
   </book>
   <book>
      <isbn>0321392795</isbn>
      <author>Gray, Simon</author>
      <title>Data Structures in Java</title>
      <genre>Computer</genre>
      <price>53.99</price>
      <publish_date>2006-11-13</publish_date>
      <description>From Abstract Data Types to the
            Java Collections Framework.</description>
      <review>
         <reviewer> Ricardo Sanchez </reviewer>
         <comments>
            A romantic and humorous account of the time that
            the author of "The Legend of Sleepy Hollow" lived
            in an Arabian palace in Spain.
        </comments>
      </review>
   </book>
</catalog>

If you use this as your expression above, you should be good to go :-)

Upvotes: 2

Related Questions