Sequence Iterator

The library of Analytics Functions that operate on database fields of type sequence use the mco_seq_iterator_t structure defined in header file mcoseq.h as follows:

     
    typedef struct mco_seq_iterator_t_
    {
        mco_seq_iterator_next_t next; /* method for obtaning next portion of values */
        mco_seq_iterator_reset_t reset; /* start iteration from beginning */
        mco_seq_iterator_prepare_t prepare; /* prepare iterator (used to start parallel processing) */
        mco_seq_iterator_merge_t merge; /* merge two iterators (used to merge results of parallel processing) */
        uint2 elem_size; /* size of element */
        uint2 tile_size; /* number of tile items */
        uint2 tile_offs; /* offset to first not handled tile item */
        uint1 rle_offs;  /* index within same RLE value */
        uint1 prepared;  /* flag set by prepare function */
        mco_seq_no_t first_seq_no; /* first sequence number (inclusive) */
        mco_seq_no_t next_seq_no;  /* sequence number of element returned by sudsequent invocation of next() function */
        mco_seq_no_t last_seq_no;  /* last sequence number (inclusive) */
        struct mco_seq_iterator_t_* opd[3]; /*operands of sequence operator */
        void* buf; /* memory buffer used by operators requiring temporary memory (reverse, order_by) */
        mco_size_t buf_size; /* size of buffer */
        uint1 elem_type; /* result element type MCO_DD_... */
        uint1 bounded; /* iterator is used in expression */
        uint1 createdBySql; /* iterator was created by SQL */
        uint8 context[MCO_SEQ_ITERATOR_CTX_SIZE/8]; /* operator specific context */
        mco_seq_tile_t tile;  /* tile of values */
     
    } mco_seq_iterator_t, *mco_seq_iterator_h;
     

 

Functions such as the generated functions classname_fieldname_search() use the mco_seq_boundary_kind_t structure to specify the boundary type:

 
    typedef enum mco_seq_boundary_kind_t_
    {
        MCO_SEQ_BOUNDARY_OPEN,
        MCO_SEQ_BOUNDARY_INCLUSIVE,
        MCO_SEQ_BOUNDARY_EXCLUSIVE
     
    } mco_seq_boundary_kind_t;
     

 

To optimize access of sequences in memory, sequence functions operate on tiles, which are arrays of sequence values in contiguous memory blocks. The last element tile of the mco_seq_iterator_t structure, which is used for this internal optimization, is defined as follows:

     
    typedef union mco_seq_tile_t_
    {
        mco_seq_bool arr_mco_seq_bool[MCO_SEQ_TILE_SIZE_BYTES/sizeof(mco_seq_bool)];
        char arr_char[MCO_SEQ_TILE_SIZE_BYTES];
        int1 arr_int1[MCO_SEQ_TILE_SIZE_BYTES];
        int2 arr_int2[MCO_SEQ_TILE_SIZE_BYTES/sizeof(int2)];
        int4 arr_int4[MCO_SEQ_TILE_SIZE_BYTES/sizeof(int4)];
        mco_int8 arr_int8[MCO_SEQ_TILE_SIZE_BYTES/sizeof(mco_int8)];
        uint1 arr_uint1[MCO_SEQ_TILE_SIZE_BYTES/sizeof(uint1)];
        uint2 arr_uint2[MCO_SEQ_TILE_SIZE_BYTES/sizeof(uint2)];
        uint4 arr_uint4[MCO_SEQ_TILE_SIZE_BYTES/sizeof(uint4)];
        uint8 arr_uint8[MCO_SEQ_TILE_SIZE_BYTES/sizeof(uint8)];
        mco_time arr_mco_time[MCO_SEQ_TILE_SIZE_BYTES/sizeof(mco_time)];
        mco_date arr_mco_date[MCO_SEQ_TILE_SIZE_BYTES/sizeof(mco_date)];
        mco_datetime arr_datetime[MCO_SEQ_TILE_SIZE_BYTES/sizeof(mco_datetime)];
        float arr_float[MCO_SEQ_TILE_SIZE_BYTES/sizeof(float)];
        double arr_double[MCO_SEQ_TILE_SIZE_BYTES/sizeof(double)];
     
    } mco_seq_tile_t MCO_ALIGN_16;