Author: enrico
Date: 2007-07-07 11:02:39 +0000 (Sat, 07 Jul 2007)
New Revision: 3269

Modified:
   software/ui/src/Engine.cpp
   software/ui/src/Engine.h
Log:
Use a MatchDecider to filter items before the xapian result count kicks in

Modified: software/ui/src/Engine.cpp
===================================================================
--- software/ui/src/Engine.cpp  2007-07-07 06:08:42 UTC (rev 3268)
+++ software/ui/src/Engine.cpp  2007-07-07 11:02:39 UTC (rev 3269)
@@ -26,6 +26,31 @@
 using namespace ept::apt;
 using namespace ept::debtags;
 
+struct EngineMatchDecider : public Xapian::MatchDecider
+{
+       Engine& e;
+       EngineMatchDecider(Engine& e) : e(e) {}
+
+       virtual bool operator()(const Xapian::Document &doc) const
+       {
+               // Filter out results that apt doesn't know
+               if (!e.apt().isValid(doc.get_data()))
+                       return false;
+
+               // Finally filter by installed state if requested
+               Engine::State s = e.getInstalledFilter();
+               if (s != Engine::ANY)
+               {
+                       PackageState state = e.apt().state(doc.get_data());
+                       if (s == Engine::INSTALLED && !state.isInstalled())
+                               return false;
+                       if (s == Engine::NOTINSTALLED && state.isInstalled())
+                               return false;
+               }
+               return true;
+       }
+};
+
 static Xapian::Query allGames(Vocabulary& voc)
 {
        set<Tag> games = voc.tags("game");
@@ -89,6 +114,8 @@
 
 void Engine::recompute()
 {
+       EngineMatchDecider md(*this);
+
        // Clear existing results
        m_results.clear();
        m_types.clear();
@@ -107,7 +134,7 @@
                enquire.set_query(makeQuery());
 
                // Get the 100 top matches
-               Xapian::MSet matches = enquire.get_mset(0, 100);
+               Xapian::MSet matches = enquire.get_mset(0, 100, 0, 0, &md);
                for (Xapian::MSetIterator i = matches.begin(); i != 
matches.end(); ++i)
                {
                        // Get all the game and interface tags in the result set
@@ -132,7 +159,7 @@
                enquire.set_query(makeQuery());
 
                // Get the 100 top matches
-               Xapian::MSet matches = enquire.get_mset(0, 100);
+               Xapian::MSet matches = enquire.get_mset(0, 100, 0, 0, &md);
                for (Xapian::MSetIterator i = matches.begin(); i != 
matches.end(); ++i)
                {
                        // Get all the game and interface tags in the result set
@@ -154,29 +181,17 @@
        //cerr << "  filter query: " << enquire.get_query().get_description() 
<< endl;
 
        // Get the 100 top matches
-       Xapian::MSet matches = enquire.get_mset(0, 100);
+       Xapian::MSet matches = enquire.get_mset(0, 100, 0, 0, &md);
        for (Xapian::MSetIterator i = matches.begin(); i != matches.end(); ++i)
        {
-               // Filter out results that apt doesn't know
-               if (!m_apt.isValid(i.get_document().get_data()))
-                       continue;
-
                // Stop producing if the quality goes below a cutoff point
                // FIXME: hardcoded value, but I can't see a reason to make it
                // configurable yet
+               // FIXME: can be done adaptive, and can be done using 
set_cutoff in the
+               // enquire
                //if (i.get_percent() < 40)
                        //break;
 
-               // Finally filter by installed state if requested
-               if (m_filter_state != ANY)
-               {
-                       PackageState state = 
m_apt.state(i.get_document().get_data());
-                       if (m_filter_state == INSTALLED && !state.isInstalled())
-                               continue;
-                       if (m_filter_state == NOTINSTALLED && 
state.isInstalled())
-                               continue;
-               }
-
                Result res;
                res.name = i.get_document().get_data();
                res.popcon = m_popcon[res.name];
@@ -204,6 +219,9 @@
        if (m_res_max > m_max)
                m_max = m_res_max;
 
+    if (m_filter_keywords.empty())
+               sort(m_results.begin(), m_results.end());
+
        m_dirty = false;
 }
 

Modified: software/ui/src/Engine.h
===================================================================
--- software/ui/src/Engine.h    2007-07-07 06:08:42 UTC (rev 3268)
+++ software/ui/src/Engine.h    2007-07-07 11:02:39 UTC (rev 3269)
@@ -40,6 +40,10 @@
        std::string name;
        float popcon;
        int relevance;
+       bool operator<(const Result& r) const
+       {
+               return name < r.name;
+       }
 };
 
 class Engine
@@ -142,6 +146,11 @@
         * Set the installed state filter
         */
        void setInstalledFilter(Engine::State state = ANY);
+
+       /**
+        * Get the current value of the installed filter
+        */
+       Engine::State getInstalledFilter() const { return m_filter_state; }
 };
 
 // vim:set ts=4 sw=4:


_______________________________________________
Pkg-games-commits mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/pkg-games-commits

Reply via email to