Merge branch 'master' into PROT-9-webservice
[proteocache.git] / datadb / compbio / cassandra / readers / DailyStatisticsReader.java
diff --git a/datadb/compbio/cassandra/readers/DailyStatisticsReader.java b/datadb/compbio/cassandra/readers/DailyStatisticsReader.java
new file mode 100644 (file)
index 0000000..2a41621
--- /dev/null
@@ -0,0 +1,107 @@
+package compbio.cassandra.readers;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+
+import compbio.beans.DateBean;
+import compbio.beans.Total;
+import compbio.beans.TotalJobsStatisticBean;
+import compbio.cassandra.DateFormatter;
+import compbio.engine.JobStatus;
+
+public class DailyStatisticsReader extends CassandraReader {
+
+       public DailyStatisticsReader() {
+               super();
+       }
+
+       /**
+        * query: total number of jobs for the period from date1 till date2
+        * 
+        * @param dateStart
+        *            the first date in the period
+        * @param dateEnd
+        *            the last date in the period
+        * 
+        * @return TotalJobsStatisticBean to the controller
+        *         DailyStatisticsController
+        **/
+       public TotalJobsStatisticBean query(long dateStart, long dateEnd) {
+               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 = end.getTime(); !end.before(start); end.add(Calendar.DATE, -1), date = end.getTime()) {
+                       ResultSet results = CassandraQuery("SELECT * FROM JobDateInfo WHERE jobday = " + date.getTime() + ";");
+                       if (results == null)
+                               return null;
+                       if (results.isExhausted())
+                               continue;
+                       Row therow = results.one();
+                       Total res = new Total(therow.getLong("Total"), therow.getLong("TotalOK"), therow.getLong("TotalStopped"),
+                                       therow.getLong("TotalError"), therow.getLong("TotalTimeOut"));
+                       if (!results.isExhausted()) {
+                               Date dat = new Date(date.getTime());
+                               log.warn("CassandraReader.ReadDateTable: date row for " + dat.toString() + " (" + date.getTime() + ") duplicated ");
+                       }
+                       query.setDateTotal(DateFormatter.DateLongToString(date.getTime(), DateFormatter.getFormatDDMMYY()), 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 a date
+        * 
+        * @param day
+        *            the date in long format
+        * @param date
+        *            the date in String format
+        * 
+        * @param status
+        *            final job status
+        * @return DateBean to the controller DailyStatisticsController
+        **/
+       public DateBean readJobByDay(long day, String date, JobStatus status) {
+               DateBean res = new DateBean(date);
+               if (status == JobStatus.OK) {
+                       ResultSet results = CassandraQuery("SELECT JobID, Protein FROM ProteinData WHERE jobtime = " + day + ";");
+                       if (results == null || results.isExhausted())
+                               return null;
+                       List<Row> rows = results.all();
+                       for (Row r : rows) {
+                               res.setJobidAndSeq(r.getString("JobID"), r.getString("Protein"));
+                       }
+               } else {
+                       ResultSet results = CassandraQuery("SELECT JobID FROM FailLog WHERE jobtime = " + day + " and FinalStatus = '" + status.name()
+                                       + "';");
+                       if (results == null || results.isExhausted())
+                               return null;
+                       List<Row> rows = results.all();
+                       for (Row r : rows) {
+                               String jobid = r.getString("JobID");
+                               ResultSet results2 = CassandraQuery("SELECT Protein FROM ProteinLog WHERE JobID = '" + jobid + "';");
+                               if (results2 == null || results2.isExhausted())
+                                       return null;
+                               List<Row> jrows = results2.all();
+                               if (1 == jrows.size()) {
+                                       String protein = jrows.get(0).getString("Protein");
+                                       res.setJobidAndSeq(jobid, protein);
+                               }
+                       }
+               }
+               return res;
+       }
+
+}