void SearchShardsBase::setError(const string& sErrorMsg) { stringstream ss; XMLResultFormatter formatter; QueryResult qResult; qResult.setError(sErrorMsg); formatter.format(qResult, ss); m_sResult = ss.str(); }
//static void SearchServiceClient::formatError(string& sResult, const string& sErrorMsg) { stringstream ss; XMLResultFormatter formatter; QueryResult qResult; qResult.setError(sErrorMsg); formatter.format(qResult, ss); sResult = ss.str(); }
void HTTPSearchService::sendErrorMessage(const string& sErrorMsg, EvHttpRequestContext* pCtx) const { stringstream ss; QueryResult result; result.setError(sErrorMsg); XMLResultFormatter formatter; formatter.format(result, ss); sendResponse(ss.str(), pCtx); }
void RPCSearchService::formatErrorMessage(string& sMsgResult, const string& sErrorMsg) const { stringstream ss; QueryResult result; result.setError(sErrorMsg); XMLResultFormatter formatter; formatter.format(result, ss); sMsgResult = ss.str(); }
void SearchShardsBase::collectPhaseTwoResult() { FX_DEBUG("Collect phase two result"); SEARCH_LATENCY_BEGIN(); QueryResult phaseTwoResult; const QueryResult& qResult = m_pResultCollector->getResult(); phaseTwoResult.setTracer(qResult.getTracer()); int64_t nMaxTimeCost = 0; m_shardResults.clear(); for (size_t i = 0; i < m_requestedShards.size(); ++i) { SearchShardBase* pShard = m_requestedShards[i]; const string& sResult = pShard->getResponse(); if (pShard->getStatus() != SearchReplicaBase::EC_OK) { stringstream ss; ss << "Has error on shard: [" << pShard->getName() << "]: " << parseError(sResult); FX_LOG(ERROR, ss.str().c_str()); setError(ss.str()); SEARCH_LATENCY_END(m_nPhaseTwoCollectLatency); return; } FX_TRACE("Phase2 result: [%s]", sResult.c_str()); XMLResultParser parser; QueryResultPtr& pTmpQRes = m_shardResults[pShard->getShardId()].second; parser.parse(sResult, *(pTmpQRes)); if (pTmpQRes->getTimeCost() > nMaxTimeCost) { nMaxTimeCost = pTmpQRes->getTimeCost(); } // merge trace information QueryTracerPtr& pTracer = pTmpQRes->getTracer(); if (pTracer.isNotNull()) { if (phaseTwoResult.getTracer().isNull()) { phaseTwoResult.setTracer(new QueryTracer("proxy", pTracer->getLevel())); } string str; NumberFormatter::append(str, pShard->getShardId()); phaseTwoResult.getTracer()->addChildTracer(pTracer)->prependPath(str); } } // Merge hit docs phaseTwoResult.setTotalHits(qResult.getTotalHits()); phaseTwoResult.setTimeCost(nMaxTimeCost + qResult.getTimeCost()); QueryResult::Iterator it = qResult.iterator(); while (it.hasNext()) { const ResultDocPtr& pDoc = it.next(); shardid_t shardId = pDoc->getShardId(); FIRTEX_ASSERT2((size_t)shardId <= m_shards.size()); ResultPair& resPair = m_shardResults[shardId]; QueryResultPtr& pQResult2 = resPair.second; if (pQResult2->hasError()) { FX_LOG(ERROR, "Has error on shard: [%d], msg: [%s]", pQResult2->getErrorMsg().c_str()); phaseTwoResult.setError(pQResult2->getErrorMsg()); break; } ResultDocPtr& pDoc2 = (*pQResult2)[resPair.first++]; pDoc2->setScore(pDoc->getScore()); phaseTwoResult.addDoc(pDoc2); } SEARCH_LATENCY_END(m_nPhaseTwoCollectLatency); // Add query trace information QueryTracerPtr& pResTracer = phaseTwoResult.getTracer(); if (pResTracer.isNotNull()) { FX_QUERY_TRACE(DEBUG, pResTracer, "Phase one search latency: [%d] ms", m_nPhaseOneLatency); FX_QUERY_TRACE(DEBUG, pResTracer, "Phase one collection latency: [%d] ms", m_nPhaseOneCollectLatency); FX_QUERY_TRACE(DEBUG, pResTracer, "Phase two search latency: [%d] ms", m_nPhaseTwoLatency); FX_QUERY_TRACE(DEBUG, pResTracer, "Phase two collection latency: [%d] ms", m_nPhaseTwoCollectLatency); } FX_DEBUG("Begin format result"); stringstream ss; XMLResultFormatter formatter; formatter.format(phaseTwoResult, ss); m_sResult = ss.str(); FX_DEBUG("End format result"); }