package org.fastcatsearch.job.internal; import java.io.IOException; import org.fastcatsearch.common.io.Streamable; 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.GroupsData; import org.fastcatsearch.ir.io.DataInput; import org.fastcatsearch.ir.io.DataOutput; 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; import org.fastcatsearch.transport.vo.StreamableGroupsData; public class InternalGroupSearchJob extends Job implements Streamable { private QueryMap queryMap; public InternalGroupSearchJob(){} public InternalGroupSearchJob(QueryMap queryMap){ this.queryMap = queryMap; } @Override public JobResult doRun() throws FastcatSearchException { Query q = QueryParser.getInstance().parseQuery(queryMap); // Metadata meta = q.getMeta(); String collectionId = queryMap.collectionId(); GroupsData result = null; IRService irService = ServiceManager.getInstance().getService(IRService.class); //Not Exist in Cache if(result == null){ CollectionHandler collectionHandler = irService.collectionHandler(collectionId); if(collectionHandler == null){ throw new SearchError(ServerErrorCode.COLLECTION_NOT_FOUND, collectionId); } try { result = collectionHandler.searcher().doGrouping(q); } catch (Throwable e) { throw new SearchError(ServerErrorCode.SERVER_SEARCH_ERROR, e.getMessage()); } } return new JobResult(new StreamableGroupsData(result)); } @Override public void readFrom(DataInput input) throws IOException { this.queryMap = new QueryMap(); queryMap.readFrom(input); } @Override public void writeTo(DataOutput output) throws IOException { queryMap.writeTo(output); } }