package org.apache.solr.request.mdrill;
import java.util.WeakHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.log4j.Logger;
import com.alimama.mdrill.utils.UniqConfig;
public class GroupListCache {
private static Logger LOG = Logger.getLogger(GroupListCache.class);
public static class GroupList {
public int[] list;
private GroupList(int size) {
list = new int[size];
}
public void reset() {
for (int i = 0; i < list.length; i++) {
list[i] = -1;
}
}
public static GroupList INSTANCE(LinkedBlockingQueue<GroupList> free,int size) {
GroupList rtn = free.poll();
if (rtn == null) {
rtn = new GroupList(size);
} else {
if (rtn.list.length != size) {
rtn = new GroupList(size);
}
}
return rtn;
}
public GroupList copy(LinkedBlockingQueue<GroupList> free) {
GroupList rtn = INSTANCE(free, this.list.length);
for (int i = 0; i < this.list.length; i++) {
rtn.list[i] = this.list[i];
}
return rtn;
}
@Override
public int hashCode() {
int result = 1;
for (int element : this.list) {
result = 31 * result + element;
}
return result;
}
@Override
public boolean equals(Object obj) {
GroupList other = (GroupList) obj;
for (int i = 0; i < this.list.length; i++) {
if (this.list[i] != other.list[i]) {
return false;
}
}
return true;
}
}
private static WeakHashMap<Integer, LinkedBlockingQueue<GroupListCache.GroupList>> fieldValueCache = new WeakHashMap<Integer, LinkedBlockingQueue<GroupListCache.GroupList>>();
public static synchronized LinkedBlockingQueue<GroupListCache.GroupList> getGroupListQueue(int size)
{
LinkedBlockingQueue<GroupListCache.GroupList> rtn=fieldValueCache.get(size);
if(rtn==null)
{
rtn=new LinkedBlockingQueue<GroupListCache.GroupList>();
fieldValueCache.put(size, rtn);
}
return rtn;
}
public static void cleanFieldValueCache(int size)
{
LinkedBlockingQueue<GroupListCache.GroupList> rtn=fieldValueCache.get(size);
if(rtn==null)
{
return ;
}
MdrillUtils.LOG.info("fieldValueCache.size="+rtn.size()+",size="+size);
int sz=Math.min(UniqConfig.ShardMaxGroups(), 640000);
if(rtn.size()>sz)
{
int left=rtn.size()-sz+1;
for(int i=0;i<left;i++)
{
rtn.poll();
}
}
}
}