package com.alimama.mdrill.ui.service.partions; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import com.alimama.mdrill.json.JSONArray; import com.alimama.mdrill.json.JSONException; import com.alimama.mdrill.json.JSONObject; import com.alimama.mdrill.partion.thedate.ThedatePartionsUtils; import com.alimama.mdrill.ui.service.utils.WebServiceParams; public class AdhocHivePartions { public static class KmeansQueryParse{ public String[] days; public String queryStr; public String[] getSortDays() { Arrays.sort(days); String[] rtn=new String[days.length]; for(int i=0;i<rtn.length;i++) { rtn[i]=days[days.length-(i+1)]; } return rtn; } } public static KmeansQueryParse getKmeansDays(String queryStr) throws Exception { HashSet<String> rtn=new HashSet<String>(); SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); boolean isset=false; Long small=-1l; Long bigger=-1l; JSONArray jsonStr=new JSONArray(queryStr.trim()); JSONArray jsonStr_new=new JSONArray(); for(int j=0;j<jsonStr.length();j++) { JSONObject obj=jsonStr.getJSONObject(j); if(!obj.has("thedate")) { jsonStr_new.put(obj); continue; } } for(int j=0;j<jsonStr.length();j++) { JSONObject obj=jsonStr.getJSONObject(j); if(!obj.has("thedate")) { continue; } JSONObject thedate=obj.getJSONObject("thedate"); Integer operate=Integer.parseInt(thedate.get("operate").toString()); String[] val=WebServiceParams.parseFqValue(thedate.getString("value"), operate).split(","); if(operate==1 ||operate==5||operate==6||operate==7||operate==8||operate==9)//=,range { Long min=Long.MAX_VALUE; Long max=Long.MIN_VALUE; for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime(); max=Math.max(max, time); min=Math.min(min, time); isset=true; } String[] days=getKmeans(min, max); for(String day:days) { rtn.add(day); } break; } if(operate==13||operate==3)//<,<= { for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime()+(operate==3?0:1); small=small>0?Math.min(small, time):time; } } if(operate==14||operate==4)//>,>= { for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime()-(operate==4?0:1); bigger=bigger>0?Math.max(bigger, time):time; } } if(bigger>0&&small>0) { isset=true; String[] days=getKmeans(small, bigger); for(String day:days) { rtn.add(day); } small=Long.MAX_VALUE; bigger=Long.MIN_VALUE; break; } } if(!isset) { throw new Exception("no thedate"); } String[] rtnarr=new String[rtn.size()]; KmeansQueryParse kmeans=new KmeansQueryParse(); kmeans.days=rtn.toArray(rtnarr); kmeans.queryStr=jsonStr_new.toString(); return kmeans; } public static String[] get(String queryStr,String parttype) throws JSONException, ParseException { HashSet<String> rtn=new HashSet<String>(); SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); boolean isset=false; Long small=-1l; Long bigger=-1l; JSONArray jsonStr=new JSONArray(queryStr.trim()); for(int j=0;j<jsonStr.length();j++) { JSONObject obj=jsonStr.getJSONObject(j); if(obj.has("thedate")) { JSONObject thedate=obj.getJSONObject("thedate"); Integer operate=Integer.parseInt(thedate.get("operate").toString()); String[] val=WebServiceParams.parseFqValue(thedate.getString("value"), operate).split(","); if(operate==1 ||operate==5||operate==6||operate==7||operate==8||operate==9)//=,range { Long min=Long.MAX_VALUE; Long max=Long.MIN_VALUE; for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime(); max=Math.max(max, time); min=Math.min(min, time); isset=true; } String[] partions=get(min, max, parttype); for(String partion:partions) { rtn.add(partion); } break; } if(operate==13||operate==3)//<,<= { for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime()+(operate==3?0:1); small=small>0?Math.min(small, time):time; } } if(operate==14||operate==4)//>,>= { for(String day:val) { Date d=fmt.parse(day.replaceAll("-", "")); Long time=d.getTime()-(operate==4?0:1); bigger=bigger>0?Math.max(bigger, time):time; } } if(bigger>0&&small>0) { isset=true; String[] partions=get(small, bigger, parttype); for(String partion:partions) { rtn.add(partion); } small=Long.MAX_VALUE; bigger=Long.MIN_VALUE; break; } } } if(isset) { String[] rtnarr=new String[rtn.size()]; return rtn.toArray(rtnarr); } Long step=1000l*3600*24; Long max=0l; Long initDate=(new Date()).getTime(); max=initDate; Long min=initDate-step; return get(min, max, parttype); } private static String[] getKmeans(Long min,Long max) throws JSONException, ParseException { Long step=1000l*3600*24; Long start=min; HashSet<String> list=new HashSet<String>(); SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); while(start<=max) { list.add(fmt.format(new Date(start))); start+=step; } String[] rtnarr=new String[list.size()]; return list.toArray(rtnarr); } private static String[] get(Long min,Long max,String parttype) throws JSONException, ParseException { Long step=1000l*3600*24; Long start=min; HashSet<String> list=new HashSet<String>(); SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); while(start<=max) { list.add(fmt.format(new Date(start))); start+=step; } HashMap<String,HashSet<String>> rtn=ThedatePartionsUtils.parseDays(list,parttype); Set<String> ks=rtn.keySet(); String[] rtnarr=new String[ks.size()]; return ks.toArray(rtnarr); } }