package com.alimama.mdrill.ui.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import com.alimama.mdrill.json.JSONException;
import com.alimama.mdrill.partion.GetPartions;
import com.alimama.mdrill.partion.MdrillPartions;
import com.alimama.mdrill.partion.MdrillPartionsInterface;
import com.alimama.mdrill.partion.GetPartions.TablePartion;
import com.alimama.mdrill.ui.service.utils.WebServiceParams;
import com.alimama.mdrill.ui.service.utils.WebServiceParams.HigoJoinParams;
import com.alimama.mdrill.ui.service.utils.WebServiceParams.SortParam;
import com.alimama.mdrill.utils.UniqConfig;
public class MdrillRequest {
private static Logger LOG = Logger.getLogger(MdrillRequest.class);
public String queryStr;
public int start;
public int rows;
public ArrayList<String> groupbyFields ;
public ArrayList<String> showFields ;
public HashSet<String> commonStatMap ;
public HashSet<String> distStatFieldMap;
public SortParam sortType;
public String[] partionsAll;
public String leftjoin;
public MdrillRequest(MdrillTableConfig tblconf,TablePartion part,Map stormconf,String projectName,
String startStr, String rowsStr, String queryStr, String dist,
String fl, String groupby, String sort, String order,String leftjoin) throws Exception
{
this.leftjoin=leftjoin;
this.queryStr = WebServiceParams.query(queryStr);
this.start = WebServiceParams.parseStart(startStr);
this.rows = WebServiceParams.parseRows(rowsStr);
this.groupbyFields = WebServiceParams.groupFields(groupby);
this.showFields = WebServiceParams.showFields(fl);
this.commonStatMap = new HashSet<String>();
this.distStatFieldMap = new HashSet<String>();
WebServiceParams.setCrossStatMap(this.showFields,this.commonStatMap,this.distStatFieldMap);
this.sortType = WebServiceParams.sort(sort, order,tblconf.fieldColumntypeMap,this.groupbyFields);
MdrillPartionsInterface drillpart=MdrillPartions.INSTANCE(part.parttype);
this.partionsAll = drillpart.SqlPartions(this.queryStr);
this.queryStr=drillpart.SqlFilter(this.queryStr);
Arrays.sort(partionsAll);
LOG.info("partionsAll:" + MdrillRequestLog.cutString(Arrays.toString(partionsAll)));
}
public HigoJoinParams[] parseJoins(MdrillTableCoreInfo coreinfo,GetPartions.Shards shard) throws Exception
{
return WebServiceParams.parseJoins(leftjoin, shard);
}
public ArrayList<String> parseFq(MdrillTableConfig tblconf,GetPartions.Shards shard) throws JSONException
{
ArrayList<String> fqList = WebServiceParams.fqList(tblconf.isnothedate,this.queryStr, shard,tblconf.fieldColumntypeMap);
if(tblconf.isnothedate&&tblconf.mode.indexOf("@fdt@")<0)
{
fqList.add("-higoempty_emptydoc_s:[* TO *]");
}
return fqList;
}
public static class StartLimit{
public int start;
public int rows;
}
public StartLimit getReqStartEnd()
{
int extandRows=50;
if(this.distStatFieldMap.size()>0)
{
extandRows=20;
}
int minstart = this.start;
int maxEend = this.rows;
if (this.sortType.isStatNum) {
minstart = this.start - extandRows;
if (minstart < 0) {
minstart = 0;
}
maxEend = Math.min(this.rows + extandRows+extandRows,UniqConfig.defaultCrossMaxLimit());
}
StartLimit rtn=new StartLimit();
rtn.start=minstart;
rtn.rows=maxEend;
return rtn;
}
}