package compbio.statistic; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import compbio.cassandra.DateBean; import compbio.cassandra.ProteinBean; import compbio.cassandra.CassandraNativeConnector; import compbio.cassandra.CassandraReaderOld; import compbio.cassandra.DataBase; import compbio.cassandra.Pair; import compbio.cassandra.JobBean; import compbio.cassandra.Total; import compbio.cassandra.TotalByCounterBean; import compbio.cassandra.TotalJobsStatisticBean; import compbio.cassandra.UserBean; import compbio.engine.JobStatus; public class CassandraRequester { private CassandraReaderOld db = new CassandraReaderOld(); private ArrayList query; private static long currentDate = 0; private static long earlestDate = 0; private final static SimpleDateFormat formatYYMMDD = new SimpleDateFormat("yyyy/MM/dd"); private final static SimpleDateFormat formatDDMMYY = new SimpleDateFormat("dd/MM/yyyy"); /* * query: execution time for the period from date1 till date2 */ public List extractExecutionTime(String date1, String date2) { if (null == date1) { date1 = "1970/1/1"; } if (null == date2) { date1 = "2100/1/1"; } if (!isThisDateValid(date1, formatYYMMDD) || !isThisDateValid(date2, formatYYMMDD)) { System.out.println("CassandraRequester.extractExecutionTime: wrong format for date1 " + date1 + "or date2 " + date2); return null; } SetDateRange(); int nbins = 5; long dateStart = DateParsing(date1, formatYYMMDD); long dateEnd = DateParsing(date2, formatYYMMDD); if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd) return null; if (dateStart < earlestDate) dateStart = earlestDate; if (dateEnd > currentDate) dateStart = currentDate; Calendar start = Calendar.getInstance(); start.setTime(new Date(dateStart)); Calendar end = Calendar.getInstance(); end.setTime(new Date(dateEnd)); query = new ArrayList(); List totalTime = new ArrayList(); for (int i = 0; i < nbins; i++) totalTime.add(i, 0); List> res = db.ReadProteinDataTable(); List> numres = new ArrayList>(); for (Pair entry : res) { SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy/MM/dd"); try { Date jobstartdate = dateformatter.parse(entry.getElement0()); long date = jobstartdate.getTime(); if (dateStart <= date && date <= dateEnd) { SimpleDateFormat datetimeformatter = new SimpleDateFormat("yyyy/MM/dd:H:m:s"); Date jobstarttime = datetimeformatter.parse(entry.getElement0()); Date jobendtime = datetimeformatter.parse(entry.getElement1()); long diff = (jobendtime.getTime() - jobstarttime.getTime()) / 1000; Pair pair = new Pair(jobstartdate, Long.valueOf(diff)); numres.add(pair); } } catch (ParseException e) { e.printStackTrace(); } } for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) { List timeResult = new ArrayList(); for (int i = 0; i < nbins; i++) timeResult.add(i, 0); for (Pair p : numres) { if (date.equals(p.getElement0())) { long lenResult = p.getElement1().longValue(); if (lenResult <= 30) timeResult.set(0, timeResult.get(0) + 1); else if (lenResult > 30 && lenResult <= 60) timeResult.set(1, timeResult.get(1) + 1); else if (lenResult > 60 && lenResult <= 120) timeResult.set(2, timeResult.get(2) + 1); else if (lenResult > 120 && lenResult <= 600) timeResult.set(3, timeResult.get(3) + 1); else { timeResult.set(4, timeResult.get(4) + 1); } } } for (int i = 0; i < nbins; i++) totalTime.set(i, totalTime.get(i) + timeResult.get(i)); DataBase db = new DataBase(); db.setTimeRez(timeResult); db.setDate(DateFormat(date.getTime())); query.add(db); } /* ???? Very strange code... DataBase db = new DataBase(); db.setTimeTotalExec(totalTime); query.add(db); */ return query; } /* * query: total number of jobs for the period from date1 till date2 */ public TotalJobsStatisticBean countJobs(String date1, String date2) { /* * if (null == date1) { date1 = "1970/1/1"; } if (null == date2) { date1 * = "2100/1/1"; } if (!isThisDateValid(date1, formatYYMMDD) || * !isThisDateValid(date2, formatYYMMDD)) { System.out.println( * "CassandraRequester.countJobs: wrong format for date1 " + date1 + * "or date2 " + date2); return null; } */ SetDateRange(); long dateStart = DateParsing(date1, formatYYMMDD); long dateEnd = DateParsing(date2, formatYYMMDD); /* * if (dateEnd < earlestDate || dateStart > currentDate || dateStart > * dateEnd) return null; if (dateStart < earlestDate) dateStart = * earlestDate; if (dateEnd > currentDate) dateStart = currentDate; */ Calendar start = Calendar.getInstance(); start.setTime(new Date(dateStart)); Calendar end = Calendar.getInstance(); end.setTime(new Date(dateEnd)); TotalJobsStatisticBean query = new TotalJobsStatisticBean(); Total wholeTotal = new Total(0, 0, 0, 0, 0); for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) { Total res = db.ReadDateTable(date.getTime()); if (res == null) continue; query.setDateTotal(DateFormat(date.getTime()), res); wholeTotal.setTotal(res.getTotal() + wholeTotal.getTotal()); wholeTotal.setTotalOK(res.getTotalOK() + wholeTotal.getTotalOK()); wholeTotal.setTotalStopped(res.getTotalStopped() + wholeTotal.getTotalStopped()); wholeTotal.setTotalError(res.getTotalError() + wholeTotal.getTotalError()); wholeTotal.setTotalTimeOut(res.getTotalTimeOut() + wholeTotal.getTotalTimeOut()); } query.setWholeTotal(wholeTotal); return query; } /* * query: jobs and sequence at date */ public DateBean readJobByDay(String date, JobStatus status) { if (!isThisDateValid(date, formatDDMMYY)) { System.out.println("CassandraRequester.readJobByDay: Wrong date format for " + date); return null; } SetDateRange(); long day = DateParsing(date, formatDDMMYY); if (day < earlestDate || day > currentDate) return null; if (status == JobStatus.OK) { return db.ReadProteinData(day, date); } return db.ReadFailedJobs(day, date, status); } /* * query: protein sequence */ public List readProteins(String protIn, String searchtype) { List result; if (searchtype.equals("whole")) result = db.ReadWholeSequence(protIn); else result = db.ReadPartOfSequence(protIn); if (result == null) return null; if (searchtype.equals("partial")) { for (ProteinBean entry : result) { entry.setSubProt(CreateSubprot(entry.getSequence(), protIn)); } } return result; } /* * query: protein feature */ public Map readProteinsPrediction(String feature, int percent) { Map result = db.ReadProtein(); ; if (result == null) return null; Map query = new HashMap(); for (Map.Entry entry : result.entrySet()) { String pred = entry.getValue(); if (pred.replaceAll("[^" + feature + "]", "").length() > pred.length() * percent / 100 && (!entry.getKey().equals(""))) { // if (!entry.getKey().equals("")) query.put(entry.getKey(), pred); } } return query; } /* * query protein sequences with number of jobs */ public List readProteinByCounter(int minimalcounter) { List query = new ArrayList(); Map map = db.ReadProteinSequenceByCounter(); if (map == null) return null; for (Map.Entry entry : map.entrySet()) { if (entry.getValue() > minimalcounter) { TotalByCounterBean bean = new TotalByCounterBean(); bean.setTotaljobs(entry.getValue()); bean.setName(entry.getKey()); query.add(bean); } } return query; } /* * query ip with number of jobs */ public List readIpByCounter(Integer minimalcounter) { List query = new ArrayList(); Map map = db.ReadIpByCounter(); if (minimalcounter == null) minimalcounter = 0; if (map == null) return null; for (Map.Entry entry : map.entrySet()) { if (entry.getValue() > minimalcounter) { TotalByCounterBean bean = new TotalByCounterBean(); bean.setTotaljobs(entry.getValue()); bean.setName(entry.getKey()); query.add(bean); } } return query; } /* * query jobs log info */ public JobBean readJobLog(String jobid) { if (jobid == null) return null; return db.ReadJobLog(jobid); } /* * query jobs by ipStructureJobLog */ public UserBean readIp(String ip) { if (ip == null) return null; Map res = db.ReadIpWithJobs(ip); if (res == null) return null; UserBean query = new UserBean(ip); query.setMainInfo(res); return query; } /* * create list of parts of protein sequence; */ private static List CreateSubprot(String protein, String subprot) { List sub = new ArrayList(); String subStr = protein; while (subStr.length() > 0 && subStr.contains(subprot)) { String first = subStr.substring(0, subStr.indexOf(subprot)); if (first.length() > 0) sub.add(first); sub.add(subprot); subStr = subStr.substring(subStr.indexOf(subprot) + subprot.length(), subStr.length()); } if (subStr.length() > 0) sub.add(subStr); return sub; } /* * convert String date into long date (miliseconds since the epoch start) */ private static long DateParsing(String datInput, SimpleDateFormat formatter) { if (datInput == null) { return 0; } long dateWorkSt = 0; try { dateWorkSt = formatter.parse(datInput).getTime(); } catch (ParseException e) { e.printStackTrace(); } return dateWorkSt; } // convert long to date in string format private static String DateFormat(long inDate) { SimpleDateFormat datformat = new SimpleDateFormat("dd/MM/yyyy"); return datformat.format(new Date(inDate)); } /* * set earlest date and current dates. earlestDate is static and should be * set at the 1st call currentDate should be re-calculated every time */ private static void SetDateRange() { Calendar cal = Calendar.getInstance(); currentDate = DateParsing(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH), formatYYMMDD); if (0 == earlestDate) { CassandraRequester cr = new CassandraRequester(); earlestDate = cr.earliestDate(); } } public boolean isThisDateValid(String dateToValidate, SimpleDateFormat sdf) { if (dateToValidate == null || dateToValidate.equals("")) { return false; } try { // if not valid, this will throw ParseException sdf.setLenient(false); Date date = sdf.parse(dateToValidate); } catch (ParseException e) { e.printStackTrace(); return false; } return true; } /* * find the earliest date in the database */ public long earliestDate() { earlestDate = CassandraNativeConnector.getEarliestDateInDB(); return earlestDate; } /** * prepares an example of either job id or IP for the DB * * @param exampletype * defines which example you need (an existing job from the DB - * jobid, an IP - "ip") * @return a string representation of the requested example, if the example * type is not known empty string is returned */ public String getExample(String exampletype) { if (exampletype.equals("jobid")) { return "jp_NzBOJKo"; } else if (exampletype.equals("ip")) { return "127.0.0.1"; } return ""; } }