[Debtags-commits] [svn] r1976 - central-database/trunk/c-tdb

Erich Schubert erich at costa.debian.org
Mon Oct 2 16:35:37 UTC 2006


Author: erich
Date: Mon Oct  2 16:35:36 2006
New Revision: 1976

Modified:
   central-database/trunk/c-tdb/tagcloud-json.cc
Log:
Make the json app also include selected tags and matching packages

Modified: central-database/trunk/c-tdb/tagcloud-json.cc
==============================================================================
--- central-database/trunk/c-tdb/tagcloud-json.cc	(original)
+++ central-database/trunk/c-tdb/tagcloud-json.cc	Mon Oct  2 16:35:36 2006
@@ -14,6 +14,8 @@
 
 typedef pair< dbid, unsigned int > id_count;
 
+#define MIN_RESULTS 25
+
 int main(int argc, char* argv[]) {
 	/* open databases */
 	PkgDB dbpkg(O_RDONLY);
@@ -21,6 +23,9 @@
 	MapDB mappt(MAP_ID_PKG_TAG_DB, O_RDONLY);
 	MapDB maptp(MAP_ID_TAG_PKG_DB, O_RDONLY);
 
+	set<dbid> sel_tags;
+	set<dbid> remaining_pkgs;
+
 	/* find matching packages... */
 	IdList* result = NULL;
 	if (argc <= 1)
@@ -34,8 +39,8 @@
 			} else {
 				IdList temp = maptp.get(entry);
 				result->join(temp);
-				//temp.free_data();
 			}
+			sel_tags.insert(entry);
 		} catch (etdb<dbstr,dbid>::KeyNotFoundError) {
 			cerr << "Unknown tag specified: '" << argv[i] << "'" << endl;
 			exit(1);
@@ -49,14 +54,25 @@
 
 	/* for all packages, find tags assigned to them */
 	map<dbid, unsigned int> tags;
-	for (size_t i=0; i < result->size(); i++) {
-		IdList t = mappt.get((*result)[i]);
-		for (size_t j=0; j < t.size(); j++)
-			if (tags.find(t[j]) == tags.end()) {
-				tags[t[j]] = 1;
-			} else {
-				tags[t[j]] = 1 + tags[t[j]];
-			}
+	if (result->size() >= MIN_RESULTS) {
+		for (size_t i=0; i < result->size(); i++) {
+			IdList t = mappt.get((*result)[i]);
+			bool remaining = true;
+			for (size_t j=0; j < t.size(); j++)
+				if (sel_tags.find(t[j]) == sel_tags.end()) {
+					remaining = false;
+					if (tags.find(t[j]) == tags.end()) {
+						tags[t[j]] = 1;
+					} else {
+						tags[t[j]] = 1 + tags[t[j]];
+					}
+				}
+			if (remaining)
+				remaining_pkgs.insert((*result)[i]);
+		}
+	} else {
+		for (size_t i=0; i < result->size(); i++)
+			remaining_pkgs.insert((*result)[i]);
 	}
 	
 	// we don't need the packages anymore.
@@ -71,10 +87,12 @@
 			cerr << "Unknown voc id: " << i->first.id << endl;
 		}
 	bool first = true;
-	cout << "{\"tags\":[";
+	cout << "{";
+	cout << "\"tags\":[";
 	for (vector< id_count >::iterator i = tags_heap.begin(); i != tags_heap.end(); i++) {
 		try {
 			VocInfo ti = dbvoc.get(i->first);
+
 			if (first) {
 				first = false;
 			} else {
@@ -86,7 +104,42 @@
 			cerr << "Unknown voc id: " << i->first.id << endl;
 		}
 	}
-	cout << "]}";
+	cout << "]" << ",";
+	cout << "\"selected\":[";
+	first = true;
+	for (set< dbid >::iterator i = sel_tags.begin(); i != sel_tags.end(); i++) {
+		try {
+			VocInfo ti = dbvoc.get(i->id);
+
+			if (first) {
+				first = false;
+			} else {
+				cout << ",";
+			}
+			cout << "\"" << ti.name() << "\"";
+		} catch (etdb<dbid,VocInfo>::KeyNotFoundError er) {
+			cerr << "Unknown voc id: " << i->id << endl;
+		}
+	}
+	cout << "]" << ",";
+	cout << "\"packages\":[";
+	first = true;
+	for (set< dbid >::iterator i = remaining_pkgs.begin(); i != remaining_pkgs.end(); i++) {
+		try {
+			PkgInfo pi = dbpkg.get(i->id);
+
+			if (first) {
+				first = false;
+			} else {
+				cout << ",";
+			}
+			cout << "\"" << pi.name() << "\"";
+		} catch (etdb<dbid,PkgInfo>::KeyNotFoundError er) {
+			cerr << "Unknown pkg id: " << i->id << endl;
+		}
+	}
+	cout << "]";
+	cout << "}";
 
 	return(0);
 }



More information about the Debtags-commits mailing list