bg

Composite Index

chevron

Composite Keys

Efficient way to structure data for faster queries

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