Package org.apache.solr.request.compare

Source Code of org.apache.solr.request.compare.RecordCount

package org.apache.solr.request.compare;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.zip.CRC32;

/**
* groupby 分页的总记录数实现
* @author yannian.mu
*/
public class RecordCount implements GroupbyItem{
  private HashSet<ArrayList<Integer>> uniq=new HashSet<ArrayList<Integer>>();
  private boolean isFinalResult=false;
  private Integer maxUniqSize=Integer.MAX_VALUE;
  private boolean isoversize=false;
  public RecordCount() {}
  public RecordCount(ArrayList<Object> nst)
  {
    try{
    String oversize=(String) nst.get(0);
    this.isoversize="yes".equals(oversize);
    this.maxUniqSize=(Integer) nst.get(2);
    this.uniq.addAll((Collection<? extends ArrayList<Integer>>) nst.get(3));
    }catch(Throwable e){}
  }
 
  public void shardsMerge(GroupbyItem g)
  { 
    RecordCount o=(RecordCount)g;
    if(o.isoversize)
    {
      this.isoversize=true;
    }
   
    if(this.maxUniqSize>o.maxUniqSize)
    {
      this.maxUniqSize=o.maxUniqSize;
    }
   
    this.mergeUniq(o);
  }
 
  private void mergeUniq(RecordCount o)
  {
    if(!this.isoversize)
    {
      int index=0;
      for(ArrayList<Integer> s:o.uniq)
      {
        this.uniq.add(s);
        if(index%100==0&&this.uniq.size()>this.maxUniqSize)
        {
          this.isoversize=true;
          break;
        }
        index++;
      }
    }
   
    if(this.isoversize)
    {
      this.isoversize=true;
      this.uniq.clear();
    }
  }
 
  public boolean isFinalResult() {
    return isFinalResult;
  }

  public void setFinalResult(boolean isFinalResult) {
    this.isFinalResult = isFinalResult;
  }
 
  public Integer getMaxUniqSize() {
    return maxUniqSize;
  }

  public void setMaxUniqSize(Integer maxUniqSize) {
    this.maxUniqSize = maxUniqSize;
  }
 
  public void setCrcRecord(String newparentGroup)
  {
    int len = newparentGroup.length();
    CRC32 crc32 = new CRC32();
    crc32.update(new String(newparentGroup).getBytes());
    int crcvalue = (int) crc32.getValue();
    int hashCode = newparentGroup.hashCode();
   
    ArrayList<Integer> key=new ArrayList<Integer>(3);
    key.add(crcvalue);
    key.add(len);
    key.add(hashCode);
    this.adduniq(key);
  }
 
  private void adduniq(ArrayList<Integer> key)
  {
    if(this.isoversize)
    {
      return ;
    }
   
    this.uniq.add(key);
    if(this.uniq.size()>getMaxUniqSize())
    {
      this.uniq.clear();
      this.isoversize=true;
    }
  }
 
 
  public void setIsoversize(boolean isoversize) {
    this.isoversize = isoversize;
  }

 
 
  public ArrayList<Object> toNamedList()
  {
    ArrayList<Object> rtn=new ArrayList<Object>();
    rtn.add(0, this.isoversize?"yes":"no");//"key"
    rtn.add(1, 0);//顺序不能乱改
    rtn.add(2, maxUniqSize);
    rtn.add(3, this.uniq);
   
    return rtn;
  }
 

  public String getKey() {
    return "recordcount";
  }
 
  public boolean isrecordcount(){
    return true;
  }


 
  public Long getValue() {
    return (long) (this.isoversize?this.maxUniqSize:this.uniq.size());
  }
  @Override
  public void setCross(String[] crossFs, String[] distFS) {
   
  }
 
 

}
TOP

Related Classes of org.apache.solr.request.compare.RecordCount

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.