content: package org.apache.solr.request.mdrill;
  
  import java.io.IOException;
  import java.util.Collections;
  import java.util.PriorityQueue;
  
  import org.apache.lucene.index.SegmentReader;
  import org.apache.lucene.queryParser.ParseException;
  import org.apache.solr.common.params.FacetParams;
  import org.apache.solr.common.params.SolrParams;
  import org.apache.solr.request.SolrQueryRequest;
  import org.apache.solr.request.compare.SelectDetailRow;
  import org.apache.solr.request.compare.ShardDetailSelectDetailRowCompare;
  import org.apache.solr.request.compare.ShardDetailSelectDetailRowStringCompare;
  import org.apache.solr.request.compare.UniqTypeNum;
  import org.apache.solr.request.join.HigoJoinInvert;
  import org.apache.solr.request.join.HigoJoinSort;
  import org.apache.solr.request.join.HigoJoinUtils;
  import org.apache.solr.request.mdrill.MdrillUtils.UnvertFields;
  import org.apache.solr.request.mdrill.MdrillUtils.UnvertFile;
  import org.apache.solr.request.uninverted.UnInvertedField;
  import org.apache.solr.search.DocSet;
  import org.apache.solr.search.SolrIndexSearcher;
  
  public class MdrillParseDetail {
  	public int offset ;
  	public String sort_fl;
  	public boolean isNeedSort=true;
  	public int limit_offset=0;
  	public String[] joinList ;
  	public boolean isdesc;
  	public String sort_column_type;
  	
  	public String crcOutputSet=null;
  	public MdrillParseDetail(SolrParams params)
  	{
  		this.joinList=params.getParams(HigoJoinUtils.getTables());
  		if(this.joinList==null)
  		{
  			this.joinList= new String[0];
  		}
  		this.offset = params.getInt(FacetParams.FACET_CROSS_OFFSET, 0);
  		int limit = params.getInt(FacetParams.FACET_CROSS_LIMIT, 100);
  		this.limit_offset=this.offset+limit;
  		this.sort_fl=params.get(FacetParams.FACET_CROSS_SORT_FL,null);
  		
  		if(this.sort_fl==null||this.sort_fl.isEmpty())
  		{
  			this.sort_fl="higoempty_sort_s";
  			this.isNeedSort=false;
  		}
  		this.sort_column_type=params.get("facet.cross.sort.cp");
  		this.isdesc=params.getBool(FacetParams.FACET_CROSS_SORT_ISDESC, true);
  		this.crcOutputSet=params.get("mdrill.crc.key.set");
  
  
  	}
  	public fetchContaioner createContainer(String[] fields, DocSet baseDocs,SegmentReader reader,SolrIndexSearcher searcher,SolrQueryRequest req) throws IOException, ParseException
  	{
  		return new fetchContaioner(this,fields,baseDocs,reader,searcher,req);
  	}
  	public static class fetchContaioner{
  		public ShardDetailSelectDetailRowCompare cmpTermNum;
  		public ShardDetailSelectDetailRowStringCompare cmpresult;
  //		public UnvertFields ufs=null;
  		public UnvertFields sortufs=null;
  		public HigoJoinInvert[] joinInvert={};
  		public UniqTypeNum.SelectDetailSort SelectDetailSort=null;
  		public boolean nonJoins=true;
  		public MdrillParseDetail parse;
  		public PriorityQueue<SelectDetailRow> res;
  		public int groupbySize;
  		
  		HigoJoinInvert invforSortValue=null;
  		int invforSortOffset=0;
  		UnInvertedField columnSortcif=null;
  		public String[] fields;
  		
  		public fetchContaioner(MdrillParseDetail parse,String[] fields, DocSet baseDocs,SegmentReader reader,SolrIndexSearcher searcher,SolrQueryRequest req) throws IOException, ParseException
  		{
  			this.parse=parse;
  			this.fields=fields;
  			sortufs=new UnvertFields(baseDocs,new String[]{parse.sort_fl}, reader,searcher.getPartionKey(),searcher.getSchema(),true);
  			this.joinInvert=new HigoJoinInvert[parse.joinList.length];
  
  			HigoJoinSort[] joinSort=new HigoJoinSort[this.parse.joinList.length];
  
  			for(int i=0;i<this.parse.joinList.length;i++)
  			{
  				joinSort[i]=new HigoJoinSort(this.parse.joinList[i], req);
  				this.joinInvert[i]=new HigoJoinInvert(this.parse.joinList[i], reader,searcher.getPartionKey(),searcher.getSchema());
  
  				this.joinInvert[i].open(req);
  				baseDocs=this.joinInvert[i].filterByRight(baseDocs);
  			}
  			this.SelectDetailSort=UniqTypeNum.parseSelectDetailType(fields, joinSort);
  			this.cmpTermNum=new ShardDetailSelectDetailRowCompare(this.parse.isdesc);
  			if(this.SelectDetailSort!=null)
  			{
  				this.parse.isNeedSort=true;
  				this.cmpresult=new ShardDetailSelectDetailRowStringCompare("string",this.parse.isdesc);
  				this.invforSortOffset=this.SelectDetailSort.selfOffset;
  				this.invforSortValue=this.joinInvert[this.SelectDetailSort.sortIndex];
  
  
  			}else{
  				this.cmpresult=new ShardDetailSelectDetailRowStringCompare(this.parse.sort_column_type,this.parse.isdesc);
  				if(this.isColumnSort())
  				{
  					UnvertFile uf=this.sortufs.cols[0];
  					this.columnSortcif=uf.uif;
  				}
  			}
  			
  			res = new PriorityQueue<SelectDetailRow>(	this.parse.limit_offset, Collections.reverseOrder(cmpTermNum));
  			
  			this.groupbySize=this.fields.length;
  			for(HigoJoinInvert inv:joinInvert)
  			{
  				this.groupbySize+=inv.fieldCount();
  			}
  			this.nonJoins=this.joinInvert.length<=0;
  
  			
  			
  		}
  		
  		public boolean containsInJoins(int doc) throws IOException
  		{
  			if(this.nonJoins)
  			{
  				return true;
  			}
  			
  			for(HigoJoinInvert inv:this.joinInvert)
  			{
  				if(!inv.contains(doc))
  				{
  					return false;
  				}
  			}
  			return true;
  		}
  		
  		public boolean isUseJoinSort()
  		{
  			return this.SelectDetailSort!=null;
  		}
  		
  		public boolean isColumnSort()
  		{
  			return this.parse.isNeedSort&&this.sortufs.listIndex.length>0;
  		}
  		
  		public boolean isOnlyColumnSort()
  		{
  			return this.parse.isNeedSort&&this.SelectDetailSort==null;
  		}
  		
  		public int getJoinCompareValue(int doc) throws IOException
  		{
  			return this.invforSortValue.fieldNumForSort(doc, this.invforSortOffset);
  		}
  		
  		public int getColumnCompareValue(int doc) throws IOException
  		{
  			return columnSortcif.termNum(doc);
  		}
  		
  		public void free()
  		{
  			for(int i=0;i<this.parse.joinList.length;i++)
  			{
  				this.joinInvert[i].close();
  			}
  			sortufs.free();
  			GroupListCache.cleanFieldValueCache(groupbySize);
  			SelectDetailRow.CLEAN();
  		}
  	}
  
  }
  