Switch to side-by-side view

--- a/src/rcldb/synfamily.cpp
+++ b/src/rcldb/synfamily.cpp
@@ -28,31 +28,6 @@
 
 namespace Rcl {
 
-bool XapSynFamily::synExpand(const string& member, const string& term,
-			     vector<string>& result)
-{
-    string key = entryprefix(member) + term;
-    string ermsg;
-    try {
-	for (Xapian::TermIterator xit = m_rdb.synonyms_begin(key);
-	     xit != m_rdb.synonyms_end(key); xit++) {
-	    result.push_back(*xit);
-	}
-    } XCATCHERROR(ermsg);
-    if (!ermsg.empty()) {
-	LOGERR(("synFamily::synExpand: error for member [%s] term [%s]\n",
-		member.c_str(), term.c_str()));
-	return false;
-    }
-#if 0
-    string out;
-    stringsToString(result, out);
-    LOGDEB0(("XapSynFamily::synExpand:%s: [%s] -> %s\n", member.c_str(), 
-	     term.c_str(), out.c_str()));
-#endif
-    return true;
-}
-
 bool XapSynFamily::getMembers(vector<string>& members)
 {
     string key = memberskey();
@@ -100,6 +75,35 @@
     return true;
 }
 
+bool XapSynFamily::synExpand(const string& member, const string& term,
+                             vector<string>& result)
+{
+    LOGDEB(("XapSynFamily::synExpand:(%s) %s for %s\n",
+              m_prefix1.c_str(), term.c_str(), member.c_str()));
+
+    string key = entryprefix(member) + term;
+    string ermsg;
+    try {
+        for (Xapian::TermIterator xit = m_rdb.synonyms_begin(key);
+             xit != m_rdb.synonyms_end(key); xit++) {
+            LOGDEB2(("  Pushing %s\n", (*xit).c_str()));
+            result.push_back(*xit);
+        }
+    } XCATCHERROR(ermsg);
+    if (!ermsg.empty()) {
+        LOGERR(("synFamily::synExpand: error for member [%s] term [%s]\n",
+                member.c_str(), term.c_str()));
+        result.push_back(term);
+        return false;
+    }
+    // If the input term is not in the list, add it
+    if (find(result.begin(), result.end(), term) == result.end()) {
+        result.push_back(term);
+    }
+
+    return true;
+}
+
 bool XapWritableSynFamily::deleteMember(const string& membername)
 {
     string key = entryprefix(membername);
@@ -119,31 +123,60 @@
 	m_wdb.add_synonym(memberskey(), membername);
     } XCATCHERROR(ermsg);
     if (!ermsg.empty()) {
-	LOGERR(("XapSynFamily::createMember: xapian error %s\n", ermsg.c_str()));
+	LOGERR(("XapSynFamily::createMember: error: %s\n", ermsg.c_str()));
 	return false;
     }
     return true;
 }
 
-bool XapWritableSynFamily::addSynonyms(const string& membername, 
-				       const string& term, 
-				       const vector<string>& trans)
-{
-    string key = entryprefix(membername) + term;
-    string ermsg;
-    try {
-	for (vector<string>::const_iterator it = trans.begin();
-	     it != trans.end(); it++) {
-	    m_wdb.add_synonym(key, *it);
-	}
-    } XCATCHERROR(ermsg);
-    if (!ermsg.empty()) {
-	LOGERR(("XapSynFamily::addSynonyms: xapian error %s\n", ermsg.c_str()));
+bool XapComputableSynFamMember::synExpand(const string& term, 
+					  vector<string>& result,
+					  SynTermTrans *filtertrans)
+{
+    string root = (*m_trans)(term);
+    string filter_root;
+    if (filtertrans)
+	filter_root = (*filtertrans)(term);
+
+    /* We could call XapSynFamily::synExpand() here instead of doing it
+       ourselves... */
+    string key = m_prefix + root;
+
+    LOGDEB(("XapCompSynFamMbr::synExpand([%s]): term [%s] root [%s] \n", 
+	    m_prefix.c_str(), term.c_str(), root.c_str()));
+
+    string ermsg;
+    try {
+	for (Xapian::TermIterator xit = m_family.getdb().synonyms_begin(key);
+	     xit != m_family.getdb().synonyms_end(key); xit++) {
+	    if (!filtertrans || (*filtertrans)(*xit) == filter_root) {
+		LOGDEB2(("  Pushing %s\n", (*xit).c_str()));
+		result.push_back(*xit);
+	    }
+	}
+    } XCATCHERROR(ermsg);
+    if (!ermsg.empty()) {
+	LOGERR(("XapSynDb::synExpand: error for term [%s] (key %s)\n",
+		term.c_str(), key.c_str()));
+	result.push_back(term);
 	return false;
     }
-    return true;
-}
-
+
+    // If the input term and root are not in the list, add them
+    if (find(result.begin(), result.end(), term) == result.end()) {
+	LOGDEB2(("  Pushing %s\n", term.c_str()));
+	result.push_back(term);
+    }
+    if (root != term && 
+	find(result.begin(), result.end(), root) == result.end()) {
+	if (!filtertrans || (*filtertrans)(root) == filter_root) {
+	    LOGDEB2(("  Pushing %s\n", root.c_str()));
+	    result.push_back(root);
+	}
+    }
+
+    return true;
+}
 
 }
 
@@ -169,16 +202,16 @@
 
 static string thisprog;
 static int        op_flags;
+#define OPT_D     0x1
+#define OPT_L     0x2
 #define OPT_a     0x4
-#define OPT_c     0x8
-#define OPT_D     0x1
+#define OPT_u     0x8
 #define OPT_d     0x10
-#define OPT_L     0x2
 #define OPT_l     0x20
 #define OPT_s     0x40
 #define OPT_e     0x80
 static string usage =
-    " -d <dbdir> {-s|-a|-c} database dir and synfamily: stem accents case\n"
+    " -d <dbdir> {-s|-a|-u} database dir and synfamily: stem accents/case ustem\n"
     " -l : list members\n"
     " -L <member>: list entries for given member\n"
     " -e <member> <key> : list expansion for given member and key\n"
@@ -209,7 +242,6 @@
 	while (**argv)
 	    switch (*(*argv)++) {
 	    case 'a':	op_flags |= OPT_a; break;
-	    case 'c':	op_flags |= OPT_c; break;
 	    case 'D':	op_flags |= OPT_D; break;
 	    case 'd':	op_flags |= OPT_d; if (argc < 2)  Usage();
 		dbdir = *(++argv); argc--; 
@@ -223,6 +255,7 @@
 		member = *(++argv); argc--; 
 		goto b1;
 	    case 's':	op_flags |= OPT_s; break;
+	    case 'u':	op_flags |= OPT_u; break;
 	    default: Usage();	break;
 	    }
     b1: argc--; argv++;
@@ -231,12 +264,11 @@
     if (argc != 0)
 	Usage();
 
-    // We do stem only for now
     string familyname;
     if (op_flags & OPT_a) {
-	familyname = Rcl::synFamDiac;
-    } else if (op_flags &OPT_c) {
-	familyname = Rcl::synFamCase;
+	familyname = Rcl::synFamDiCa;
+    } else if (op_flags & OPT_u) {
+	familyname = Rcl::synFamStemUnac;
     } else {
 	familyname = Rcl::synFamStem;
     }