Efficient way to structure data for faster queries

Composite keys / index again can be created for WIDE_TABLE type. To create composite index for primary key, we need to create table with following setting.

table_env te;
te.set_table_type(WIDE_TABLE);
te.set_key_type(COMPOSITE_KEY);
bangdb_table *tbl = bdb->getTable((char*)"topview", &te);

There are several helper function to create composite key before putting the data into the table. Here data could be json doc or normal text or opaque data.

Here is an example for putting data into the table

char * k, * v;
FDT fk, fv;
k = makeComposite((char * )
   "1", (char * )
   "a", NULL);
v = (char * )
"val13";
fk.data = k;
fk.length = strlen(k);
fv.data = v;
fv.length = strlen(v);
tbl -> put(fk, fv, INSERT_UNIQUE);
fk.free();

// more data

insert k = makeComposite((char * )
   "2", (char * )
   "a", NULL);
v = (char * )
"val9";
fk.data = k;
fk.length = strlen(k);
fv.data = v;
fv.length = strlen(v);
tbl -> put(fk, fv, INSERT_UNIQUE);
fk.free();
k = makeComposite((char * )
   "1", (char * )
   "b", NULL);
v = (char * )
"val7";
fk.data = k;
fk.length = strlen(k);
fv.data = v;
fv.length = strlen(v);
tbl -> put( & fk, & fv, INSERT_UNIQUE);
fk.free();

Now, let's fire some query

resultset * rs = NULL;

 //to scan all data 
 while (true) {
    rs = tbl -> scan_doc(NULL);
    if (!rs) break;
    while (rs -> hasNext()) {
       rs -> moveNext();
    }
 }
 rs = NULL;
 char * tval1, * tval2;
 FDT skey, ekey;
 scan_filter sf;
 sf.skey_op = GTE;
 sf.ekey_op = LTE;
 tval1 = (char * )"1:*";
 tval2 = (char * )"1:*";
 skey.data = tval1;
 skey.length = strlen(tval1);
 ekey.data = tval2;
 ekey.length = strlen(tval2);
 while (true) {
    rs = tbl -> scan_doc(NULL, skey, ekey);
    if (!rs) break;
    while (rs -> hasNext()) {
       rs -> moveNext();
    }
 }

We can also match with the second part of the key using % char, like following:

tval1 = (char * )"1:b";
tval2 = (char * )"3:b";

// to match all data with 1:b... until 3:b 
skey.data = tval1;
skey.length = strlen(tval1);
ekey.data = tval2;
ekey.length = strlen(tval2);
while (true) {
   rs = tbl -> scan_doc(NULL, skey, ekey);
   if (!rs) break;
   while (rs -> hasNext()) {
      rs -> moveNext();
   }
}

Similarly

tval1 = (char * ) "*:a";
tval2 = (char * )"*:a";
skey.data = tval1;
skey.length = strlen(tval1);
ekey.data = tval2;
ekey.length = strlen(tval2);
while (true) {
   rs = tbl -> scan_doc(NULL, & skey, & ekey);
   if (!rs) break;
   while (rs -> hasNext()) {
      rs -> moveNext();
   }
}