2001-05-17 08:58:55 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* $RCSfile: resultsetforquery.cxx,v $
|
2008-08-01 11:14:26 +00:00
|
|
|
* $Revision: 1.18 $
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
2008-04-11 12:58:48 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2001-05-17 08:58:55 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 00:17:54 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_xmlhelp.hxx"
|
2001-05-17 08:58:55 +00:00
|
|
|
#include <com/sun/star/ucb/Command.hpp>
|
|
|
|
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
|
2005-01-27 09:07:40 +00:00
|
|
|
#include <com/sun/star/i18n/XExtendedTransliteration.hpp>
|
2001-05-17 08:58:55 +00:00
|
|
|
#include <com/sun/star/ucb/XCommandProcessor.hpp>
|
2005-01-27 09:07:40 +00:00
|
|
|
#include <com/sun/star/lang/Locale.hpp>
|
2008-06-24 15:22:35 +00:00
|
|
|
#include <com/sun/star/script/XInvocation.hpp>
|
|
|
|
|
2001-05-17 08:58:55 +00:00
|
|
|
#include <qe/QueryProcessor.hxx>
|
2001-12-03 12:34:50 +00:00
|
|
|
#ifndef INCLUDED_STL_ALGORITHM
|
|
|
|
#include <algorithm>
|
|
|
|
#define INCLUDED_STL_ALGORITHM
|
|
|
|
#endif
|
2001-07-16 14:20:25 +00:00
|
|
|
#ifndef INCLUDED_STL_SET
|
|
|
|
#include <set>
|
|
|
|
#define INCLUDED_STL_SET
|
|
|
|
#endif
|
2001-05-17 08:58:55 +00:00
|
|
|
|
2008-03-25 14:23:14 +00:00
|
|
|
#include "resultsetforquery.hxx"
|
|
|
|
#include "databases.hxx"
|
|
|
|
|
2001-12-03 12:34:50 +00:00
|
|
|
using namespace std;
|
2001-05-17 08:58:55 +00:00
|
|
|
using namespace chelp;
|
2001-06-19 12:41:05 +00:00
|
|
|
using namespace xmlsearch::excep;
|
2001-05-17 08:58:55 +00:00
|
|
|
using namespace xmlsearch::qe;
|
|
|
|
using namespace com::sun::star;
|
|
|
|
using namespace com::sun::star::ucb;
|
2005-01-27 09:07:40 +00:00
|
|
|
using namespace com::sun::star::i18n;
|
|
|
|
using namespace com::sun::star::uno;
|
|
|
|
using namespace com::sun::star::lang;
|
2001-05-17 08:58:55 +00:00
|
|
|
|
|
|
|
ResultSetForQuery::ResultSetForQuery( const uno::Reference< lang::XMultiServiceFactory >& xMSF,
|
|
|
|
const uno::Reference< XContentProvider >& xProvider,
|
|
|
|
sal_Int32 nOpenMode,
|
|
|
|
const uno::Sequence< beans::Property >& seq,
|
|
|
|
const uno::Sequence< NumberedSortingInfo >& seqSort,
|
2001-06-06 13:48:47 +00:00
|
|
|
URLParameter& aURLParameter,
|
|
|
|
Databases* pDatabases )
|
2001-05-17 08:58:55 +00:00
|
|
|
: ResultSetBase( xMSF,xProvider,nOpenMode,seq,seqSort ),
|
2006-06-19 23:40:00 +00:00
|
|
|
m_pDatabases( pDatabases ),
|
|
|
|
m_aURLParameter( aURLParameter )
|
2001-05-17 08:58:55 +00:00
|
|
|
{
|
2005-01-27 09:07:40 +00:00
|
|
|
Reference< XTransliteration > xTrans(
|
|
|
|
xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.i18n.Transliteration" ) ),
|
|
|
|
UNO_QUERY );
|
|
|
|
Locale aLocale( aURLParameter.get_language(),
|
|
|
|
rtl::OUString(),
|
|
|
|
rtl::OUString() );
|
|
|
|
if(xTrans.is())
|
|
|
|
xTrans->loadModule(TransliterationModules_UPPERCASE_LOWERCASE,
|
|
|
|
aLocale );
|
|
|
|
|
2008-06-24 15:22:35 +00:00
|
|
|
// Access Lucene via XInvocation
|
|
|
|
Reference< script::XInvocation > xInvocation(
|
|
|
|
xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.help.HelpSearch" ) ),
|
|
|
|
UNO_QUERY );
|
|
|
|
|
2001-12-03 12:34:50 +00:00
|
|
|
unsigned int i;
|
|
|
|
vector< vector< rtl::OUString > > queryList;
|
2001-05-17 08:58:55 +00:00
|
|
|
{
|
|
|
|
sal_Int32 idx;
|
|
|
|
rtl::OUString query = m_aURLParameter.get_query();
|
|
|
|
while( query.getLength() )
|
|
|
|
{
|
|
|
|
idx = query.indexOf( sal_Unicode( ' ' ) );
|
|
|
|
if( idx == -1 )
|
|
|
|
idx = query.getLength();
|
|
|
|
|
2001-12-03 12:34:50 +00:00
|
|
|
vector< rtl::OUString > currentQuery;
|
2005-01-27 09:07:40 +00:00
|
|
|
rtl::OUString tmp(query.copy( 0,idx ));
|
|
|
|
rtl:: OUString toliterate = tmp;
|
|
|
|
if(xTrans.is()) {
|
|
|
|
Sequence<sal_Int32> aSeq;
|
|
|
|
toliterate = xTrans->transliterate(
|
|
|
|
tmp,0,tmp.getLength(),aSeq);
|
|
|
|
}
|
2008-06-24 15:22:35 +00:00
|
|
|
|
2005-01-27 09:07:40 +00:00
|
|
|
currentQuery.push_back( toliterate );
|
2001-12-03 12:34:50 +00:00
|
|
|
queryList.push_back( currentQuery );
|
2001-05-17 08:58:55 +00:00
|
|
|
|
2008-06-24 15:22:35 +00:00
|
|
|
int nCpy = 1 + idx;
|
|
|
|
if( nCpy >= query.getLength() )
|
|
|
|
query = rtl::OUString();
|
|
|
|
else
|
|
|
|
query = query.copy( 1 + idx );
|
|
|
|
}
|
2001-08-23 10:39:42 +00:00
|
|
|
}
|
2001-05-17 08:58:55 +00:00
|
|
|
|
2001-12-03 12:34:50 +00:00
|
|
|
set< rtl::OUString > aSet,aCurrent,aResultSet;
|
2008-06-24 15:22:35 +00:00
|
|
|
if( xInvocation.is() )
|
2001-06-19 12:41:05 +00:00
|
|
|
{
|
2008-06-24 15:22:35 +00:00
|
|
|
rtl::OUString scope = m_aURLParameter.get_scope();
|
|
|
|
bool bCaptionsOnly = ( scope.compareToAscii( "Heading" ) == 0 );
|
|
|
|
sal_Int32 hitCount = m_aURLParameter.get_hitCount();
|
2001-12-03 12:34:50 +00:00
|
|
|
|
2008-06-24 15:22:35 +00:00
|
|
|
try
|
2001-12-03 12:34:50 +00:00
|
|
|
{
|
2008-06-24 15:22:35 +00:00
|
|
|
rtl::OUString idxDir;
|
|
|
|
idxDir =
|
|
|
|
m_pDatabases->getInstallPathAsURL() +
|
|
|
|
m_pDatabases->lang( m_aURLParameter.get_language() ) +
|
|
|
|
rtl::OUString::createFromAscii( "/" ) +
|
|
|
|
m_aURLParameter.get_module() +
|
|
|
|
rtl::OUString::createFromAscii( ".idxl/" );
|
|
|
|
|
|
|
|
if(queryList.size() > 1)
|
|
|
|
hitCount = 2000;
|
|
|
|
|
|
|
|
for( i = 0; i < queryList.size(); ++i )
|
2001-12-03 12:34:50 +00:00
|
|
|
{
|
2008-06-24 15:22:35 +00:00
|
|
|
if( xInvocation.is() )
|
|
|
|
{
|
2008-08-01 11:14:26 +00:00
|
|
|
int nParamCount = bCaptionsOnly ? 7 : 6;
|
2008-06-24 15:22:35 +00:00
|
|
|
Sequence<uno::Any> aParamsSeq( nParamCount );
|
|
|
|
|
2008-08-01 11:14:26 +00:00
|
|
|
aParamsSeq[0] = uno::makeAny( rtl::OUString::createFromAscii( "-lang" ) );
|
|
|
|
aParamsSeq[1] = uno::makeAny( m_aURLParameter.get_language() );
|
|
|
|
|
|
|
|
aParamsSeq[2] = uno::makeAny( rtl::OUString::createFromAscii( "-index" ) );
|
2008-06-24 15:22:35 +00:00
|
|
|
rtl::OUString aSystemPath;
|
|
|
|
osl::FileBase::getSystemPathFromFileURL( idxDir, aSystemPath );
|
2008-08-01 11:14:26 +00:00
|
|
|
aParamsSeq[3] = uno::makeAny( aSystemPath );
|
2008-06-24 15:22:35 +00:00
|
|
|
|
2008-08-01 11:14:26 +00:00
|
|
|
aParamsSeq[4] = uno::makeAny( rtl::OUString::createFromAscii( "-query" ) );
|
2008-06-24 15:22:35 +00:00
|
|
|
|
|
|
|
const std::vector< rtl::OUString >& aListItem = queryList[i];
|
|
|
|
::rtl::OUString aNewQueryStr = aListItem[0];
|
2008-08-01 11:14:26 +00:00
|
|
|
aParamsSeq[5] = uno::makeAny( aNewQueryStr );
|
2008-06-24 15:22:35 +00:00
|
|
|
|
|
|
|
if( bCaptionsOnly )
|
2008-08-01 11:14:26 +00:00
|
|
|
aParamsSeq[6] = uno::makeAny( rtl::OUString::createFromAscii( "-caption" ) );
|
2008-06-24 15:22:35 +00:00
|
|
|
|
|
|
|
Sequence< sal_Int16 > aOutParamIndex;
|
|
|
|
Sequence< uno::Any > aOutParam;
|
|
|
|
uno::Any aRet = xInvocation->invoke( rtl::OUString::createFromAscii( "search" ),
|
|
|
|
aParamsSeq, aOutParamIndex, aOutParam );
|
|
|
|
|
|
|
|
Sequence<rtl::OUString> aRetSeq;
|
|
|
|
if( aRet >>= aRetSeq )
|
|
|
|
{
|
|
|
|
aSet.clear();
|
|
|
|
|
|
|
|
const rtl::OUString* pRetSeq = aRetSeq.getConstArray();
|
|
|
|
int nCount = aRetSeq.getLength();
|
|
|
|
if( nCount > hitCount )
|
|
|
|
nCount = hitCount;
|
|
|
|
for( int j = 0 ; j < nCount ; ++j )
|
|
|
|
aSet.insert( pRetSeq[j] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// intersect
|
|
|
|
if( i == 0 )
|
|
|
|
aResultSet = aSet;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aCurrent = aResultSet;
|
|
|
|
aResultSet.clear();
|
|
|
|
set_intersection( aSet.begin(),aSet.end(),
|
|
|
|
aCurrent.begin(),aCurrent.end(),
|
|
|
|
inserter(aResultSet,aResultSet.begin()));
|
|
|
|
}
|
2001-12-03 12:34:50 +00:00
|
|
|
}
|
|
|
|
}
|
2008-06-24 15:22:35 +00:00
|
|
|
catch( const Exception& )
|
|
|
|
{
|
|
|
|
}
|
2001-06-19 12:41:05 +00:00
|
|
|
}
|
2001-05-17 08:58:55 +00:00
|
|
|
|
|
|
|
sal_Int32 replIdx = rtl::OUString::createFromAscii( "#HLP#" ).getLength();
|
|
|
|
rtl::OUString replWith = rtl::OUString::createFromAscii( "vnd.sun.star.help://" );
|
|
|
|
|
2001-12-03 12:34:50 +00:00
|
|
|
set< rtl::OUString >::const_iterator set_it = aResultSet.begin();
|
|
|
|
while( set_it != aResultSet.end() )
|
2001-05-17 08:58:55 +00:00
|
|
|
{
|
2008-06-24 15:22:35 +00:00
|
|
|
rtl::OUString aResultStr = replWith + set_it->copy(replIdx);
|
|
|
|
m_aPath.push_back( aResultStr );
|
2001-12-03 12:34:50 +00:00
|
|
|
++set_it;
|
2001-05-17 08:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
m_aItems.resize( m_aPath.size() );
|
|
|
|
m_aIdents.resize( m_aPath.size() );
|
|
|
|
|
|
|
|
Command aCommand;
|
|
|
|
aCommand.Name = rtl::OUString::createFromAscii( "getPropertyValues" );
|
|
|
|
aCommand.Argument <<= m_sProperty;
|
|
|
|
|
2006-06-19 23:40:00 +00:00
|
|
|
for( m_nRow = 0; sal::static_int_cast<sal_uInt32>( m_nRow ) < m_aPath.size(); ++m_nRow )
|
2001-05-17 08:58:55 +00:00
|
|
|
{
|
2001-06-19 12:41:05 +00:00
|
|
|
m_aPath[m_nRow] =
|
|
|
|
m_aPath[m_nRow] +
|
2001-05-17 08:58:55 +00:00
|
|
|
rtl::OUString::createFromAscii( "?Language=" ) +
|
|
|
|
m_aURLParameter.get_language() +
|
|
|
|
rtl::OUString::createFromAscii( "&System=" ) +
|
|
|
|
m_aURLParameter.get_system();
|
|
|
|
|
|
|
|
uno::Reference< XContent > content = queryContent();
|
|
|
|
if( content.is() )
|
|
|
|
{
|
|
|
|
uno::Reference< XCommandProcessor > cmd( content,uno::UNO_QUERY );
|
2006-10-12 10:27:55 +00:00
|
|
|
cmd->execute( aCommand,0,uno::Reference< XCommandEnvironment >( 0 ) ) >>= m_aItems[m_nRow]; //TODO: check return value of operator >>=
|
2001-05-17 08:58:55 +00:00
|
|
|
}
|
|
|
|
}
|
2006-06-19 23:40:00 +00:00
|
|
|
m_nRow = 0xffffffff;
|
2001-05-17 08:58:55 +00:00
|
|
|
}
|