/*
* Copyright (c) 2013 Websquared, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* swsong - initial API and implementation
*/
package org.fastcatsearch.job.search;
import java.io.IOException;
import java.util.Map;
import org.fastcatsearch.error.SearchError;
import org.fastcatsearch.error.ServerErrorCode;
import org.fastcatsearch.exception.FastcatSearchException;
import org.fastcatsearch.ir.IRService;
import org.fastcatsearch.ir.common.IRException;
import org.fastcatsearch.ir.common.SettingException;
import org.fastcatsearch.ir.group.GroupResults;
import org.fastcatsearch.ir.group.GroupsData;
import org.fastcatsearch.ir.query.Groups;
import org.fastcatsearch.ir.query.Metadata;
import org.fastcatsearch.ir.query.Query;
import org.fastcatsearch.ir.search.CollectionHandler;
import org.fastcatsearch.job.Job;
import org.fastcatsearch.query.QueryMap;
import org.fastcatsearch.query.QueryParser;
import org.fastcatsearch.service.ServiceManager;
public class GroupSearchJob extends Job {
private static final long serialVersionUID = 3171817565336360699L;
@Override
public JobResult doRun() throws FastcatSearchException {
QueryMap queryMap = (QueryMap) getArgs();
Query q = QueryParser.getInstance().parseQuery(queryMap);
Metadata meta = q.getMeta();
Map<String, String> userData = meta.userData();
String keyword = null;
if(userData != null)
keyword = userData.get("keyword");
String collection = meta.collectionId();
GroupResults groupResults = null;
boolean noCache = false;
//no cache 옵션이 없으면 캐시를 확인한다.
if(q.getMeta().isSearchOption(Query.SEARCH_OPT_NOCACHE)){
noCache = true;
}
IRService irService = ServiceManager.getInstance().getService(IRService.class);
if(!noCache)
groupResults = irService.groupingCache().get(queryMap.queryString());
//Not Exist in Cache
if(groupResults == null){
CollectionHandler collectionHandler = irService.collectionHandler(collection);
if(collectionHandler == null){
throw new SearchError(ServerErrorCode.COLLECTION_NOT_FOUND, collection);
}
GroupsData groupData = null;
try {
groupData = collectionHandler.searcher().doGrouping(q);
} catch (Throwable t) {
throw new SearchError(ServerErrorCode.SERVER_SEARCH_ERROR, t.getMessage());
}
Groups groups =q.getGroups();
groupResults = groups.getGroupResultsGenerator().generate(groupData);
if(groupResults != null){
irService.groupingCache().put(queryMap.queryString(), groupResults);
}
}
if(keyword != null){
if(groupResults.totalSearchCount() > 0){
}else{
}
}
return new JobResult(groupResults);
}
}