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) {
}
}