Newer
Older
simple-jdbc-stats / src / nl / astraeus / jdbc / web / page / QueryOverview.java
package nl.astraeus.jdbc.web.page;

import nl.astraeus.jdbc.JdbcLogger;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * User: rnentjes
 * Date: 4/12/12
 * Time: 9:16 PM
 */
public class QueryOverview extends TemplatePage {

    boolean sortTotalCalls = true;
    boolean sortAvgTime = false;
    boolean sortTotalTime = false;

    @Override
    public Page processRequest(HttpServletRequest request) {
        if ("sortTotalCalls".equals(request.getParameter("action"))) {
            sortTotalCalls = true;
            sortAvgTime = false;
            sortTotalTime = false;
        } else if ("sortAvgTime".equals(request.getParameter("action"))) {
            sortTotalCalls = false;
            sortAvgTime = true;
            sortTotalTime = false;
        } else if ("sortTotalTime".equals(request.getParameter("action"))) {
            sortTotalCalls = false;
            sortAvgTime = false;
            sortTotalTime = true;
        }

        return this;
    }

    @Override
    public Map<String, Object> defineModel(HttpServletRequest request) {
        Map<String, Object> result = new HashMap<String, Object>();

        List<JdbcLogger.LogEntry> entries = new ArrayList<JdbcLogger.LogEntry>(JdbcLogger.get().getEntries());

        if (sortTotalCalls) {
            Collections.sort(entries, new Comparator<JdbcLogger.LogEntry>() {
                @Override
                public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) {
                    return o2.count - o1.count;
                }
            });
        } else if (sortAvgTime) {
            Collections.sort(entries, new Comparator<JdbcLogger.LogEntry>() {
                @Override
                public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) {
                    long n1 = o1.nano / o1.count;
                    long n2 = o2.nano / o2.count;

                    if (n2 > n1) {
                        return 1;
                    } else if (n2 < n1) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
        } else if (sortTotalTime) {
            Collections.sort(entries, new Comparator<JdbcLogger.LogEntry>() {
                @Override
                public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) {
                    if (o2.nano > o1.nano) {
                        return 1;
                    } else if (o2.nano < o1.nano) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
        }

        result.put("queries", entries);
        result.put("count", entries.size());

        result.put("sortTotalCalls", sortTotalCalls);
        result.put("sortAvgTime", sortAvgTime);
        result.put("sortTotalTime", sortTotalTime);

        return result;
    }

}