Merge branch 'servlets'
[proteocache.git] / server / compbio / statistic / CassandraRequester.java
index b7f83a8..410a722 100755 (executable)
@@ -9,16 +9,20 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import compbio.cassandra.AnnotatedProteinSequenceBean;
 import compbio.cassandra.CassandraNativeConnector;
+import compbio.cassandra.CassandraReader;
 import compbio.cassandra.DataBase;
 import compbio.cassandra.Pair;
-import compbio.cassandra.StructureProteinPrediction;
+import compbio.cassandra.StructureJobLog;
 
 public class CassandraRequester {
-       private CassandraNativeConnector DBInstance = new CassandraNativeConnector();
+       private CassandraReader db = new CassandraReader();
        private ArrayList<DataBase> 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
@@ -30,14 +34,14 @@ public class CassandraRequester {
                if (null == date2) {
                        date1 = "2100/1/1";
                }
-               if (!isThisDateValid(date1) || !isThisDateValid(date2)) {
+               if (!isThisDateValid(date1,formatYYMMDD) || !isThisDateValid(date2,formatYYMMDD)) {
                        System.out.println("Wrong date: point 3");
                        return null;
                }
                SetDateRange();
                int nbins = 5;
-               long dateStart = DateParsing(date1);
-               long dateEnd = DateParsing(date2);
+               long dateStart = DateParsing(date1, formatYYMMDD);
+               long dateEnd = DateParsing(date2, formatYYMMDD);
                if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd)
                        return null;
                if (dateStart < earlestDate)
@@ -53,7 +57,7 @@ public class CassandraRequester {
                List<Integer> totalTime = new ArrayList<Integer>();
                for (int i = 0; i < nbins; i++)
                        totalTime.add(i, 0);
-               List<Pair<String, String>> res = DBInstance.ReadProteinDataTable();
+               List<Pair<String, String>> res = db.ReadProteinDataTable();
                List<Pair<Date, Long>> numres = new ArrayList<Pair<Date, Long>>();
 
                for (Pair<String, String> entry : res) {
@@ -119,13 +123,13 @@ public class CassandraRequester {
                if (null == date2) {
                        date1 = "2100/1/1";
                }
-               if (!isThisDateValid(date1) || !isThisDateValid(date2)) {
+               if (!isThisDateValid(date1, formatYYMMDD) || !isThisDateValid(date2, formatYYMMDD)) {
                        System.out.println("Wrong date: point 3");
                        return null;
                }
                SetDateRange();
-               long dateStart = DateParsing(date1);
-               long dateEnd = DateParsing(date2);
+               long dateStart = DateParsing(date1, formatYYMMDD);
+               long dateEnd = DateParsing(date2, formatYYMMDD);
                if (dateEnd < earlestDate || dateStart > currentDate || dateStart > dateEnd)
                        return null;
                if (dateStart < earlestDate)
@@ -139,55 +143,84 @@ public class CassandraRequester {
                end.setTime(new Date(dateEnd));
                query = new ArrayList<DataBase>();
                for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
-                       Integer res = DBInstance.ReadDateTable(date.getTime());
+                       List<Long> res = db.ReadDateTable(date.getTime());
                        if (res == null)
                                continue;
-                       DataBase db = new DataBase();
-                       db.setTotal(res);
-                       db.setDate(DateFormat(date.getTime()));
-                       query.add(db);
-               }                       
+                       DataBase bean = new DataBase();
+                       bean.setTotal((int)(long)res.get(0));
+                       bean.setTotalOK((int)(long)res.get(1));
+                       bean.setTotalStopped((int)(long)res.get(2));
+                       bean.setTotalError((int)(long)res.get(3));
+                       bean.setTotalTimeOut((int)(long)res.get(4));
+                       bean.setDate(DateFormat(date.getTime()));
+                       query.add(bean);
+               }
                System.out.println("StatisticsProt.readLength: total number of dates = " + query.size());
                return query;
        }
+
        /* 
         * query: protein sequence
         * */
        public List<DataBase> readProteins(String protIn, String flag) {
+               if (protIn == null)
+                       return null;
+               System.out.println(protIn.length());
                query = new ArrayList<DataBase>();
-               List<StructureProteinPrediction> res;
+               List<AnnotatedProteinSequenceBean> res;
                if (flag.equals("whole")) 
-                       res = DBInstance.ReadWholeSequence(protIn);
+                       res = db.ReadWholeSequence(protIn);
                 else 
-                       res = DBInstance.ReadPartOfSequence(protIn);
-               for (StructureProteinPrediction entry : res) {
-                       Map<String,String> pred = entry.getPrediction();
-                       Iterator it = pred.entrySet().iterator();
-                       while (it.hasNext()) {
-                               DataBase db = new DataBase();
-                               db.setProt(entry.getSequence());
-                               Map.Entry pairs = (Map.Entry)it.next();
-                               db.setId(entry.getJobid());
-                               db.setJpred(pairs.getValue().toString());
-                               if (flag.equals("part"))
-                                       db.setSubProt(CreateSubprot (entry.getSequence(), protIn));                             
-                               query.add(db);
+                        res = (protIn.length() > 0) ? db.ReadPartOfSequence(protIn) : null;
+               if (res == null)
+                       return null;
+               for (AnnotatedProteinSequenceBean entry : res) {
+                       DataBase db = new DataBase();
+                       db.setProt(entry.getSequence());
+                       db.setPredictions(entry);
+                       db.setId(entry.getJobid());
+                       if (flag.equals("part")) {
+                               db.setSubProt(CreateSubprot (entry.getSequence(), protIn));
                        }
+                       query.add(db);
                }
                return query;
        }
-       
+
        /* 
-        * query  protein sequences with number of jobs
-        * */
-       public List<DataBase> readProteinByCounter(int counter) {
+        * query protein sequences with number of jobs
+        */
+       public List<DataBase> readProteinByCounter(int minimalcounter) {
                query = new ArrayList<DataBase>();
-       //      List<Pair<String, String>> res = DBInstance.ReadProteinDataByCounter(counter);
-               
+               Map<String, Integer> map = db.ReadProteinSequenceByCounter();
+               for (Map.Entry<String, Integer> entry : map.entrySet()) {
+                       if (entry.getValue() > minimalcounter && entry.getKey().length() > 0) {
+                               DataBase bean = new DataBase();
+                               bean.setTotalId(entry.getValue());
+                               bean.setProt(entry.getKey());
+                               query.add(bean);
+                       }
+               }
                return query;
        }
        
+       /*
+        * query jobs log info
+        */
+       public DataBase readJobLog(String jobid) {
+               if (jobid == null)
+                       return null;
+               StructureJobLog res = db.ReadJobLog(jobid);
+               if (res == null)
+                       return null;
+               DataBase query = new DataBase();
+               query.setLogInfo(res);
+               return query;
+       }
        
+       /*
+        * create list of parts of protein sequence;
+        */
        private static List<String> CreateSubprot (String protein, String subprot) {
                List<String> sub = new ArrayList<String>();
                String subStr = protein;
@@ -205,12 +238,12 @@ public class CassandraRequester {
        /*
         * convert String date into long date (miliseconds since the epoch start)
         */
-       private static long DateParsing(String datInput) {
+       private static long DateParsing(String datInput, SimpleDateFormat formatter) {
                if (datInput == null) {
                        return 0;
                }
                long dateWorkSt = 0;
-               SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
+               
                try {
                        dateWorkSt = formatter.parse(datInput).getTime();
                } catch (ParseException e) {
@@ -231,7 +264,7 @@ public class CassandraRequester {
         */
        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));
+               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();
@@ -239,12 +272,11 @@ public class CassandraRequester {
                }
        }
 
-       public boolean isThisDateValid(String dateToValidate) {
+       public boolean isThisDateValid(String dateToValidate, SimpleDateFormat sdf) {
                if (dateToValidate == null || dateToValidate.equals("")) {
                        System.out.println("Undefined date");
                        return false;
                }
-               SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                try {
                        // if not valid, this will throw ParseException
                        sdf.setLenient(false);
@@ -260,7 +292,7 @@ public class CassandraRequester {
         * find the earliest date in the database
         */
        public long earliestDate() {
-               earlestDate =  DBInstance.getEarliestDateInDB();
+               earlestDate = CassandraNativeConnector.getEarliestDateInDB();
                return earlestDate;
        }