package org.basex.examples.local;
import java.io.*;
import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.io.serial.*;
import org.basex.query.*;
import org.basex.query.iter.*;
import org.basex.query.value.*;
import org.basex.query.value.item.*;
/**
* This example demonstrates three variants how XQuery expressions can be
* evaluated.
*
* @author BaseX Team 2005-17, BSD License
*/
public final class RunQueries {
/** Database context. */
static Context context = new Context();
/**
* Runs the example code.
* @param args (ignored) command-line arguments
* @throws IOException if an error occurs while serializing the results
* @throws QueryException if an error occurs while evaluating the query
* @throws BaseXException if a database command fails
*/
public static void main(final String... args) throws IOException, QueryException {
System.out.println("=== RunQueries ===");
// Evaluate the specified XQuery
String query =
"for $x in doc('src/main/resources/xml/input.xml')//li return data($x)";
// Process the query by using the database command
System.out.println("\n* Use the database command:");
query(query);
// Directly use the query processor
System.out.println("\n* Use the query processor:");
process(query);
// Iterate through all query results
System.out.println("\n* Serialize each single result:");
serialize(query);
// Iterate through all query results
System.out.println("\n* Convert each result to its Java representation:");
iterate(query);
// Uncomment this line to see how erroneous queries are handled
// iterate("for error s$x in . return $x");
// ------------------------------------------------------------------------
// Flush output
System.out.println();
}
/**
* This method evaluates a query by using the database command.
* The results are automatically serialized and printed.
* @param query query to be evaluated
* @throws BaseXException if a database command fails
*/
static void query(final String query) throws BaseXException {
System.out.println(new XQuery(query).execute(context));
}
/**
* This method uses the {@link QueryProcessor} to evaluate a query.
* The resulting items are passed on to a serializer.
* @param query query to be evaluated
* @throws QueryException if an error occurs while evaluating the query
*/
static void process(final String query) throws QueryException {
// Create a query processor
try(QueryProcessor proc = new QueryProcessor(query, context)) {
// Execute the query
Value result = proc.value();
// Print result as string.
System.out.println(result);
}
}
/**
* This method uses the {@link QueryProcessor} to evaluate a query.
* The results are iterated one by one and converted to their Java
* representation, using {{@link Item#toJava()}. This variant is especially
* efficient if large result sets are expected.
* @param query query to be evaluated
* @throws QueryException if an error occurs while evaluating the query
*/
static void iterate(final String query) throws QueryException {
// Create a query processor
try(QueryProcessor proc = new QueryProcessor(query, context)) {
// Store the pointer to the result in an iterator:
Iter iter = proc.iter();
// Iterate through all items and serialize
for(Item item; (item = iter.next()) != null;) {
System.out.println(item.toJava());
}
}
}
/**
* This method uses the {@link QueryProcessor} to evaluate a query.
* The results are iterated one by one and passed on to an serializer.
* This variant is especially efficient if large result sets are expected.
* @param query query to be evaluated
* @throws QueryException if an error occurs while evaluating the query
* @throws IOException if an error occurs while serializing the results
*/
static void serialize(final String query) throws QueryException, IOException {
// Create a query processor
try(QueryProcessor proc = new QueryProcessor(query, context)) {
// Store the pointer to the result in an iterator:
Iter iter = proc.iter();
// Create a serializer instance
try(Serializer ser = proc.getSerializer(System.out)) {
// Iterate through all items and serialize contents
for(Item item; (item = iter.next()) != null;) {
ser.serialize(item);
}
}
System.out.println();
}
}
}