Utilización de funciones externas declaradas en consultas con XQuery

Como alternativa al enlace de métodos Java™ con funciones en una consulta utilizando la API, las funciones externas Java se pueden declarar directamente dentro de una consulta. La única configuración adicional necesaria es que las clases Java enlazadas estén en la vía de acceso de clases durante la ejecución de la consulta.

Procedimiento

Utilizando la declaración de opción XQuery java-extension, puede enlazar un prefijo con una clase Java.
declare option xltxe:java-extension "prefijo = nombreClase";
Nota: Puede utilizarse cualquier nombre de prefijo para el elemento java-extension, siempre y cuando esté enlazado al espacio de nombres http://www.ibm.com/xmlns/prod/xltxe-j.
Después de enlazar un prefijo a una clase Java, se pueden invocar los métodos de la clase enlazada especificando el prefijo y el nombre del método, separados por dos puntos:
prefijo:nombreMétodo(Params*)

Ejemplo

Invocación de métodos estáticos

Cuando prepare un origen XQuery que utilice funciones externas declaradas en una consulta, declare el prefijo en un enlace de clase Java.
declare namespace calc="http://com.example/myApp/Calculator";
declare namespace sf="http://com.example/myApp/standardFormat";

declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "calc = org.company.Calculator";
declare option xltxe:java-extension "sf = org.standards.Formatter";

sf:format(calc:sqrt(64), "ISO-42.7")
Si suponemos que esta consulta está disponible utilizando el objeto origen xquerySource, el código siguiente prepara la consulta:
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
El código siguiente ejecuta la consulta que se ha preparado en el ejemplo:
// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
XSequenceCursor xsc = executable.execute();

// Output the result
xsc.exportSequence(res);

La consulta de ejemplo proporcionada presupone que la clase org.company.Calculator contiene un método estático sqrt() que toma un parámetro y la clase org.standards.Formatter contiene un método estático format() que toma dos parámetros. Durante la preparación, no son necesarias las clases en la vía de acceso de clases, pero sí son necesarias durante la ejecución de la consulta.

A continuación, se muestran implementaciones de ejemplo de las clases org.company.Calculator y org.standards.Formatter:
package org.company;

public class Calculator {
    public static int sqrt(int val) {
        return (int)Math.sqrt(val);
    }
package org.standards;

public class Formatter {
    public static String format(int val, String pattern) {
        return "Formatting " + val + " using pattern " + pattern;
    }
}

Invocación de métodos de instancia

La invocación de métodos de instancia es un poco distinta a la invocación de métodos estáticos a causa del requisito de un objeto de instancia. Para obtener un objeto de instancia de una clase Java dentro de una consulta, debe invocar su nuevo constructor:
prefijo:new(Params*)
Luego, puede almacenar el resultado en una declaración de variable XQuery, tal como muestra la siguiente consulta:
declare namespace car="http://com.example/myApp/car";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare variable $var := car:new(3);

car:getDoors($var)
Si suponemos que esta consulta está disponible utilizando el objeto origen xquerySource, el código siguiente prepara la consulta.
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
El código siguiente ejecuta la consulta que se ha preparado en el ejemplo:
// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
XSequenceCursor xsc = executable.execute();

// Output the result
xsc.exportSequence(res);

La consulta de ejemplo supone que la clase org.automobile.Car contiene un constructor que toma un argumento de tipo int. Además, la clase org.automobile.Car también contiene un método de instancia getDoors() que no toma argumentos. La sintaxis para invocar métodos de instancia de funciones externas declaradas en consulta requiere que el objeto de instancia creado se pase como el primer argumento.

A continuación, se muestra una implementación de ejemplo de la clase org.automobile.Car:
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
También está soportada la herencia con métodos de instancia. Si la clase org.automobile.Car tiene una subclase org.automobile.Sedan, puede crear una instancia de la clase org.automobile.Sedan y utilizarla para llamar a métodos en org.automobile.Car. Esto se muestra en la consulta siguiente:
declare namespace car="http://com.example/myApp/car";
declare namespace sedan="http://com.example/myApp/sedan";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare option xltxe:java-extension "sedan = org.automobile.Sedan";

declare variable $var := sedan:new(5);

car:getDoors($var)
A continuación, se muestra una implementación de ejemplo para org.automobile.Sedan:
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Limitación: El mecanismo utilizado para resolver los métodos de una clase Java requiere que sólo exista un método que coincida en nombre y número de parámetros. Si hay varios métodos con el mismo nombre y distinto número de parámetros, se genera un error.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_query_xquery
File name: txml_funcs_query_xquery.html