Composite Key Index
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();
}
}