searchengine/cpix/cpix/src/qrytypes/prefixqrytype.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 13:33:22 +0300
changeset 1 6f2c1c46032b
child 3 ae3f1779f6da
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* 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 <stdio.h>
#include <stdlib.h>
#include <wchar.h>

#include "clucene.h"
#include "clucene/queryParser/multifieldqueryparser.h"

#include "cpixtools.h"

#include "cpixhits.h"
#include "cpixsearch.h"
#include "cpixidxdb.h"
#include "cpixexc.h"
#include "iidxdb.h"
#include "initparams.h"
#include "cpixutil.h"
#include "iqrytype.h"

#include "cpixmaindefs.h"


namespace Cpix
{
    
    /**
     * Format and semantics are described in iqrytype.cpp
     */
    class PrefixQryType : public IQryType
    {
    private:
        //
        // private members
        //
        lucene::queryParser::QueryParser * clQueryParser_;
        lucene::search::Query            * clQuery_;

    public:
        //
        // public operators
        //

        //
        // from interface IQryType
        //
        
        virtual void setUp(cpix_QueryParser              * queryParser,
                           const std::list<std::wstring> & args,
                           const wchar_t                 * qryStr)
        {
            wchar_t mQryStr[250];

            wmemset(mQryStr,0,250);
            getAnalyzedString(qryStr, mQryStr );
            
            clQueryParser_ = Cast2Native<cpix_QueryParser>(queryParser);
            
            if (args.size() > 0)
            {
                THROW_CPIXEXC(PL_ERROR "No arguments needed here");
            }
            
            clQuery_ = clQueryParser_->parse((const wchar_t *)mQryStr);
            
            if (clQuery_ == NULL)
                {
                    THROW_CPIXEXC("Query reduced to empty query.");
                }
        }


        virtual cpix_Hits * search(cpix_IdxSearcher * idxSearcher)
        {
            return CLuceneSearchIdx(idxSearcher,
                                    clQuery_);
        }


        virtual cpix_Hits * search(cpix_IdxDb * idxDb)
        {
            return CLuceneSearchIdx(idxDb,
                                    clQuery_);
        }

        void getAnalyzedString(const wchar_t* input, wchar_t* output)
            {

            CL_NS_USE(index)
            CL_NS_USE(util)
            CL_NS_USE(store)
            CL_NS_USE(search)
            CL_NS_USE(document)
            CL_NS_USE(queryParser)
            CL_NS_USE(analysis)
            CL_NS_USE2(analysis,standard)

            StandardAnalyzer sAnalyser;

            Reader* reader = _CLNEW StringReader(input);
            TokenStream* ts = sAnalyser.tokenStream(_T("dummy"), reader );
            Token t;

            while(ts->next(&t))
                {
                wcscat(output,t.termText());
                wcscat(output,L"* ");
                }
            size_t len = wcslen(output);

            if(len == 0)
                wcscpy(output,L"*");
            else
                {
                if(output[len-1] == L' ')
                    output[len-1] = L'\0';
                }

            ts->close();
            _CLDELETE(ts);
            _CLDELETE(reader);


            }


    private:
        //
        // private implementation details
        //
    };



    IQryType * CreatePrefixQryType()
    {
        return new PrefixQryType;
    }

}