package org.basex.examples.xqj.cfoster;
import java.io.*;
import javax.xml.namespace.*;
import javax.xml.xquery.*;
/**
* XQJ Example, derived from the XQJ Tutorial
* <a href="http://www.cfoster.net/articles/xqj-tutorial">
* http://www.cfoster.net/articles/xqj-tutorial</a> from Charles Foster.
*
* Part 3: Binding Java variables to XQuery.
*
* @author BaseX Team 2005-17, BSD License
*/
public final class Part3 extends Main {
/** Default ISBN number. */
private static final String DEFAULT_ISBN = "059652112X";
/**
* Main method of the example class.
* @param args (ignored) command-line arguments
* @throws Exception exception
*/
public static void main(final String... args) throws Exception {
init("3: Binding Java variables to XQuery");
// Create the connection
XQConnection conn = connect();
// Lookup specific ISBN
String isbnID = args.length > 0 ? args[0] : DEFAULT_ISBN;
info("Lookup books by ISBN '" + isbnID + '\'');
XQExpression xqe = conn.createExpression();
// Bind variable to expression
xqe.bindString(new QName("userisbn"), isbnID, null);
String path = new File("src/main/resources/xml").getAbsolutePath();
String xqueryString =
"declare variable $userisbn external; " +
"for $x in doc('" + path + "/books.xml')//book " +
"where $x/@isbn = $userisbn " +
"return $x/title/text()";
XQResultSequence rs = xqe.executeQuery(xqueryString);
while(rs.next())
System.out.println(rs.getItemAsString(null));
// Lookup by date range
info("Lookup books by date range");
xqueryString =
"declare variable $fromDate as xs:date external; " +
"declare variable $toDate as xs:date external; " +
"for $x in doc('" + path + "/books.xml')//book " +
"let $publishDate := xs:date($x/publish_date) " +
"where $publishDate > $fromDate and $publishDate < $toDate " +
"return $x/title/text()";
XQPreparedExpression xqpe =
conn.prepareExpression(xqueryString);
// xs:date, we can use this to validate against when binding
XQItemType dateType = conn.createAtomicType(XQItemType.XQBASETYPE_DATE);
try {
// validate against dateType (xs:date)
xqpe.bindAtomicValue(new QName("fromDate"), "2008-01-32", dateType);
// There are NOT 32 days in January, so this should fail!
} catch(XQException ex) {
System.out.println(ex.getMessage());
// Now set a proper date: validate against dateType (xs:date)
xqpe.bindAtomicValue(new QName("fromDate"), "2008-01-01", dateType);
}
// validate against dateType (xs:date)
xqpe.bindAtomicValue(new QName("toDate"), "2011-01-01", dateType);
rs = xqpe.executeQuery();
while(rs.next())
System.out.println(rs.getItemAsString(null));
// Closing connection to the Database.
close(conn);
}
}