Restore one servlet
[proteocache.git] / server / compbio / statistic / CassandraRequester.java
1 package compbio.statistic;
2
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Calendar;
7 import java.util.Date;
8 import java.util.List;
9
10 import compbio.cassandra.CassandraNativeConnector;
11 import compbio.cassandra.DataBase;
12 import compbio.cassandra.Pair;
13
14 public class CassandraRequester {
15         private CassandraNativeConnector DBInstance = new CassandraNativeConnector();
16         private ArrayList<DataBase> query;
17         private static long currentDate = 0;
18         private static long earlestDate = 0;
19
20         /*
21          * query: execution time for the period from date1 till date2
22          */
23         public List<DataBase> extractExecutionTime(String date1, String date2) {
24                 if (null == date1) {
25                         date1 = "1970/1/1";
26                 }
27                 if (null == date2) {
28                         date1 = "2100/1/1";
29                 }
30                 if (!isThisDateValid(date1) || !isThisDateValid(date2)) {
31                         System.out.println("Wrong date: point 3");
32                         return null;
33                 }
34                 SetDateRange();
35                 int nbins = 5;
36                 long dateStart = DateParsing(date1);
37                 long dateEnd = DateParsing(date2);
38                 if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd)
39                         return null;
40                 if (dateStart < earlestDate)
41                         dateStart = earlestDate;
42                 if (dateEnd > currentDate)
43                         dateStart = currentDate;
44
45                 Calendar start = Calendar.getInstance();
46                 start.setTime(new Date(dateStart));
47                 Calendar end = Calendar.getInstance();
48                 end.setTime(new Date(dateEnd));
49                 query = new ArrayList<DataBase>();
50                 List<Integer> totalTime = new ArrayList<Integer>();
51                 for (int i = 0; i < nbins; i++)
52                         totalTime.add(i, 0);
53                 List<Pair<String, String>> res = DBInstance.ReadProteinDataTable();
54                 List<Pair<Date, Long>> numres = new ArrayList<Pair<Date, Long>>();
55
56                 for (Pair<String, String> entry : res) {
57                         SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy/MM/dd");
58                         try {
59                                 Date jobstartdate = dateformatter.parse(entry.getElement0());
60                                 long date = jobstartdate.getTime();
61                                 if (dateStart <= date && date <= dateEnd) {
62                                         SimpleDateFormat datetimeformatter = new SimpleDateFormat("yyyy/MM/dd:H:m:s");
63                                         Date jobstarttime = datetimeformatter.parse(entry.getElement0());
64                                         Date jobendtime = datetimeformatter.parse(entry.getElement1());
65                                         long diff = (jobendtime.getTime() - jobstarttime.getTime()) / 1000;
66                                         Pair<Date, Long> pair = new Pair<Date, Long>(jobstartdate, Long.valueOf(diff));
67                                         numres.add(pair);
68                                 }
69                         } catch (ParseException e) {
70                                 e.printStackTrace();
71                         }
72                 }
73
74                 for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
75                         List<Integer> timeResult = new ArrayList<Integer>();
76                         for (int i = 0; i < nbins; i++)
77                                 timeResult.add(i, 0);
78                         for (Pair<Date, Long> p : numres) {
79                                 if (date.equals(p.getElement0())) {
80                                         long lenResult = p.getElement1().longValue();
81                                         if (lenResult <= 30)
82                                                 timeResult.set(0, timeResult.get(0) + 1);
83                                         else if (lenResult > 30 && lenResult <= 60)
84                                                 timeResult.set(1, timeResult.get(1) + 1);
85                                         else if (lenResult > 60 && lenResult <= 120)
86                                                 timeResult.set(2, timeResult.get(2) + 1);
87                                         else if (lenResult > 120 && lenResult <= 600)
88                                                 timeResult.set(3, timeResult.get(3) + 1);
89                                         else {
90                                                 timeResult.set(4, timeResult.get(4) + 1);
91                                         }
92                                 }
93                         }
94                         for (int i = 0; i < nbins; i++)
95                                 totalTime.set(i, totalTime.get(i) + timeResult.get(i));
96                         DataBase db = new DataBase();
97                         db.setTimeRez(timeResult);
98                         db.setDate(DateFormat(date.getTime()));
99                         query.add(db);
100                 }
101
102                 DataBase db = new DataBase();
103                 db.setTimeTotalExec(totalTime);
104                 query.add(db);
105                 System.out.println("StatisticsProt.readLength: total number of dates = " + query.size());
106                 return query;
107         }
108
109         /*
110          * convert String date into long date (miliseconds since the epoch start)
111          */
112         private static long DateParsing(String datInput) {
113                 if (datInput == null) {
114                         return 0;
115                 }
116                 long dateWorkSt = 0;
117                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
118                 try {
119                         dateWorkSt = formatter.parse(datInput).getTime();
120                 } catch (ParseException e) {
121                         e.printStackTrace();
122                 }
123                 return dateWorkSt;
124         }
125
126         // convert long to date in string format
127         private static String DateFormat(long inDate) {
128                 SimpleDateFormat datformat = new SimpleDateFormat("dd/MM/yyyy");
129                 return datformat.format(new Date(inDate));
130         }
131
132         /*
133          * set earlest date and current dates. earlestDate is static and should be
134          * set at the 1st call currentDate should be re-calculated every time
135          */
136         private static void SetDateRange() {
137                 Calendar cal = Calendar.getInstance();
138                 currentDate = DateParsing(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH));
139                 if (0 == earlestDate) {
140                         CassandraRequester cr = new CassandraRequester();
141                         earlestDate = cr.earliestDate();
142                         System.out.println("Set earlest Date = " + earlestDate);
143                 }
144         }
145
146         public boolean isThisDateValid(String dateToValidate) {
147                 if (dateToValidate == null || dateToValidate.equals("")) {
148                         System.out.println("Undefined date");
149                         return false;
150                 }
151                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
152                 try {
153                         // if not valid, this will throw ParseException
154                         sdf.setLenient(false);
155                         Date date = sdf.parse(dateToValidate);
156                 } catch (ParseException e) {
157                         e.printStackTrace();
158                         return false;
159                 }
160                 return true;
161         }
162
163         /*
164          * find the earliest date in the database
165          */
166         public long earliestDate() {
167                 earlestDate =  DBInstance.getEarliestDateInDB();
168                 return earlestDate;
169         }
170 }