Ver Fonte

Test quad lookup with unbound context.

Stefano Cossu há 4 anos atrás
pai
commit
3221cb4c6f
2 ficheiros alterados com 107 adições e 68 exclusões
  1. 24 17
      src/store_mdb.c
  2. 83 51
      test/test_store_mdb.c

+ 24 - 17
src/store_mdb.c

@@ -51,7 +51,7 @@ struct MDBStore {
 /** @brief Common match callback arguments.
  */
 typedef struct LookupArgs {
-    LSUP_Key luks[2];               // 0÷2 lookup keys.
+    LSUP_Key luks[3];               // 0÷3 lookup keys.
     uint8_t idx0, idx1;             // Which term in the triple the lookup keys
                                     // represent, respectively.
     LSUP_Key ck;                    // Context key to restrict results to.
@@ -530,6 +530,9 @@ LSUP_store_lookup(
 
     // s p o (all terms bound)
     if (spok[0] != NULL_KEY && spok[1] != NULL_KEY && spok[2] != NULL_KEY) {
+        args->luks[0] = spok[0];
+        args->luks[1] = spok[1];
+        args->luks[2] = spok[2];
         return lookup_3bound(store, args);
     }
 
@@ -553,6 +556,7 @@ LSUP_store_lookup(
 
     } else if (spok[1] != NULL_KEY) {
         args->luks[0] = spok[1];
+        args->idx0 = 1;
 
         if (spok[2] != NULL_KEY) { // ? p o
             args->luks[1] = spok[2];
@@ -560,7 +564,6 @@ LSUP_store_lookup(
             return lookup_2bound(store, args);
 
         } else { // ? p ?
-            args->idx0 = 1;
             return lookup_1bound(store, args);
         }
 
@@ -802,7 +805,7 @@ lookup_0bound(struct MDBStore *store, LookupArgs *args)
 
     if(args->ct) {
         MDB_stat stat;
-        mdb_stat(txn, store->dbi[IDX_SPO_C], &stat);
+        mdb_stat(txn, store->dbi[IDX_S_PO], &stat);
 
         *args->ct = stat.ms_entries;
 
@@ -810,7 +813,7 @@ lookup_0bound(struct MDBStore *store, LookupArgs *args)
     }
 
     MDB_cursor *cur;
-    mdb_cursor_open(txn, store->dbi[IDX_SPO_C], &cur);
+    mdb_cursor_open(txn, store->dbi[IDX_S_PO], &cur);
 
     if(args->callback_fn) {
         rc = mdb_cursor_get(cur, &key_v, NULL, MDB_FIRST);
@@ -991,31 +994,35 @@ _match2b_abort:
 inline static LSUP_rc
 lookup_3bound(struct MDBStore *store, LookupArgs *args)
 {
-    int rc = LSUP_NORESULT;
+    TRACE(
+            "Looking up 3 bound: {%lx, %lx, %lx}",
+            args->luks[0], args->luks[1], args->luks[2]);
+    LSUP_rc rc = LSUP_NORESULT;
 
     MDB_txn *txn;
-    if(store->txn)
-        txn = store->txn;
-    else
-        mdb_txn_begin(store->env, NULL, MDB_RDONLY, &txn);
+    if(store->txn) txn = store->txn;
+    else mdb_txn_begin(store->env, NULL, MDB_RDONLY, &txn);
 
     MDB_cursor *cur;
-    rc = mdb_cursor_open(txn, store->dbi[IDX_SPO_C], &cur);
+    int db_rc = mdb_cursor_open(txn, store->dbi[IDX_S_PO], &cur);
 
     MDB_val key_v, data_v;
     key_v.mv_data = args->luks;
-    key_v.mv_size = TRP_KLEN;
+    key_v.mv_size = KLEN;
+    data_v.mv_data = args->luks + 1;
+    data_v.mv_size = DBL_KLEN;
 
-    if(args->ct) {
-        if (mdb_cursor_get(cur, &key_v, NULL, MDB_SET) == MDB_SUCCESS)
-            mdb_cursor_count(cur, args->ct);
+    db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_GET_BOTH);
 
-        if (!args->callback_fn && *args->ct > 0) rc = LSUP_OK;
+    if(args->ct) {
+        if (db_rc == MDB_SUCCESS) {
+            *args->ct = 1;
+            if (!args->callback_fn) rc = LSUP_OK;
+        }
     }
 
     if(args->callback_fn) {
-        rc = mdb_cursor_get(cur, &key_v, NULL, MDB_FIRST);
-        while (rc != MDB_NOTFOUND) {
+        while (db_rc != MDB_NOTFOUND) {
             LSUP_TripleKey spok;
 
             rc = args->callback_fn(spok, args->data);

+ 83 - 51
test/test_store_mdb.c

@@ -110,10 +110,11 @@ static int test_quad_store()
 
     LSUP_Term *ctx1 = LSUP_uri_new("urn:c:1");
     LSUP_SerTerm sc1_s;
-    LSUP_term_serialize(ctx1, &sc1_s);
+    LSUP_SerTerm *sc1 = &sc1_s;
+    LSUP_term_serialize(ctx1, sc1);
 
     LSUP_MDBStore *store;
-    store = LSUP_store_new(path, &sc1_s); // quad store.
+    store = LSUP_store_new(path, sc1); // quad store.
     ASSERT(store != NULL, "Error initializing store!");
 
     LSUP_Triple *trp = create_triples();
@@ -136,7 +137,8 @@ static int test_quad_store()
 
     LSUP_Term *ctx2 = LSUP_uri_new("urn:c:2");
     LSUP_SerTerm sc2_s;
-    LSUP_term_serialize(ctx2, &sc2_s);
+    LSUP_SerTerm *sc2 = &sc2_s;
+    LSUP_term_serialize(ctx2, sc2);
 
     // Only triples 4÷9 in default context.
     EXPECT_PASS(LSUP_store_add(store, &sc2_s, ser_trp + 4, 6));
@@ -148,15 +150,15 @@ static int test_quad_store()
     // This context is not with any triple.
     LSUP_Term *ctx3 = LSUP_uri_new("urn:c:3");
     LSUP_SerTerm sc3_s;
+    LSUP_SerTerm *sc3 = &sc3_s;
     LSUP_term_serialize(ctx2, &sc3_s);
 
     size_t ct;
-    LSUP_SerTerm *lut[12][4] = {
-        // No context
+    LSUP_SerTerm *lut[41][4] = {
+        // Any context
         {NULL, NULL, NULL, NULL},
 
         {ser_trp[0].s, NULL, NULL, NULL},
-        {ser_trp[2].s, NULL, NULL, ser_trp[2].s},
         {NULL, ser_trp[0].p, NULL, NULL},
         {NULL, ser_trp[0].s, NULL, NULL},
         {NULL, NULL, ser_trp[6].o, NULL},
@@ -164,74 +166,104 @@ static int test_quad_store()
         {ser_trp[4].s, ser_trp[4].p, NULL, NULL},
         {NULL, ser_trp[7].p, ser_trp[7].o, NULL},
         {ser_trp[5].s, NULL, ser_trp[5].o, NULL},
-        {ser_trp[6].s, NULL, ser_trp[5].o, ser_trp[2].s},
 
         {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, NULL},
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[5].o, NULL},
+        {ser_trp[2].s, ser_trp[4].p, ser_trp[5].o, NULL},
 
-        // Context 1
-        {NULL, NULL, NULL, NULL},
+        // Context 1 (trp[0÷5])
+        {NULL, NULL, NULL, sc1},
 
-        {ser_trp[0].s, NULL, NULL, NULL},
-        {ser_trp[2].s, NULL, NULL, ser_trp[2].s},
-        {NULL, ser_trp[0].p, NULL, NULL},
-        {NULL, ser_trp[0].s, NULL, NULL},
-        {NULL, NULL, ser_trp[6].o, NULL},
+        {ser_trp[0].s, NULL, NULL, sc1},
+        {ser_trp[2].s, NULL, NULL, sc1},
+        {NULL, ser_trp[0].p, NULL, sc1},
+        {NULL, ser_trp[6].p, NULL, sc1},
+        {NULL, NULL, ser_trp[6].o, sc1},
 
-        {ser_trp[4].s, ser_trp[4].p, NULL, NULL},
-        {NULL, ser_trp[7].p, ser_trp[7].o, NULL},
-        {ser_trp[5].s, NULL, ser_trp[5].o, NULL},
-        {ser_trp[6].s, NULL, ser_trp[5].o, ser_trp[2].s},
+        {ser_trp[4].s, ser_trp[4].p, NULL, sc1},
+        {NULL, ser_trp[7].p, ser_trp[7].o, sc1},
+        {ser_trp[5].s, NULL, ser_trp[5].o, sc1},
 
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, NULL},
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[5].o, NULL},
+        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, sc1},
+        {ser_trp[6].s, ser_trp[6].p, ser_trp[6].o, sc1},
 
 
-        // Context 2
-        {NULL, NULL, NULL, NULL},
+        // Context 2 (trp[4÷9])
+        {NULL, NULL, NULL, sc2},
 
-        {ser_trp[0].s, NULL, NULL, NULL},
-        {ser_trp[2].s, NULL, NULL, ser_trp[2].s},
-        {NULL, ser_trp[0].p, NULL, NULL},
-        {NULL, ser_trp[0].s, NULL, NULL},
-        {NULL, NULL, ser_trp[6].o, NULL},
+        {ser_trp[0].s, NULL, NULL, sc2},
+        {NULL, ser_trp[0].p, NULL, sc2},
+        {NULL, ser_trp[0].s, NULL, sc2},
+        {NULL, NULL, ser_trp[6].o, sc2},
 
-        {ser_trp[4].s, ser_trp[4].p, NULL, NULL},
-        {NULL, ser_trp[7].p, ser_trp[7].o, NULL},
-        {ser_trp[5].s, NULL, ser_trp[5].o, NULL},
-        {ser_trp[6].s, NULL, ser_trp[5].o, ser_trp[2].s},
+        {ser_trp[4].s, ser_trp[4].p, NULL, sc2},
+        {NULL, ser_trp[7].p, ser_trp[7].o, sc2},
+        {ser_trp[5].s, NULL, ser_trp[5].o, sc2},
 
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, NULL},
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[5].o, NULL},
+        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, sc2},
+        {ser_trp[6].s, ser_trp[6].p, ser_trp[6].o, sc2},
 
 
         // Non-existing context
-        {NULL, NULL, NULL, NULL},
+        {NULL, NULL, NULL, sc3},
 
-        {ser_trp[0].s, NULL, NULL, NULL},
-        {ser_trp[2].s, NULL, NULL, ser_trp[2].s},
-        {NULL, ser_trp[0].p, NULL, NULL},
-        {NULL, ser_trp[0].s, NULL, NULL},
-        {NULL, NULL, ser_trp[6].o, NULL},
+        {ser_trp[0].s, NULL, NULL, sc3},
+        {NULL, ser_trp[0].p, NULL, sc3},
+        {NULL, ser_trp[0].s, NULL, sc3},
+        {NULL, NULL, ser_trp[6].o, sc3},
 
-        {ser_trp[4].s, ser_trp[4].p, NULL, NULL},
-        {NULL, ser_trp[7].p, ser_trp[7].o, NULL},
-        {ser_trp[5].s, NULL, ser_trp[5].o, NULL},
-        {ser_trp[6].s, NULL, ser_trp[5].o, ser_trp[2].s},
+        {ser_trp[4].s, ser_trp[4].p, NULL, sc3},
+        {NULL, ser_trp[7].p, ser_trp[7].o, sc3},
+        {ser_trp[5].s, NULL, ser_trp[5].o, sc3},
 
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, NULL},
-        {ser_trp[4].s, ser_trp[4].p, ser_trp[5].o, NULL},
+        {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o, sc3},
+        {ser_trp[6].s, ser_trp[6].p, ser_trp[6].o, sc3},
     };
 
-    size_t results[12] = {
+    size_t results[40] = {
+        // NULL ctx
         8,
-        5, 1, 1, 0, 1,
-        2, 1, 2, 0,
+        5, 1, 0, 1,
+        2, 1, 2,
         1, 0,
+
+        // ctx1
+        6,
+        4, 1, 0, 0,
+        1, 0, 0,
+        1, 0,
+
+        // ctx2
+        4,
+        3, 0, 0, 1,
+        2, 1, 1,
+        1, 1,
+
+        // ctx3
+        0,
+        0, 0, 0, 0,
+        0, 0, 0,
+        0, 0,
     };
 
-    for (int i = 0; i < 8; i++) {
-        TRACE("Testing triple lookup #%d.\n", i);
+    for (int i = 0; i < 41; i++) {
+        printf("Testing triple lookup #%d: {", i);
+
+        if(lut[i][0]) LSUP_buffer_print(lut[i][0]);
+        else printf("NULL");
+        printf(" ");
+
+        if(lut[i][1]) LSUP_buffer_print(lut[i][1]);
+        else printf("NULL");
+        printf(" ");
+
+        if(lut[i][2]) LSUP_buffer_print(lut[i][2]);
+        else printf("NULL");
+        printf(" ");
+
+        if(lut[i][3]) LSUP_buffer_print(lut[i][3]);
+        else printf("NULL");
+        printf("}\n");
+
         int rc = LSUP_store_lookup(store, lut[i], &ct, NULL, NULL);
         if (ct > 0) EXPECT_INT_EQ(rc, LSUP_OK);
         else if (ct == 0) EXPECT_INT_EQ(rc, LSUP_NORESULT);