searchengine/cpix/tsrc/cpixunittest/src/suggestion.cpp
changeset 0 671dee74050a
child 14 8bd192d47aaa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searchengine/cpix/tsrc/cpixunittest/src/suggestion.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,172 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <algorithm>
+#include <vector>
+
+#include "cpixsearch.h"
+
+#include "suggestion.h"
+#include "config.h"
+
+
+
+Suggestion::Suggestion(cpix_Document & doc,
+                       Itk::TestMgr  * testMgr)
+{
+    const wchar_t
+        * value = cpix_Document_getFieldValue(&doc,
+                                              LTERM_TEXT_FIELD);
+    if (cpix_Failed(&doc))
+        {
+            ITK_EXPECT(testMgr,
+                       false,
+                       "Could not get suggestion term");
+            term_ = L"(error)";
+        }
+    else
+        {
+            term_ = value;
+        }
+    
+    value = cpix_Document_getFieldValue(&doc,
+                                        LTERM_DOCFREQ_FIELD);
+    if (cpix_Failed(&doc))
+        {
+            ITK_EXPECT(testMgr,
+                       false,
+                       "Could not get suggestion doc frequency");
+            frequency_ = L"0";
+        }
+    else
+        {
+            frequency_ = value;
+        }
+}
+
+
+const std::wstring & Suggestion::term() const
+{
+    return term_;
+}
+
+
+const std::wstring & Suggestion::frequency() const
+{
+    return frequency_;
+}
+
+
+bool operator<(const Suggestion & left,
+               const Suggestion & right)
+{
+    //
+    // We want to have the suggestions ((term, frequency) pairs)
+    // ordered by:
+    //
+    //  o first by frequency, in descending order
+    //  o then by term (lexicographical ascending)
+    //
+
+    bool
+        rv = false;
+
+    const std::wstring
+        lFreq(left.frequency()),
+        rFreq(right.frequency());
+
+    if (lFreq.length() > rFreq.length())
+        {
+            rv = true;
+        }
+    else if (lFreq.length() == rFreq.length())
+        {
+            if (lFreq > rFreq)
+                {
+                    // same length but lexicographically less =
+                    // numerically less
+                    rv = true;
+                }
+            else if (lFreq == rFreq)
+                {
+                    // same frequencies, now we order according to
+                    // terms (alphabetic lexical ordering)
+                    rv = left.term() < right.term();
+                }
+        }
+
+    return rv;
+}
+
+
+void Suggestion::printSuggestions(cpix_Hits    * hits,
+                                  Itk::TestMgr * testMgr)
+{
+    bool
+        goOn = true;
+    std::vector<Suggestion>
+        suggestions;
+    int32_t
+        hitCount = cpix_Hits_length(hits);
+
+    suggestions.reserve(hitCount);
+
+    for (int32_t i = 0; i < hitCount; ++i)
+        {
+            cpix_Document
+                doc;
+            cpix_Hits_doc(hits,
+                          i,
+                          &doc);
+            if (cpix_Failed(hits))
+                {
+                    ITK_EXPECT(testMgr,
+                               false,
+                               "Failed to get doc %d",
+                               i);
+                    cpix_ClearError(hits);
+                    goOn = false;
+                    break;
+                }
+
+            suggestions.push_back(Suggestion(doc,
+                                             testMgr));
+        }
+
+    if (goOn)
+        {
+            std::sort(suggestions.begin(),
+                      suggestions.end());
+                
+            std::vector<Suggestion>::const_iterator
+                i = suggestions.begin(),
+                end = suggestions.end();
+
+            for (; i != end; ++i)
+                {
+/*					wprintf(i->term().c_str()); 
+					printf(" "); 
+					wprintf(i->frequency().c_str()); 
+					printf("\n"); */
+                    fprintf(stdout,
+                            "%S %S\n",
+                            i->term().c_str(),
+                            i->frequency().c_str());
+                }
+        }
+}
+