Package org.apache.solr.request.join

Source Code of org.apache.solr.request.join.HigoJoinInvert

package org.apache.solr.request.join;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;

import org.apache.log4j.Logger;
import org.apache.lucene.index.SegmentReader;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.mdrill.GroupListCache;
import org.apache.solr.request.mdrill.MdrillUtils.TermNumToString;
import org.apache.solr.request.mdrill.MdrillUtils.UnvertFields;
import org.apache.solr.request.mdrill.MdrillUtils.UnvertFile;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.search.DocSet;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.RefCounted;

import com.alimama.mdrill.utils.TryLockFile;


public class HigoJoinInvert {
  private static Logger LOG = Logger.getLogger(HigoJoinInvert.class);

  private String tableName;

  private LinkedBlockingQueue<GroupListCache.GroupList> groupListCache;

 
  public HigoJoinInvert(String tableName, SegmentReader reader,String partion,IndexSchema schema) {
    super();
    this.tableName = tableName;
    this.partion=partion;
    this.schema=schema;
    this.leftreader=reader;
  }
 
  private SegmentReader leftreader=null;
  private String partion;
  private IndexSchema schema;

  private RefCounted<SolrIndexSearcher> search=null;
  private HigoJoinInterface join;
  private DocSet docset;
  private String[] fields;
  private UnvertFields ufsRight;
  private TermNumToString[] tmRigth;
  public void open(SolrQueryRequest req) throws IOException, ParseException
  {
      this.search=HigoJoinUtils.getSearch(req, this.tableName);
      this.fields = req.getParams().getParams(HigoJoinUtils.getFields(this.tableName));
      List<Query> fqlist=HigoJoinUtils.getFilterQuery(req, this.tableName);
      LOG.info("##fqlist.size()##"+fqlist.size());
      this.docset=this.search.get().getDocSet(fqlist);
      LOG.info("##joinright##"+this.docset.size());
      String fieldLeft=req.getParams().get(HigoJoinUtils.getLeftField(this.tableName));
      String fieldRigth=req.getParams().get(HigoJoinUtils.getRightField(this.tableName));
      this.ufsRight=new UnvertFields(this.docset,fields, this.search.get());
 
      this.join=HigoJoin.getJoin(this.leftreader,this.partion,this.schema, search.get(), fieldLeft, fieldRigth);

     
      this.tmRigth=new TermNumToString[this.ufsRight.length];
      for(int i=0;i<this.ufsRight.length;i++)
       {
        tmRigth[i]=new TermNumToString(this.ufsRight,i);
       }
      groupListCache=GroupListCache.getGroupListQueue(ufsRight.length);
   
  }
 
  public LinkedBlockingQueue<GroupListCache.GroupList> getGroupListCache() {
    return groupListCache;
  }

  public DocSet filterByRight(DocSet leftDocs)
  {
    return this.join.filterByRight(leftDocs, this.docset);
  }
 
  public void setfieldNum(String[] values,int offset,GroupListCache.GroupList group)
  {
    UnvertFields ufs=ufsRight;
    for (int i:ufs.listIndex) {
      UnvertFile uf=ufs.cols[i];
      int off=i+offset;
      if(off<group.list.length)
      {
        try {
          group.list[off]=uf.uif.getTermNum(uf.ti,values[off],uf.filetype);
        } catch (Throwable e) {
          LOG.error("setfieldNum",e);
          group.list[off]=uf.uif.getNullTm();
        }
      }
    }
  }
 
  public boolean contains(int doc) throws IOException
  {
//    int termNum=this.uifleft.termNum(doc);
    Integer doclist=this.join.getRight(doc, -1);
    if(doclist==null)
    {
      return false;
    }
   
    if(this.docset.exists(doclist))
    {
      return true;
    }
   
    return false;
  }
 
  public Integer fieldNumForSort(int doc,int offset) throws IOException
  {
//    int termNum=this.uifleft.termNum(doc);
    Integer doclist=this.join.getRight(doc, -1);
    if(doclist==null)
    {
      return ufsRight.cols[offset].uif.getNullTm();
    }
   
    if(!this.docset.exists(doclist))
    {
      return ufsRight.cols[offset].uif.getNullTm();
    }
    UnvertFile uf=ufsRight.cols[offset];
    return uf.uif.termNum(doclist);
  }
 
 
 
  public boolean fieldNum(int doc,int offset,GroupListCache.GroupList base,LinkedBlockingQueue<GroupListCache.GroupList> cache) throws IOException
  {
    Integer doclist=this.join.getRight(doc, -1);
    if(doclist==null)
    {
      return false;
    }
   
    if(!this.docset.exists(doclist))
    {
      return false;

    }
 
    int rightdocid=doclist;
    for (int j:ufsRight.listIndex) {
      UnvertFile uf=ufsRight.cols[j];
      base.list[j+offset]=uf.uif.termNum(rightdocid);
    }
    return true;
 
 
  }
 
  public boolean fieldNum(int doc,GroupListCache.GroupList base) throws IOException
  {
     return this.fieldNum(doc, 0, base,this.groupListCache);
  }
 
  public int fieldCount()
  {
    return ufsRight.length;
  }
 
 
  public void addTermNum(int termNum,int i) throws IOException
  {
    this.tmRigth[i].addTermNum(termNum);
  }
 
  public void fetchValues() throws IOException
  {
     for(int i=0;i<tmRigth.length;i++)
     {
       tmRigth[i].fetchValues();
     }
  }
 
  public String getTermNumValue(int termNum,int i)
  {
    return tmRigth[i].getTermValue(termNum);
  }

 
  public void close()
  {
   
    GroupListCache.cleanFieldValueCache(this.fieldCount());
    if(this.ufsRight!=null)
    {
      this.ufsRight.free();
      this.ufsRight=null;
    }
    if(search!=null)
    {
      search.decref();
      search=null;
    }
  }
}
TOP

Related Classes of org.apache.solr.request.join.HigoJoinInvert

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.