In erlier versions of xxl, the classes for processing data with and without metadata were completly separated. So, two kinds of algorithms (in xxl.core.cursors and in xxl.core.relational) had to be maintained. Now, the algorithms in cursors has been extended with the concept of MetaDataCursors, so that they can be used in relational.
Using the cursors package has had some effects on the constructors, because the cursor package uses Predicates and Functions. The new relational package uses the {@link xxl.core.cursors.MetaDataCursor} instead of ResultSet. But there are also constructors that use ResultSets as input parameters. These ResultSets are wrapped to MetaDataCursors using the class {@link xxl.core.relational.cursors.ResultSetMetaDataCursor}.
Be careful when you have null values inside your sources! Then, your Predicates and Comparators have to be able to handle this. The objects returned from methods in {@link xxl.core.relational.Tuples} support this handling. To convert a comparator to handle null-values see {@link xxl.core.comparators.Comparators}. For predicates: {@link xxl.core.predicates.Predicates}.
The function createTuple is always used to convert something into a
{@link xxl.core.relational.Tuple Tuple}.
There are two caling styles:
To use an ArrayTuple you can simply hand over (
ResultSet --> Tuple
Object [] x ResultSetMetaData --> Tuple
ArrayTuple.FACTORY_METHOD
).
Sometimes, you have to distinguish from creating Tuples from
an input ResultSet and creating Tuples as output.
If no createTuple function has to be provided for the output, you can assume that the objects remain unchanged in structure.