1 package compbio.statistic;
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Calendar;
8 import java.util.Iterator;
12 import compbio.cassandra.CassandraNativeConnector;
13 import compbio.cassandra.DataBase;
14 import compbio.cassandra.Pair;
15 import compbio.cassandra.StructureProteinPrediction;
17 public class CassandraRequester {
18 private CassandraNativeConnector DBInstance = new CassandraNativeConnector();
19 private ArrayList<DataBase> query;
20 private static long currentDate = 0;
21 private static long earlestDate = 0;
24 * query: execution time for the period from date1 till date2
26 public List<DataBase> extractExecutionTime(String date1, String date2) {
33 if (!isThisDateValid(date1) || !isThisDateValid(date2)) {
34 System.out.println("Wrong date: point 3");
39 long dateStart = DateParsing(date1);
40 long dateEnd = DateParsing(date2);
41 if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd)
43 if (dateStart < earlestDate)
44 dateStart = earlestDate;
45 if (dateEnd > currentDate)
46 dateStart = currentDate;
48 Calendar start = Calendar.getInstance();
49 start.setTime(new Date(dateStart));
50 Calendar end = Calendar.getInstance();
51 end.setTime(new Date(dateEnd));
52 query = new ArrayList<DataBase>();
53 List<Integer> totalTime = new ArrayList<Integer>();
54 for (int i = 0; i < nbins; i++)
56 List<Pair<String, String>> res = DBInstance.ReadProteinDataTable();
57 List<Pair<Date, Long>> numres = new ArrayList<Pair<Date, Long>>();
59 for (Pair<String, String> entry : res) {
60 SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy/MM/dd");
62 Date jobstartdate = dateformatter.parse(entry.getElement0());
63 long date = jobstartdate.getTime();
64 if (dateStart <= date && date <= dateEnd) {
65 SimpleDateFormat datetimeformatter = new SimpleDateFormat("yyyy/MM/dd:H:m:s");
66 Date jobstarttime = datetimeformatter.parse(entry.getElement0());
67 Date jobendtime = datetimeformatter.parse(entry.getElement1());
68 long diff = (jobendtime.getTime() - jobstarttime.getTime()) / 1000;
69 Pair<Date, Long> pair = new Pair<Date, Long>(jobstartdate, Long.valueOf(diff));
72 } catch (ParseException e) {
77 for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
78 List<Integer> timeResult = new ArrayList<Integer>();
79 for (int i = 0; i < nbins; i++)
81 for (Pair<Date, Long> p : numres) {
82 if (date.equals(p.getElement0())) {
83 long lenResult = p.getElement1().longValue();
85 timeResult.set(0, timeResult.get(0) + 1);
86 else if (lenResult > 30 && lenResult <= 60)
87 timeResult.set(1, timeResult.get(1) + 1);
88 else if (lenResult > 60 && lenResult <= 120)
89 timeResult.set(2, timeResult.get(2) + 1);
90 else if (lenResult > 120 && lenResult <= 600)
91 timeResult.set(3, timeResult.get(3) + 1);
93 timeResult.set(4, timeResult.get(4) + 1);
97 for (int i = 0; i < nbins; i++)
98 totalTime.set(i, totalTime.get(i) + timeResult.get(i));
99 DataBase db = new DataBase();
100 db.setTimeRez(timeResult);
101 db.setDate(DateFormat(date.getTime()));
105 DataBase db = new DataBase();
106 db.setTimeTotalExec(totalTime);
108 System.out.println("StatisticsProt.readLength: total number of dates = " + query.size());
113 * query: total number of jobs for the period from date1 till date2
115 public List<DataBase> countJobs(String date1, String date2) {
122 if (!isThisDateValid(date1) || !isThisDateValid(date2)) {
123 System.out.println("Wrong date: point 3");
127 long dateStart = DateParsing(date1);
128 long dateEnd = DateParsing(date2);
129 if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd)
131 if (dateStart < earlestDate)
132 dateStart = earlestDate;
133 if (dateEnd > currentDate)
134 dateStart = currentDate;
136 Calendar start = Calendar.getInstance();
137 start.setTime(new Date(dateStart));
138 Calendar end = Calendar.getInstance();
139 end.setTime(new Date(dateEnd));
140 query = new ArrayList<DataBase>();
141 for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
142 Integer res = DBInstance.ReadDateTable(date.getTime());
145 DataBase db = new DataBase();
147 db.setDate(DateFormat(date.getTime()));
150 System.out.println("StatisticsProt.readLength: total number of dates = " + query.size());
154 * query: protein sequence
156 public List<DataBase> readProteins(String protIn, String flag) {
157 query = new ArrayList<DataBase>();
158 List<StructureProteinPrediction> res;
159 if (flag.equals("whole"))
160 res = DBInstance.ReadWholeSequence(protIn);
162 res = DBInstance.ReadPartOfSequence(protIn);
163 for (StructureProteinPrediction entry : res) {
164 Map<String,String> pred = entry.getPrediction();
165 Iterator it = pred.entrySet().iterator();
166 while (it.hasNext()) {
167 DataBase db = new DataBase();
168 db.setProt(entry.getSequence());
169 Map.Entry pairs = (Map.Entry)it.next();
170 db.setId(entry.getJobid());
171 db.setJpred(pairs.getValue().toString());
172 if (flag.equals("part"))
173 db.setSubProt(CreateSubprot (entry.getSequence(), protIn));
181 * query protein sequences with number of jobs
183 public List<DataBase> readProteinByCounter(int counter) {
184 query = new ArrayList<DataBase>();
185 // List<Pair<String, String>> res = DBInstance.ReadProteinDataByCounter(counter);
191 private static List<String> CreateSubprot (String protein, String subprot) {
192 List<String> sub = new ArrayList<String>();
193 String subStr = protein;
194 while (subStr.length() > 0 && subStr.contains(subprot)) {
195 String first = subStr.substring(0, subStr.indexOf(subprot));
196 if (first.length() > 0)
199 subStr = subStr.substring(subStr.indexOf(subprot) + subprot.length(), subStr.length());
201 if (subStr.length() > 0)
206 * convert String date into long date (miliseconds since the epoch start)
208 private static long DateParsing(String datInput) {
209 if (datInput == null) {
213 SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
215 dateWorkSt = formatter.parse(datInput).getTime();
216 } catch (ParseException e) {
222 // convert long to date in string format
223 private static String DateFormat(long inDate) {
224 SimpleDateFormat datformat = new SimpleDateFormat("dd/MM/yyyy");
225 return datformat.format(new Date(inDate));
229 * set earlest date and current dates. earlestDate is static and should be
230 * set at the 1st call currentDate should be re-calculated every time
232 private static void SetDateRange() {
233 Calendar cal = Calendar.getInstance();
234 currentDate = DateParsing(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH));
235 if (0 == earlestDate) {
236 CassandraRequester cr = new CassandraRequester();
237 earlestDate = cr.earliestDate();
238 System.out.println("Set earlest Date = " + earlestDate);
242 public boolean isThisDateValid(String dateToValidate) {
243 if (dateToValidate == null || dateToValidate.equals("")) {
244 System.out.println("Undefined date");
247 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
249 // if not valid, this will throw ParseException
250 sdf.setLenient(false);
251 Date date = sdf.parse(dateToValidate);
252 } catch (ParseException e) {
260 * find the earliest date in the database
262 public long earliestDate() {
263 earlestDate = DBInstance.getEarliestDateInDB();