package com.alimama.quanjingmonitor.mdrillImport.monitor;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import com.alimama.mdrill.jdbc.MdrillQueryResultSet;
import com.taobao.tddl.tddl_sample.atom.AtomDataSourceDao.ConfigInfo;
public class PidStat {
public static void main(String[] args) {
System.out.println("2300".compareTo("2259"));
}
private String start;
private String end;
private String[] dayList;
private double[] p4pprice;
private double[] p4pclick;
private double[] aclick;
private double[] apv;
private double[] p4ppv;
private double[] p4pctr;
public static String print(ArrayList<PidStat> listraw, PidInfo info,ConfigInfo cinfo)
{
if(cinfo!=null&&cinfo.isIsnotsend())
{
return "";
}
ArrayList<PidStat> list=new ArrayList<PidStat>();
for( PidStat p:listraw)
{
if(p.start.compareTo("2259")>=0||p.start.compareTo("0101")<=0)
{
continue;
}
list.add(p);
}
StringBuffer buff =new StringBuffer();
int index=0;
int maxsize=3;
int size=list.size();
int rowspan=Math.max(Math.min(size, maxsize), 0);
for(int i=0;i<list.size();i++)
{
if(index>=maxsize)
{
break;
}
buff.append(list.get(i).print(info,index,rowspan,size,cinfo));
index++;
}
return buff.toString();
}
public String arrayToString(String[] d,String joinchar)
{
StringBuffer buff=new StringBuffer();
String join ="";
for(Object s:d)
{
buff.append(join).append(s);
join=joinchar;
}
return buff.toString();
}
public String arrayToString(double[] d,String joinchar,String f)
{
DecimalFormat format=new DecimalFormat(f);
StringBuffer buff=new StringBuffer();
String join ="";
for(double s:d)
{
buff.append(join).append(format.format(s));
join=joinchar;
}
return buff.toString();
}
public String printIsOver(double overrate,double[] d,String joinchar,String format)
{
boolean isover=this.isover(overrate, d,false);
if(isover)
{
return "<font color='red'>"+arrayToString(d,joinchar,format)+"</font>";
}
return arrayToString(d,joinchar,format);
}
public String print(PidInfo info,int index,int span,int size,ConfigInfo cinfo) {
String rowspan="<td rowspan='"+span+"'>" + info.pid+"(共"+size+"条)"+(cinfo==null?"":"<br>"+cinfo.getMessage())+ "</td>";
if(index>0)
{
rowspan="";
}
return "<tr>"+rowspan+"<td>"+start+ "</td><td>" + end + "</td><td>" + info.pidname+ "</td><td>" + info.overrate
+ "</td><td>" + arrayToString(dayList,"<br>") + "</td>" +
"<td>"+printIsOver(info.overrate,this.p4pprice,"<br>","0") + "</td>" +
"<td>"+printIsOver(info.overrate,this.p4pclick,"<br>","0") + "</td>" +
"<td>"+printIsOver(info.overrate,this.p4ppv,"<br>","0") + "</td><td>"+printIsOver(info.overrate,this.p4pctr,"<br>","0.00") + "</td></tr>";
}
public String printlog(PidInfo info) {
return start + "\t" + end + "\t" + info.pid + "\t" + info.pidname+ "\t" + info.overrate
+ "\t" + arrayToString(dayList,",") + "\t"
+ arrayToString(p4pprice,",","0")+"\t"+isover(info.overrate,this.p4pprice,false) + "\t"
+ arrayToString(p4pclick,",","0")+"\t"+isover(info.overrate,this.p4pclick,false) + "\t"
+ arrayToString(aclick,",","0")+"\t"+isover(info.overrate,this.aclick,false) + "\t"
+ arrayToString(apv,",","0")+"\t"+isover(info.overrate,this.apv,false)
+ "\t" + arrayToString(p4ppv,",","0")+"\t"+isover(info.overrate,this.p4ppv,false)+ "\t" + arrayToString(p4pctr,",","0.00")+"\t"+isover(info.overrate,this.p4pctr,false) +"\t"+this.hasValueOverMinPrice()+ "";
}
public static PidStat read(DataInputStream input) throws IOException
{
PidStat rtn=new PidStat();
rtn.start=input.readUTF();
rtn.end=input.readUTF();
int size=input.readInt();
rtn.dayList=readString(input, size);
rtn.p4pprice=readDouble(input, size);
rtn.p4pclick=readDouble(input, size);
rtn.aclick=readDouble(input, size);
rtn.apv=readDouble(input, size);
rtn.p4ppv=readDouble(input, size);
rtn.p4pctr=readDouble(input, size);
return rtn;
}
public static void write(DataOutputStream output,PidStat s) throws IOException
{
output.writeUTF(s.start);
output.writeUTF(s.end);
int size=s.dayList.length;
output.writeInt(size);
writeString(output, size, s.dayList);
writeDouble(output, size, s.p4pprice);
writeDouble(output, size, s.p4pclick);
writeDouble(output, size, s.aclick);
writeDouble(output, size, s.apv);
writeDouble(output, size, s.p4ppv);
writeDouble(output, size, s.p4pctr);
}
public static void writeString(DataOutputStream output, int size,String[] s) throws IOException
{
for(int i=0;i<size;i++)
{
output.writeUTF(s[i]);
}
}
public static void writeDouble(DataOutputStream output, int size,double[] s) throws IOException
{
for(int i=0;i<size;i++)
{
output.writeDouble(s[i]);
}
}
public static double[] readDouble(DataInputStream input,int size) throws IOException
{
double[] rtn=new double[size];
for(int i=0;i<size;i++)
{
rtn[i]=input.readDouble();
}
return rtn;
}
public static String[] readString(DataInputStream input,int size) throws IOException
{
String[] rtn=new String[size];
for(int i=0;i<size;i++)
{
rtn[i]=input.readUTF();
}
return rtn;
}
public void makectr()
{
this.p4pctr=new double[this.dayList.length];
for(int i=0;i<this.dayList.length;i++)
{
this.p4pctr[i]=0;
if(this.p4ppv[i]>0&&this.p4ppv[i]>this.p4pclick[i])
{
this.p4pctr[i]=this.p4pclick[i]*100/this.p4ppv[i];
}
}
}
public boolean hasValueOverMinPrice()
{
boolean isalllessthen=isDiffLessThen( 100d*100,this.p4pprice);
return !isalllessthen;
}
public boolean isover(PidInfo info,boolean onlyreduce)
{
if(isover(info.overrate,this.p4pprice,onlyreduce))
{
return true;
}
if(isover(info.overrate,this.p4pclick,onlyreduce))
{
return true;
}
if(isover(info.overrate,this.p4pctr,onlyreduce))
{
return true;
}
if(isover(info.overrate,this.p4ppv,onlyreduce))
{
return true;
}
return false;
}
public boolean isAllLessThen(double minvalue,double[] d)
{
for(int i=0;i<d.length;i++)
{
if(d[i]<minvalue)
{
continue;
}
return false;
}
return true;
}
public boolean isDiffLessThen(double minvalue,double[] d)
{
double base=d[0];
for(int i=1;i<d.length;i++)
{
double diff=Math.abs(base-d[i]);
if(diff<minvalue)
{
continue;
}
return false;
}
return true;
}
public boolean isover(double overrate,double[] d,boolean onlyreduce)
{
double base=d[0];
boolean isset=false;
for(int i=1;i<d.length;i++)
{
if(d[i]<=0.0000001)
{
continue;
}
isset=true;
double diff=Math.abs(base-d[i])/(0.0001+d[i]);
double diff2=Math.abs(base-d[i])/(0.0001+base);
if(diff<overrate&&diff2<overrate)
{
return false;
}
if(onlyreduce&&base>d[i])
{
return false;
}
}
return isset;
}
public static HashMap<String,PidStat> request(long ts,HashMap<String,PidInfo> pidinfo,ArrayList<String> pidlist) throws SQLException, ClassNotFoundException
{
Class.forName("com.alimama.mdrill.jdbc.MdrillDriver");
HashMap<String,PidStat> rtn=new HashMap<String, PidStat>();
String[] dayList={
monitorUtils.formatDay.format(new Date(ts-1000l*monitorUtils.delaymin))
,monitorUtils.formatDay.format(new Date(ts-1000l*monitorUtils.delaymin-1000l*3600*24*1))
,monitorUtils.formatDay.format(new Date(ts-1000l*monitorUtils.delaymin-1000l*3600*24*2))
,monitorUtils.formatDay.format(new Date(ts-1000l*monitorUtils.delaymin-1000l*3600*24*3))
,monitorUtils.formatDay.format(new Date(ts-1000l*monitorUtils.delaymin-1000l*3600*24*7))
};
HashMap<String,Integer> dayIndex=new HashMap<String, Integer>();
for(int i=0;i<dayList.length;i++)
{
dayIndex.put(dayList[i], i);
}
String start=monitorUtils.formatMin.format(new Date(ts-1000l*monitorUtils.delaymin-1000l*3600));
String end=monitorUtils.formatMin.format(new Date(ts-1000l*monitorUtils.delaymin));
String minfilter="miniute_5>='"+start+"' and miniute_5<='"+end+"'";
if(start.compareTo(end)>=0)
{
minfilter=" ((miniute_5>='"+start+"' and miniute_5<='2359') or (miniute_5<='"+end+"' and miniute_5>='0000') )";
}
StringBuffer pidliststr=new StringBuffer();
String join="";
for(String pid:pidlist)
{
pidliststr.append(join).append("'"+pid+"'");
join=",";
}
String sql="select " +
" thedate,pid,sum(p4pprice) as p4pprice,sum(p4pclick) as p4pclick,sum(aclick) as aclick,sum(apv) as apv,sum(p4ppv) as p4ppv " +
" from rpt_quanjing_p4p_k2_realtime where thedate in ('"+dayList[0]+"','"+dayList[1]+"','"+dayList[2]+"','"+dayList[3]+"','"+dayList[4]+"') " +
" and pid in ("+pidliststr+") and "+minfilter+" group by thedate,pid limit 0,8000 ";
Connection con = DriverManager.getConnection("jdbc:mdrill://adhoc7.kgb.cm6:9999", "", "");
Statement stmt = con.createStatement();
MdrillQueryResultSet res = null;
res = (MdrillQueryResultSet) stmt.executeQuery(sql);
while (res.next()) {
String thedate=res.getString("thedate");
String pid=res.getString("pid");
int index=dayIndex.get(thedate);
PidStat stat=rtn.get(pid);
if(stat==null)
{
stat=new PidStat();
stat.start=start;
stat.end=end;
stat.dayList=dayList;
stat.p4pprice=new double[dayList.length];
stat.p4pclick=new double[dayList.length];
stat.apv=new double[dayList.length];
stat.p4ppv=new double[dayList.length];
stat.aclick=new double[dayList.length];
rtn.put(pid, stat);
}
stat.p4pprice[index]=Double.parseDouble(res.getString("p4pprice"));
stat.p4pclick[index]=Double.parseDouble(res.getString("p4pclick"));
stat.apv[index]=Double.parseDouble(res.getString("apv"));
stat.p4ppv[index]=Double.parseDouble(res.getString("p4ppv"));
stat.aclick[index]=Double.parseDouble(res.getString("p4pprice"));
}
con.close();
return rtn;
}
}