aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-12-19 17:15:51 +0000
committerChristian Grothoff <christian@grothoff.org>2011-12-19 17:15:51 +0000
commit1b9a6fa6063c79120be8e9cf4bd42863751f04db (patch)
tree0511a203fd1dc0ddb9536a930cb7595e27fa807f /src/fs/fs_search.c
parentb10b45c398e1da19723c368d6ddd3641e2a97a79 (diff)
downloadgnunet-1b9a6fa6063c79120be8e9cf4bd42863751f04db.tar.gz
gnunet-1b9a6fa6063c79120be8e9cf4bd42863751f04db.zip
improving results seen communication to consider which exact keywords a particular result has been seen for so far
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r--src/fs/fs_search.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c
index d016d320e..5c19835f5 100644
--- a/src/fs/fs_search.c
+++ b/src/fs/fs_search.c
@@ -387,6 +387,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc,
387 struct GNUNET_FS_SearchResult *sr; 387 struct GNUNET_FS_SearchResult *sr;
388 struct GetResultContext grc; 388 struct GetResultContext grc;
389 int is_new; 389 int is_new;
390 unsigned int koff;
390 391
391 /* check if new */ 392 /* check if new */
392 GNUNET_assert (NULL != sc); 393 GNUNET_assert (NULL != sc);
@@ -411,6 +412,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc,
411 sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); 412 sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta);
412 sr->mandatory_missing = sc->mandatory_count; 413 sr->mandatory_missing = sc->mandatory_count;
413 sr->key = key; 414 sr->key = key;
415 sr->keyword_bitmap = GNUNET_malloc ((sc->uri->data.ksk.keywordCount + 7) / 8); /* round up, count bits */
414 GNUNET_CONTAINER_multihashmap_put (sc->master_result_map, &key, sr, 416 GNUNET_CONTAINER_multihashmap_put (sc->master_result_map, &key, sr,
415 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 417 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
416 } 418 }
@@ -418,6 +420,9 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc,
418 { 420 {
419 GNUNET_CONTAINER_meta_data_merge (sr->meta, meta); 421 GNUNET_CONTAINER_meta_data_merge (sr->meta, meta);
420 } 422 }
423 koff = ent - sc->requests;
424 GNUNET_assert ( (koff >= 0) && (koff < sc->uri->data.ksk.keywordCount));
425 sr->keyword_bitmap[koff / 8] |= (1 << (koff % 8));
421 /* check if mandatory satisfied */ 426 /* check if mandatory satisfied */
422 if (ent->mandatory) 427 if (ent->mandatory)
423 sr->mandatory_missing--; 428 sr->mandatory_missing--;
@@ -888,9 +893,9 @@ struct MessageBuilderContext
888 struct GNUNET_FS_SearchContext *sc; 893 struct GNUNET_FS_SearchContext *sc;
889 894
890 /** 895 /**
891 * URI the search result must match, NULL for any 896 * Keyword offset the search result must match (0 for SKS)
892 */ 897 */
893 struct GNUNET_FS_Uri *uri; 898 unsigned int keyword_offset;
894}; 899};
895 900
896 901
@@ -909,9 +914,9 @@ build_result_set (void *cls, const GNUNET_HashCode * key, void *value)
909 struct MessageBuilderContext *mbc = cls; 914 struct MessageBuilderContext *mbc = cls;
910 struct GNUNET_FS_SearchResult *sr = value; 915 struct GNUNET_FS_SearchResult *sr = value;
911 916
912 if ((mbc->uri != NULL) && 917 if ( (sr->keyword_bitmap != NULL) &&
913 (GNUNET_YES != GNUNET_FS_uri_test_equal (mbc->uri, sr->uri))) 918 (0 == (sr->keyword_bitmap[mbc->keyword_offset / 8] & (1 << (mbc->keyword_offset % 8)))) )
914 return GNUNET_OK; 919 return GNUNET_OK; /* have no match for this keyword yet */
915 if (mbc->skip_cnt > 0) 920 if (mbc->skip_cnt > 0)
916 { 921 {
917 mbc->skip_cnt--; 922 mbc->skip_cnt--;
@@ -941,9 +946,9 @@ find_result_set (void *cls, const GNUNET_HashCode * key, void *value)
941 struct MessageBuilderContext *mbc = cls; 946 struct MessageBuilderContext *mbc = cls;
942 struct GNUNET_FS_SearchResult *sr = value; 947 struct GNUNET_FS_SearchResult *sr = value;
943 948
944 if ((mbc->uri != NULL) && 949 if ( (sr->keyword_bitmap != NULL) &&
945 (GNUNET_YES != GNUNET_FS_uri_test_equal (mbc->uri, sr->uri))) 950 (0 == (sr->keyword_bitmap[mbc->keyword_offset / 8] & (1 << (mbc->keyword_offset % 8)))) )
946 return GNUNET_OK; 951 return GNUNET_OK; /* have no match for this keyword yet */
947 mbc->put_cnt++; 952 mbc->put_cnt++;
948 return GNUNET_OK; 953 return GNUNET_OK;
949} 954}
@@ -988,7 +993,7 @@ transmit_search_request (void *cls, size_t size, void *buf)
988 { 993 {
989 msize = sizeof (struct SearchMessage); 994 msize = sizeof (struct SearchMessage);
990 GNUNET_assert (size >= msize); 995 GNUNET_assert (size >= msize);
991 mbc.uri = NULL; 996 mbc.keyword_offset = sc->keyword_offset;
992 mbc.put_cnt = 0; 997 mbc.put_cnt = 0;
993 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 998 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
994 &find_result_set, &mbc); 999 &find_result_set, &mbc);
@@ -1038,7 +1043,7 @@ transmit_search_request (void *cls, size_t size, void *buf)
1038 mbc.put_cnt = (size - msize) / sizeof (GNUNET_HashCode); 1043 mbc.put_cnt = (size - msize) / sizeof (GNUNET_HashCode);
1039 sqms = GNUNET_CONTAINER_multihashmap_size (sc->master_result_map); 1044 sqms = GNUNET_CONTAINER_multihashmap_size (sc->master_result_map);
1040 mbc.put_cnt = GNUNET_MIN (mbc.put_cnt, sqms - mbc.skip_cnt); 1045 mbc.put_cnt = GNUNET_MIN (mbc.put_cnt, sqms - mbc.skip_cnt);
1041 mbc.uri = NULL; 1046 mbc.keyword_offset = 0;
1042 if (sc->search_request_map_offset < sqms) 1047 if (sc->search_request_map_offset < sqms)
1043 GNUNET_assert (mbc.put_cnt > 0); 1048 GNUNET_assert (mbc.put_cnt > 0);
1044 msize += sizeof (GNUNET_HashCode) * mbc.put_cnt; 1049 msize += sizeof (GNUNET_HashCode) * mbc.put_cnt;
@@ -1315,6 +1320,7 @@ search_result_suspend (void *cls, const GNUNET_HashCode * key, void *value)
1315 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 1320 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1316 if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) 1321 if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK)
1317 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); 1322 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task);
1323 GNUNET_free_non_null (sr->keyword_bitmap);
1318 GNUNET_free (sr); 1324 GNUNET_free (sr);
1319 return GNUNET_OK; 1325 return GNUNET_OK;
1320} 1326}
@@ -1480,6 +1486,7 @@ search_result_free (void *cls, const GNUNET_HashCode * key, void *value)
1480 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); 1486 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1481 if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK) 1487 if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK)
1482 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); 1488 GNUNET_SCHEDULER_cancel (sr->probe_cancel_task);
1489 GNUNET_free_non_null (sr->keyword_bitmap);
1483 GNUNET_free (sr); 1490 GNUNET_free (sr);
1484 return GNUNET_OK; 1491 return GNUNET_OK;
1485} 1492}