ソースを参照

Fix 0bound count.

Stefano Cossu 4 年 前
コミット
664823b34d
2 ファイル変更31 行追加20 行削除
  1. 28 17
      src/store_mdb.c
  2. 3 3
      test/test_store_mdb.c

+ 28 - 17
src/store_mdb.c

@@ -516,12 +516,7 @@ LSUP_store_lookup(
     LookupArgs args_s;
     LookupArgs *args = &args_s;
 
-    if (store->default_ctx) {
-        if (args->ck = LSUP_sterm_to_key(sspoc[3]) == NULL_KEY)
-            args->ck = LSUP_sterm_to_key(store->default_ctx);
-    } else {
-        args->ck = NULL_KEY;
-    }
+    args->ck = store->default_ctx ? LSUP_sterm_to_key(sspoc[3]) : NULL_KEY;
 
     args->ct = ct;
     *args->ct = 0;
@@ -795,7 +790,7 @@ index_triple(
 inline static LSUP_rc
 lookup_0bound(struct MDBStore *store, LookupArgs *args)
 {
-    int rc = LSUP_NORESULT;
+    int rc = LSUP_NORESULT, db_rc;
 
     MDB_txn *txn;
     if(store->txn) txn = store->txn;
@@ -803,16 +798,32 @@ lookup_0bound(struct MDBStore *store, LookupArgs *args)
 
     MDB_val key_v;
 
+    MDB_cursor *cur;
+
     if(args->ct) {
-        MDB_stat stat;
-        mdb_stat(txn, store->dbi[IDX_S_PO], &stat);
+        if(args->ck != NULL_KEY) {
+            // Look up by given context.
+            db_rc = mdb_cursor_open(txn, store->dbi[IDX_C_SPO], &cur);
+
+            key_v.mv_data = &args->ck;
+            key_v.mv_size = KLEN;
+
+            db_rc = mdb_cursor_get(cur, &key_v, NULL, MDB_SET);
+            if (db_rc != MDB_SUCCESS) return rc;
+
+            db_rc = mdb_cursor_count(cur, args->ct);
 
-        *args->ct = stat.ms_entries;
+        } else {
+            // Look up all contexts.
+            MDB_stat stat;
+            mdb_stat(txn, store->dbi[IDX_S_PO], &stat);
+
+            *args->ct = stat.ms_entries;
+        }
 
         if (!args->callback_fn && *args->ct > 0) rc = LSUP_OK;
     }
 
-    MDB_cursor *cur;
     mdb_cursor_open(txn, store->dbi[IDX_S_PO], &cur);
 
     if(args->callback_fn) {
@@ -859,17 +870,17 @@ lookup_1bound(struct MDBStore *store, LookupArgs *args)
 
     if(args->ct) {
         db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
-        db_rc = mdb_cursor_count(cur, args->ct);
+        if (db_rc != MDB_SUCCESS) return rc;
 
         if (!args->callback_fn && *args->ct > 0) rc = LSUP_OK;
     }
 
     if(args->callback_fn) {
-        rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
-        if (rc == MDB_SUCCESS)
-            rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_GET_MULTIPLE);
+        db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
+        if (db_rc == MDB_SUCCESS)
+            db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_GET_MULTIPLE);
 
-        while (rc != MDB_NOTFOUND) {
+        while (db_rc != MDB_NOTFOUND) {
             LSUP_Key **lu_dset = data_v.mv_data;
             for (int i = 0; i < data_v.mv_size / DBL_KLEN; i++) {
                 // Build triple key from lookup key and result keys.
@@ -882,7 +893,7 @@ lookup_1bound(struct MDBStore *store, LookupArgs *args)
                 rc = args->callback_fn(spok, args->data);
                 if (rc < 0) goto _match1b_abort;
             }
-            rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_NEXT_MULTIPLE);
+            db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_NEXT_MULTIPLE);
         }
     }
 

+ 3 - 3
test/test_store_mdb.c

@@ -67,17 +67,17 @@ static int test_triple_store()
         {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[4].s, ser_trp[4].p, ser_trp[6].o, NULL},
     };
 
     size_t results[12] = {
         8,
         5, 1, 1, 0, 1,
-        2, 1, 2, 0,
+        2, 1, 2, 1,
         1, 0,
     };
 
-    for (int i = 0; i < 8; i++) {
+    for (int i = 0; i < 12; i++) {
         TRACE("Testing triple lookup #%d.\n", i);
         int rc = LSUP_store_lookup(store, lut[i], &ct, NULL, NULL);
         if (ct > 0) EXPECT_INT_EQ(rc, LSUP_OK);