A Query Library is a set of attributes, packaged together in a self contained unit, which allows the code to be shared between different workunits. This reduces the time required to deploy a set of attributes, and can reduce the memory footprint for the set of queries within Roxie that use the library. It is also possible to update a query library without having to re-deploy all the queries that use it.
Query libraries are not supported in Thor, but may be in the future.
A Query Library is defined by two structures--an INTERFACE to define the parameters to pass, and a MODULE that implements the INTERFACE.
To create a Query Library, the first requirement is a definition of its input parameters with an INTERFACE structure that receives the parameters:
NamesRec := RECORD INTEGER1 NameID; STRING20 FName; STRING20 LName; END; FilterLibIface1(DATASET(namesRec) ds, STRING search) := INTERFACE EXPORT DATASET(namesRec) matches; EXPORT DATASET(namesRec) others; END;
This example defines the INTERFACE for a library that takes two inputs--a DATASET (with the specified layout format) and a STRING--and which gives you the ability to output two DATASET results.
For most library queries it may be preferable to also use a separate INTERFACE to define the input parameters. Using an INTERFACE makes the passed parameters clearer and makes it easier to keep the interface and implementation in sync. This example defines the same library interface as above:
NamesRec := RECORD INTEGER1 NameID; STRING20 FName; STRING20 LName; END; IFilterArgs := INTERFACE //defines passed parameters EXPORT DATASET(namesRec) ds; EXPORT STRING search; END; FilterLibIface2(IFilterArgs args) := INTERFACE EXPORT DATASET(namesRec) matches; EXPORT DATASET(namesRec) others; END;