package com.alimama.mdrill.ui.service; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.concurrent.atomic.AtomicInteger; import com.alimama.mdrill.json.JSONArray; import com.alimama.mdrill.json.JSONException; import com.alimama.mdrill.json.JSONObject; import com.alimama.mdrill.partion.GetPartions; import com.alimama.mdrill.ui.service.utils.WebServiceParams; import com.alimama.mdrill.ui.service.utils.WebServiceParams.StateField; import com.alimama.web.TableJoin; public class AdhocWebServiceParams { public static class HigoAdhocJoinParams{ public String tablename; public String hdfsPath; public String txtPath; public ArrayList<String> fq; public ArrayList<String> groupfq=new ArrayList<String>(); public String[] fl; public String leftkey; public String rightkey; public String returnPrefix; public String sort; public String createSql=""; public String DropSql=""; public String addData=""; public String frQuer=""; // public Stri } public static HashMap<String,ArrayList<String>> parseFieldToNames(String fl, String groupby, String params,String leftjoin) throws JSONException, SQLException { HashMap<String,ArrayList<String>> fieldToName=new HashMap<String, ArrayList<String>>(); ArrayList<String> groupFields = WebServiceParams.groupFields(groupby); ArrayList<String> showFields = WebServiceParams.showHiveFields(fl); HigoAdhocJoinParams[] joins=AdhocWebServiceParams.parseJoinsHive(leftjoin, null); String daycols=AdhocWebServiceParams.parseDayCols("dt",groupFields,showFields); ArrayList<String> fieldlist=new ArrayList<String>(); if(joins.length<=0) { for (String field : groupFields) { fieldlist.add(field); } for (String field : showFields) { if(!groupFields.contains(field)) { fieldlist.add(field); } } }else { for (String field : groupFields) { fieldlist.add(field); } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(showfield.realField)) { if(!showfield.isstat) { fieldlist.add(field); } } } for(int i=0;i<joins.length;i++) { HigoAdhocJoinParams jp=joins[i]; for (String field : jp.fl) { fieldlist.add(jp.tablename+"."+field); } } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(showfield.realField)) { if(showfield.isstat) { fieldlist.add(field); } } } } ArrayList<String> fieldNamelist=new ArrayList<String>(); String[] pcols = params == null ? new String[0] : new String(daycols + params.replaceAll("维度指标:", "").replaceAll("。.*$", "")) .split(","); for (String s : pcols) { if (!AdhocOfflineService.isStatFields(s)) { fieldNamelist.add(s); } } for (String s : pcols) { if (AdhocOfflineService.isStatFields(s)) { fieldNamelist.add(s); } } fieldToName.put("field", fieldlist); fieldToName.put("namelist", fieldNamelist); return fieldToName; } public static void parseColsNoJoins(StringBuffer cols,ArrayList<String> groupFields,ArrayList<String> showFields,HashMap<String,String> colMapforStatFilter,AtomicInteger nameindex) { String join = ""; for (String field : groupFields) { cols.append(join); cols.append(field); join = ","; } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(field)) { cols.append(join); cols.append(field); if(showfield.isstat) { String alias="tmp_"+nameindex.incrementAndGet(); cols.append(" as "+alias); colMapforStatFilter.put(field, alias); } join = ","; } } } public static boolean hasStatFiled(ArrayList<String> showFields) { for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(showfield.isstat) { return true; } } return false; } public static void parseColsWithJoins(StringBuffer cols,StringBuffer cols_inner,HigoAdhocJoinParams[] joins,HashMap<String,String> colMap,HashMap<String,String> colMapforStatFilter,ArrayList<String> groupFields,ArrayList<String> showFields,AtomicInteger nameindex) { //----inner begin----- String join = ""; for (String field : groupFields) { if(colMap.containsKey(field)) { continue; } cols_inner.append(join); cols_inner.append(field); String alias="tmp_"+nameindex.incrementAndGet(); cols_inner.append(" as "+alias); colMap.put(field, alias); join = ","; } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(showfield.realField)) { if(colMap.containsKey(showfield.realField)) { continue; } cols_inner.append(join); cols_inner.append(showfield.realField); String alias="tmp_"+nameindex.incrementAndGet(); cols_inner.append(" as "+alias); colMap.put(showfield.realField, alias); join = ","; } } for(int i=0;i<joins.length;i++) { HigoAdhocJoinParams jp=joins[i]; if(!groupFields.contains(jp.leftkey)&&!showFields.contains(jp.leftkey)) { if(colMap.containsKey(jp.leftkey)) { continue; } cols_inner.append(join); cols_inner.append(jp.leftkey); String alias="tmp_"+nameindex.incrementAndGet(); cols_inner.append(" as "+alias); colMap.put(jp.leftkey, alias); join = ","; } } //----inner end----- join = ""; for (String field : groupFields) { cols.append(join); cols.append("jl1."); cols.append(colMap.get(field)); String alias="tmp_"+nameindex.incrementAndGet(); cols.append(" as "+alias); join = ","; } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(showfield.realField)) { if(!showfield.isstat) { cols.append(join); cols.append("jl1."); cols.append(colMap.get(showfield.realField)); join = ","; } } } for(int i=0;i<joins.length;i++) { HigoAdhocJoinParams jp=joins[i]; for (String field : jp.fl) { cols.append(join); cols.append("jr"+i+"."); cols.append(field); String alias="tmp_"+nameindex.incrementAndGet(); cols.append(" as "+alias); join = ","; } } for (String field : showFields) { StateField showfield=WebServiceParams.parseStat(field); if(!groupFields.contains(showfield.realField)) { if(showfield.isstat) { cols.append(join); cols.append(showfield.type); cols.append("("); cols.append("jl1."); cols.append(colMap.get(showfield.realField)); cols.append(")"); String alias="tmp_"+nameindex.incrementAndGet(); cols.append(" as "+alias); colMapforStatFilter.put(field, alias); join = ","; } } } } public static String parseDayCols(String hpart,ArrayList<String> groupFields,ArrayList<String> showFields) { String daycols=""; for (String field : groupFields) { if(field.equals("thedate")) { daycols="日期,"; } if(field.equals(hpart)) { daycols="日期,"; } } for (String field : showFields) { if(field.equals("thedate")) { daycols="日期,"; } if(field.equals(hpart)) { daycols="日期,"; } } return daycols; } public static StringBuffer makeWhere(ArrayList<String> fqList,ArrayList<String> notin,String key) { StringBuffer sqlWhere = new StringBuffer(); String join = " where "; for (String fq : fqList) { sqlWhere.append(join); sqlWhere.append(fq); join = " and "; } for (String p : notin) { sqlWhere.append(join); sqlWhere.append("inhdfs_udf("+key+",'"+p+"')='-'"); join = " and "; } return sqlWhere; } public static HigoAdhocJoinParams[] parseJoinsHive(String leftjoin,GetPartions.Shards shard) throws JSONException, SQLException { if(leftjoin==null||leftjoin.trim().isEmpty()) { return new HigoAdhocJoinParams[0]; } JSONArray jsonStr=new JSONArray(leftjoin.trim()); HigoAdhocJoinParams[] rtn=new HigoAdhocJoinParams[jsonStr.length()]; for(int i=0;i<jsonStr.length();i++) { JSONObject obj=jsonStr.getJSONObject(i); HigoAdhocJoinParams p=new HigoAdhocJoinParams(); p.tablename=obj.getString("tablename"); HashMap<String, String> map=TableJoin.getTableInfo(p.tablename); if(map!=null) { p.txtPath=map.get("txtStorePath"); } p.hdfsPath=obj.getString("path")+"/part-00000"; if(shard!=null) { p.fq=WebServiceParams.fqListHive(false,"dt",obj.getString("fq"),false,null,null,null,null); } p.fl=obj.getString("fl").split(","); p.leftkey=obj.getString("leftkey"); p.rightkey=obj.getString("rightkey"); p.returnPrefix=obj.getString("prefix"); p.sort=obj.has("sort")?obj.getString("sort"):""; String tmptblname=("tmp_"+p.tablename+"_"+System.currentTimeMillis()).replaceAll("-", "_"); p.createSql=AdhocHiveTmpTable.createTmpTable(tmptblname, map.get("colsName").split(","), map.get("splitString")); p.DropSql=AdhocHiveTmpTable.dropTable(tmptblname); p.addData=AdhocHiveTmpTable.addData(tmptblname, map.get("txtStorePath")); StringBuffer sqlWhere = new StringBuffer(); String join = " where "; for (String fq : p.fq) { sqlWhere.append(join); sqlWhere.append(fq); join = " and "; } HashSet<String> allfl=new HashSet<String>(); for(String s:obj.getString("fl").split(",")) { allfl.add(s.trim()); } allfl.add(p.rightkey); StringBuffer buff=new StringBuffer(); String joinchar=""; for(String fl:allfl) { buff.append(joinchar); buff.append(fl); joinchar=","; } p.frQuer="select "+ buff.toString()+" from "+tmptblname +" "+sqlWhere.toString(); rtn[i]=p; } return rtn; } }