unsigned long search(TSearchInfo pSearchInfo, unsigned long pExpResults, unsigned int *pFlags = NULL)
	{
		unsigned int lFlags = 0;
		TV_R(!pSearchInfo.empty(), mTest);

		uint64_t cntResults = 0 ;
		CmvautoPtr<IStmt> ftQ(mSession->createStmt()) ;	
		unsigned char lVar = ftQ->addVariable() ;

		TSearchInfo::const_iterator lIter = pSearchInfo.begin();
		int i = 0;
		for(; lIter != pSearchInfo.end(); lIter++, i++)
		{
			//string strFlags;
			//if ( pFlags[i] & QFT_FILTER_SW ) strFlags.append( "QFT_FILTER_SW ");
			//if ( pFlags[i] & MODE_ALL_WORDS ) strFlags.append( "MODE_ALL_WORDS ");
			PropertyID lPropID = lIter->first;
			Tstring lSearchKey = lIter->second;
			
			unsigned int flagsToAddConditionFT = 0;
			if (pFlags && pFlags[i])
			{
				lFlags |= pFlags[i];
				if (pFlags[i] & QFT_FILTER_SW)
				{
					flagsToAddConditionFT |= QFT_FILTER_SW;
					lFlags &= ~QFT_FILTER_SW ;
				}
			}			
			TVRC_R( ftQ->addConditionFT( lVar, lSearchKey.c_str(), flagsToAddConditionFT, &lPropID, 1), mTest);
		}		
		
		TVRC_R( ftQ->count( cntResults, NULL, 0, ~0, lFlags ), mTest );	
		ICursor* lC = NULL;
		ftQ->execute(&lC, NULL, 0, ~0, 0, lFlags);
		CmvautoPtr<ICursor> res(lC);
		PID lPID ;
		unsigned long cntCheck = 0 ;
		while( RC_OK == res->next(lPID) ) 
		{
			if (mTest->isVerbose())
				MVTApp::output(lPID, std::cout, mSession);
			cntCheck++ ;			
		}
		
		TV_R(cntCheck == pExpResults, mTest) ;
		TV_R(cntCheck == cntResults, mTest) ;

		return (unsigned long)cntResults ;
	}