Package com.alimama.mdrill.partion.thedate

Source Code of com.alimama.mdrill.partion.thedate.ThedatePartions

package com.alimama.mdrill.partion.thedate;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Map.Entry;

import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.solr.common.SolrInputDocument;


import com.alimama.mdrill.index.utils.JobIndexPublic;
import com.alimama.mdrill.json.JSONArray;
import com.alimama.mdrill.json.JSONException;
import com.alimama.mdrill.json.JSONObject;
import com.alimama.mdrill.partion.MdrillPartions;
import com.alimama.mdrill.partion.MdrillPartionsInterface;
import com.alimama.mdrill.partion.StatListenerInterface;
import com.alimama.mdrill.ui.service.utils.OperateType;
import com.alimama.mdrill.ui.service.utils.WebServiceParams;

public class ThedatePartions implements MdrillPartionsInterface{
  private String parttype="default";
  public void setPartionType(String parttype)
  {
    this.parttype=parttype;
  }
 
  private SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");

  public String InsertPartion(SolrInputDocument docthrows Exception{
    String thedate=String.valueOf(doc.getFieldValue("thedate"));
    return ThedatePartionsUtils.parseDay(thedate, this.parttype);
  }

 
  @Override
  public String[] SqlPartions(String queryStr) throws Exception {

    HashSet<String> rtn = new HashSet<String>();
    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());
        OperateType optype=WebServiceParams.parseOperateType(operate);

        String[] val = WebServiceParams.parseFqValue(thedate.getString("value"), operate).split(",");
        if (optype.equals(OperateType.eq)||optype.equals(OperateType.in))
        {
          for (String day : val) {
            Date d = fmt.parse(day.replaceAll("-", ""));
            String[] partions = get(d.getTime(), d.getTime(), parttype);
            for (String partion : partions) {
              rtn.add(partion);
              isset = true;
            }
          }
        }
        if (optype.equals(OperateType.range))// =,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 (optype.equals(OperateType.gt)||optype.equals(OperateType.gteq))
        {
          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 (optype.equals(OperateType.lg)||optype.equals(OperateType.lgeq))
        {
          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*30;
    Long max = 0l;
    Long initDate = (new Date()).getTime();
    max = initDate;
    Long min = initDate - step;
    return get(min, max, parttype);
  }
 
  public String SqlFilter(String queryStr) throws Exception
  {
    return queryStr;
//    JSONArray rtn = new JSONArray();
//    JSONArray jsonStr = new JSONArray(queryStr.trim());
//
//    for (int j = 0; j < jsonStr.length(); j++) {
//      JSONObject obj = jsonStr.getJSONObject(j);
//      if (!obj.has("thedate")) {
//        rtn.put(obj);
//      }
//    }
//    return rtn.toString();
   }
 
  private 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);
    }

 
  public StatListenerInterface getStatObj() throws Exception {
    StatListenerInterface rtn=new ThedateListener();
    rtn.setPartionType(this.parttype);
    rtn.init();
    return rtn;
  }
 
 
  private String getToday()
  {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    return fmt.format(new Date());
  }


  private String getMonth(String str) {
    return str.substring(0, 6);
  }

  private Date transDay(String str) throws ParseException {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    return fmt.parse(str);
  }
 
 
 

  private String DatePlus(String str, int day) throws ParseException {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    Date d = fmt.parse(str);
    Date pd = new Date();
    pd.setTime(d.getTime() - 1000l * 3600 * 24 * day);
    return fmt.format(pd);
  }
  private String getStartDay( int delay,int maxRunDays, String starday) throws ParseException
  {
    String minday = this.DatePlus(this.getToday(), maxRunDays+delay);
    Date min = this.transDay(minday);
    Date start = this.transDay(starday);
    if(min.compareTo(start)>=0)
    {
      return minday;
    }
   
    return starday;
  }
 
 
 

 
  private HashSet<String> getNameList(FileSystem fs, String inputBase,
      String startPoint) throws IOException, ParseException {
    HashSet<String> rtn = new HashSet<String>();
    Date start = this.transDay(startPoint);
    FileStatus[] list = fs.listStatus(new Path(inputBase));
    if (list != null) {
      for (FileStatus f : list) {
        String name = f.getPath().getName().trim();
        name = JobIndexPublic.parseThedate(name);
        if (name != null &&!name.isEmpty()&& this.transDay(name).compareTo(start) >= 0) {
          rtn.add(name);
        }
      }
    }

    return rtn;
  }
 

 
  public HashSet<String> getNameList(FileSystem fs,String inputBase,String startday,int dayDelay, int maxRunDays) throws Exception{
    String startyyyymmddd=this.getStartDay(dayDelay, maxRunDays, startday);
    return getNameList(fs,inputBase,startyyyymmddd);
  }
  public HashMap<String,HashSet<String>> indexPartions(HashSet<String> namelist,String startday,int dayDelay, int maxRunDays) throws Exception{
    return ThedatePartionsUtils.parseDays(namelist,this.parttype);
  }
 
  public String getUpdateFinishDay( int delay,String starday) throws ParseException
  {
    String minday = this.DatePlus(this.getToday(),delay);
    Date min = this.transDay(minday);
    Date start = this.transDay(starday);

    if(min.compareTo(start)>=0)
    {
      return minday;
    }
   
    return starday;
  }
 
  public HashMap<String,String> indexVertify(HashMap<String,HashSet<String>> partions,int shards,String startday,int dayDelay, int maxRunDays) throws Exception{
    String upFinishyyyymmdd=this.getUpdateFinishDay(dayDelay,startday);

    HashMap<String,String> rtn=new HashMap<String,String>();
    for(Entry<String,HashSet<String>> e:partions.entrySet())
    {
      String partion=e.getKey();
      HashSet<String> days=e.getValue();
      boolean writeDay=false;
      for(String day:days)
      {
        if(day.compareTo(upFinishyyyymmdd)>=0)
        {
          writeDay=true;
          break;
        }
      }
     
      String partionvertify = "partionV"+MdrillPartions.PARTION_VERSION+"@001@"+partion + "@" + shards + "@"+ days.size()+"@"+days.hashCode();
      if(writeDay)
      {
        partionvertify+="@"+this.getToday()+"@"+upFinishyyyymmdd;
      }
     
      rtn.put(partion, partionvertify);
     
    }
   
    return rtn;
  }


  @Override
  public String getDropComparePartion(long days) throws Exception {
    if(days<=0)
    {
      return null;
    }
    long dayms=1000l*3600*24;
    int index=0;
    while(true)
    {
      long before=System.currentTimeMillis()-(days+index)*dayms;
     
      long prev=System.currentTimeMillis()-(days+index)*dayms+dayms;
     
      String day=fmt.format(new Date(before));
      String prevday=fmt.format(new Date(prev));
     
      String p1=ThedatePartionsUtils.parseDay(day, this.parttype);
      String pprev=ThedatePartionsUtils.parseDay(prevday, this.parttype);
     
      if(!pprev.equals(p1))
      {
        return p1;
      }
   
      index++;
    }
   
//    private SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");

  }


  @Override
  public boolean isAllowDropPartion(String partion, String cmp)
      throws Exception {
    if(cmp==null||partion==null)
    {
      return false;
    }
   
    return cmp.compareTo(partion)>=0;
  }

 
 
  
  
 
}
TOP

Related Classes of com.alimama.mdrill.partion.thedate.ThedatePartions

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.