/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.handler.component; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.*; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.*; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.mdrill.FdtMdrillCollector; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.search.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URL; import java.util.*; public class QueryComponent extends SearchComponent { protected static Logger log = LoggerFactory.getLogger(QueryComponent.class); public static final String COMPONENT_NAME = "query"; @Override public void prepare(ResponseBuilder rb) throws IOException { SolrQueryRequest req = rb.req; SolrParams params = req.getParams(); if (!params.getBool(COMPONENT_NAME, true)) { return; } int fieldFlags = 0; rb.setFieldFlags( fieldFlags ); String defType = params.get(QueryParsing.DEFTYPE,QParserPlugin.DEFAULT_QTYPE); if (rb.getQueryString() == null) { rb.setQueryString( params.get( CommonParams.Q ) ); } try { QParser parser = QParser.getParser(rb.getQueryString(), defType, req); rb.setQuery( parser.getQuery() ); rb.setSortSpec( parser.getSort(true) ); rb.setQparser(parser); String[] fqs = req.getParams().getParams(CommonParams.FQ); if (fqs!=null && fqs.length!=0) { List<Query> filters = rb.getFilters(); if (filters==null) { filters = new ArrayList<Query>(fqs.length); } for (String fq : fqs) { if (fq != null && fq.trim().length()!=0) { QParser fqp = QParser.getParser(fq, null, req); filters.add(fqp.getQuery()); } } if (!filters.isEmpty()) { rb.setFilters( filters ); } } } catch (ParseException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } } /** * Actually run the query */ @Override public void process(ResponseBuilder rb) throws IOException { SolrQueryRequest req = rb.req; SolrQueryResponse rsp = rb.rsp; SolrParams params = req.getParams(); if (!params.getBool(COMPONENT_NAME, true)) { return; } SolrIndexSearcher searcher = req.getSearcher(); if (rb.getQueryCommand().getOffset() < 0) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'start' parameter cannot be negative"); } // -1 as flag if not set. long timeAllowed = (long)params.getInt( CommonParams.TIME_ALLOWED, -1 ); SolrIndexSearcher.QueryCommand cmd = rb.getQueryCommand(); cmd.setTimeAllowed(timeAllowed); SolrIndexSearcher.QueryResult result = new SolrIndexSearcher.QueryResult(); if(params.getBool("fetchfdt", false)) { String crcget=params.get("mdrill.crc.key.get",null); if(crcget!=null) { result.setDocSet(new BitDocSet()); }else{ //TODO QUICK TOP N ArrayList<Query> qlist=new ArrayList<Query>(); List<Query> list=rb.getFilters(); if(list!=null) { for(Query q:list) { qlist.add(q); } } qlist.add(rb.getQuery()); BooleanQuery query=new BooleanQuery(); for(Query q:qlist) { query.add(q, BooleanClause.Occur.MUST); } int offset = params.getInt(FacetParams.FACET_CROSS_OFFSET, 0); int limit = params.getInt(FacetParams.FACET_CROSS_LIMIT, 100); int limit_offset=offset+limit; FdtMdrillCollector coll=new FdtMdrillCollector(limit_offset+2,searcher.maxDoc()); searcher.ScoreFind(query, null,coll); result.setDocSet(new BitDocSet(coll.getBits())); } }else{ searcher.search(result,cmd); } rb.setResult( result ); rsp.add("response",rb.getResults().docList); } @Override public int distributedProcess(ResponseBuilder rb) throws IOException { ShardRequest sreq = new ShardRequest(); sreq.params = new ModifiableSolrParams(rb.req.getParams()); rb.addRequest(this, sreq); return ResponseBuilder.STAGE_DONE; } @Override public void handleResponses(ResponseBuilder rb, ShardRequest sreq) { } @Override public void finishStage(ResponseBuilder rb) { } @Override public String getDescription() { return "query"; } @Override public String getVersion() { return "$Revision: 1173289 $"; } @Override public String getSourceId() { return "$Id: QueryComponent.java 1173289 2011-09-20 18:18:55Z mvg $"; } @Override public String getSource() { return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene_solr_3_5/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java $"; } @Override public URL[] getDocs() { return null; } }