#include <sm_vas.h> // which includes sort.h
class sort_stream_i {
public:
sort_stream_i();
sort_stream_i(const key_info_t& k, const sort_parm_t& s, uint est_rec_sz=0);
~sort_stream_i();
// initialize the sort_stream
void init(const key_info_t& k, const sort_parm_t& s, uint est_rec_sz=0);
// close the sort stream (release any resource held)
void finish();
// put <key, elem> pair into the sort stream
rc_t put(const cvec_t& key, const cvec_t& elem);
// fetch next pair in sorted order
rc_t get_next(vec_t& key, vec_t& elem, bool& eof);
// detect if the stream is empty
bool is_empty();
// detect if the stream is sorted or not
bool is_sorted()
};
struct key_info_t {
enum key_type_t { t_char=0, t_int, t_float, t_string, t_spatial };
enum where_t { t_hdr=0, t_body };
key_type_t type; // key type
nbox_t universe; // for spatial object only
bool derived; // if true, the key must be the only item in rec
// header, and the header will not be copied to
// the result record (allow user to store derived
// key temporarily for sorting purpose).
// following applies to file sort only
where_t where; // where the key resides
uint4 offset; // offset from the begin
uint4 len; // key length
key_info_t() {
type = t_int;
where = t_body;
offset = 0;
len = sizeof(int);
derived = FALSE;
}
};
//
// sort parameter
//
struct sort_parm_t {
uint2 run_size; // size for each run (# of pages)
vid_t vol; // volume for files
serial_t logical_id; // logical oid
bool unique; // result unique ?
bool ascending; // ascending order ?
bool destructive; // destroy the input file at the end ?
bool keep_lid; // preserve logical oid for recs in sorted
// file -- only for destructive sort
lvid_t lvid; // logical volume id
sm_store_property_t property; // temporary file ?
sort_parm_t() : run_size(10), unique(false), ascending(true),
destructive(false), property(t_regular) {}
};
To create a sort_stream_i instance, you need to supply a key_info_t parameter, which includes information about the key type (char, int, float, string or spatial). Also, a sort_parm_t parameter is needed to provide information on the run size, temporary file volume. Besides, estimated record length will help the sort code to allocate the right amount of resources for the sort.
Note that sort_stream exists only during the put and fetch, after the last pair is fetched through get_next() the stream is destroyed.