Switch to side-by-side view

--- a/src/rcldb/searchdata.cpp
+++ b/src/rcldb/searchdata.cpp
@@ -1,5 +1,5 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: searchdata.cpp,v 1.21 2008-01-16 11:14:38 dockes Exp $ (C) 2006 J.F.Dockes";
+static char rcsid[] = "@(#$Id: searchdata.cpp,v 1.22 2008-08-28 15:42:43 dockes Exp $ (C) 2006 J.F.Dockes";
 #endif
 /*
  *   This program is free software; you can redistribute it and/or modify
@@ -48,6 +48,28 @@
     Xapian::Query xq;
     m_reason.erase();
 
+    if (m_query.size() < 1) {
+	m_reason = "empty query";
+	return false;
+    }
+
+    // It's not allowed to have a pure negative query and also it
+    // seems that Xapian doesn't like the first element to be AND_NOT
+    qlist_it_t itnotneg = m_query.end();
+    for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) {
+	if ((*it)->m_tp != SCLT_EXCL) {
+	    itnotneg = it;
+	    break;
+	}
+    }
+    if (itnotneg == m_query.end()) {
+	LOGERR(("SearchData::toNativeQuery: can't have all negative clauses"));
+	m_reason = "Can't have only negative clauses";
+	return false;
+    }
+    if ((*m_query.begin())->m_tp == SCLT_EXCL) 
+	iter_swap(m_query.begin(), itnotneg);
+
     // Walk the clause list translating each in turn and building the 
     // Xapian query tree
     for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) {
@@ -59,7 +81,8 @@
 	}	    
 
 	// If this structure is an AND list, must use AND_NOT for excl clauses.
-	// Else this is an OR list, and there can't be excl clauses
+	// Else this is an OR list, and there can't be excl clauses (checked by
+	// addClause())
 	Xapian::Query::op op;
 	if (m_tp == SCLT_AND) {
 	    op = (*it)->m_tp == SCLT_EXCL ?