/*! @page custom_collators Custom Collators @section custom_collators_intro Introduction to Custom Collators WiredTiger tables order records based on their keys. Cursors traverse records in key order using WT_CURSOR::next, or in reverse order using WT_CURSOR::prev. By default, WiredTiger uses lexicographic ordering, by comparing the raw bytes of each key to determine their order. The built-in encoding of types (including integers and strings) is designed to make lexicographic ordering match the natural ordering, including when the key consists of multiple columns, each of which can be a different type. Applications that need custom ordering of keys can either change the serialized representation so that the lexicographic order matches the required order, or implement the WT_COLLATOR interface to change the comparison routine that WiredTiger uses. Applications must register their WT_COLLATOR implementations using WT_CONNECTION::add_collator. They are then configured by passing \c "collator=..." to WT_SESSION::create when creating a table or index. See @ex_ref{ex_extending.c} for more details about how to implement custom collators. @section custom_collators_recovery Custom Collators and Recovery If logging is enabled, WiredTiger will run recovery as required in ::wiredtiger_open. Any custom collators in use must be registered before recovery runs. This is described in more detail in @ref extensions_recovery. @section custom_collators_indices Custom Collators for Indices Custom collators can be used with indices, but they must take into account how WiredTiger indices are implemented. The primary key columns are implicitly appended to the logical index key columns in order to create the key that is stored in the index. This is done so that the key stored in the index is unique even when multiple records have the same values for the index key columns. A collator must give an unambiguous ordering to records in the index, so it must use the primary key columns as well as the index columns when comparing two index records. What this means in practice is that if the table has \c key_format=r and the index is on a string column, then the index cursor will have \c key_format=S, but the actual keys stored in the index will have \c key_format=Sr (with the primary key appended). Collators usually call ::wiredtiger_struct_unpack with the appropriate format to split the index key into fields that are used for the comparison. */