changeset 1522:a036c40713da

Support getting POJOs in a time range Reviewed-by: jerboaa, neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2014-October/011140.html
author Omair Majid <omajid@redhat.com>
date Wed, 15 Oct 2014 14:46:57 -0400
parents 9048c3663fc7
children df5a0ae22f11
files storage/core/src/main/java/com/redhat/thermostat/storage/core/AbstractGetter.java storage/core/src/main/java/com/redhat/thermostat/storage/core/HostLatestPojoListGetter.java storage/core/src/main/java/com/redhat/thermostat/storage/core/HostTimeIntervalPojoListGetter.java storage/core/src/main/java/com/redhat/thermostat/storage/core/VmLatestPojoListGetter.java storage/core/src/main/java/com/redhat/thermostat/storage/core/VmTimeIntervalPojoListGetter.java
diffstat 5 files changed, 281 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/AbstractGetter.java	Wed Oct 15 14:46:57 2014 -0400
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012-2014 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.storage.core;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.redhat.thermostat.common.utils.LoggingUtils;
+import com.redhat.thermostat.storage.model.TimeStampedPojo;
+
+class AbstractGetter<T extends TimeStampedPojo> {
+
+    private static final Logger logger = LoggingUtils.getLogger(AbstractGetter.class);
+
+    List<T> getLatestOrEmpty(PreparedStatement<T> query) {
+        if (query == null) {
+            return Collections.emptyList();
+        }
+        return getLatest(query);
+    }
+
+    List<T> getLatest(PreparedStatement<T> query) {
+        Cursor<T> cursor;
+        try {
+            cursor = query.executeQuery();
+        } catch (StatementExecutionException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Executing query '" + query + "' failed!", e);
+            return Collections.emptyList();
+        }
+        List<T> result = new ArrayList<>();
+        while (cursor.hasNext()) {
+            T pojo = cursor.next();
+            result.add(pojo);
+        }
+        return result;
+    }
+
+}
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/HostLatestPojoListGetter.java	Wed Oct 15 19:09:51 2014 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/HostLatestPojoListGetter.java	Wed Oct 15 14:46:57 2014 -0400
@@ -36,8 +36,6 @@
 
 package com.redhat.thermostat.storage.core;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -45,12 +43,16 @@
 import com.redhat.thermostat.common.utils.LoggingUtils;
 import com.redhat.thermostat.storage.model.TimeStampedPojo;
 
-public class HostLatestPojoListGetter<T extends TimeStampedPojo> {
+/**
+ * @see HostTimeIntervalPojoListGetter
+ */
+public class HostLatestPojoListGetter<T extends TimeStampedPojo> extends AbstractGetter<T> {
 
     public static final String HOST_LATEST_QUERY_FORMAT = "QUERY %s WHERE '"
             + Key.AGENT_ID.getName() + "' = ?s AND '"
             + Key.TIMESTAMP.getName() + "' > ?l SORT '"
             + Key.TIMESTAMP.getName() + "' DSC";
+
     private static final Logger logger = LoggingUtils.getLogger(HostLatestPojoListGetter.class);
     
     private final Storage storage;
@@ -65,27 +67,7 @@
 
     public List<T> getLatest(HostRef hostRef, long since) {
         PreparedStatement<T> query = buildQuery(hostRef, since);
-        if (query == null) {
-            return Collections.emptyList();
-        }
-        return getLatest(query);
-    }
-
-    private List<T> getLatest(PreparedStatement<T> query) {
-        Cursor<T> cursor;
-        try {
-            cursor = query.executeQuery();
-        } catch (StatementExecutionException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Executing query '" + query + "' failed!", e);
-            return Collections.emptyList();
-        }
-        List<T> result = new ArrayList<>();
-        while (cursor.hasNext()) {
-            T pojo = cursor.next();
-            result.add(pojo);
-        }
-        return result;
+        return getLatestOrEmpty(query);
     }
 
     PreparedStatement<T> buildQuery(HostRef hostRef, long since) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/HostTimeIntervalPojoListGetter.java	Wed Oct 15 14:46:57 2014 -0400
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012-2014 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.storage.core;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.redhat.thermostat.common.utils.LoggingUtils;
+import com.redhat.thermostat.storage.model.TimeStampedPojo;
+
+/**
+ * @see HostLatestPojoListGetter
+ */
+public class HostTimeIntervalPojoListGetter<T extends TimeStampedPojo> extends AbstractGetter<T> {
+
+    public static final String HOST_INTERVAL_QUERY_FORMAT = "QUERY %s WHERE '"
+            + Key.AGENT_ID.getName() + "' = ?s AND '"
+            + Key.TIMESTAMP.getName() + "' > ?l AND '"
+            + Key.TIMESTAMP.getName() + "' < ?l SORT '"
+            + Key.TIMESTAMP.getName() + "' DSC";
+
+    private static final Logger logger = LoggingUtils.getLogger(HostTimeIntervalPojoListGetter.class);
+    
+    private final Storage storage;
+    private final Category<T> cat;
+    private final String query;
+
+    public HostTimeIntervalPojoListGetter(Storage storage, Category<T> cat) {
+        this.storage = storage;
+        this.cat = cat;
+        this.query = String.format(HOST_INTERVAL_QUERY_FORMAT, cat.getName());
+    }
+
+    public List<T> getLatest(HostRef hostRef, long since, long to) {
+        PreparedStatement<T> query = buildQuery(hostRef, since, to);
+        return getLatestOrEmpty(query);
+    }
+
+    PreparedStatement<T> buildQuery(HostRef hostRef, long since, long to) {
+        StatementDescriptor<T> desc = new StatementDescriptor<>(cat, query);
+        PreparedStatement<T> stmt = null;
+        try {
+            stmt = storage.prepareStatement(desc);
+            stmt.setString(0, hostRef.getAgentId());
+            stmt.setLong(1, since);
+            stmt.setLong(2, to);
+        } catch (DescriptorParsingException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
+        }
+        return stmt;
+    }
+    
+    // package private for testing
+    String getQueryLatestDesc() {
+        return query;
+    }
+}
+
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/core/VmLatestPojoListGetter.java	Wed Oct 15 19:09:51 2014 +0200
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/VmLatestPojoListGetter.java	Wed Oct 15 14:46:57 2014 -0400
@@ -36,8 +36,6 @@
 
 package com.redhat.thermostat.storage.core;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -45,7 +43,12 @@
 import com.redhat.thermostat.common.utils.LoggingUtils;
 import com.redhat.thermostat.storage.model.TimeStampedPojo;
 
-public class VmLatestPojoListGetter<T extends TimeStampedPojo> {
+/**
+ * Get a {@link List} of {@link TimeStampedPojo}s newer than a given time stamp.
+ *
+ * @see VmTimeIntervalPojoListGetter
+ */
+public class VmLatestPojoListGetter<T extends TimeStampedPojo> extends AbstractGetter<T> {
     
     public static final String VM_LATEST_QUERY_FORMAT = "QUERY %s WHERE '"
             + Key.AGENT_ID.getName() + "' = ?s AND '"
@@ -66,28 +69,7 @@
 
     public List<T> getLatest(VmRef vmRef, long since) {
         PreparedStatement<T> query = buildQuery(vmRef, since);
-        if (query == null) {
-            return Collections.emptyList();
-        }
-        return getLatest(query);
-    }
-
-    private List<T> getLatest(PreparedStatement<T> query) {
-        Cursor<T> cursor;
-        try {
-            cursor = query.executeQuery();
-        } catch (StatementExecutionException e) {
-            // should not happen, but if it *does* happen, at least log it
-            logger.log(Level.SEVERE, "Executing query '" + query + "' failed!", e);
-            return Collections.emptyList();
-        }
-        
-        List<T> result = new ArrayList<>();
-        while (cursor.hasNext()) {
-            T pojo = cursor.next();
-            result.add(pojo);
-        }
-        return result;
+        return getLatestOrEmpty(query);
     }
 
     protected PreparedStatement<T> buildQuery(VmRef vmRef, long since) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/core/VmTimeIntervalPojoListGetter.java	Wed Oct 15 14:46:57 2014 -0400
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012-2014 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.storage.core;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.redhat.thermostat.common.utils.LoggingUtils;
+import com.redhat.thermostat.storage.model.TimeStampedPojo;
+
+/**
+ * Get a {@link List} of {@link TimeStampedPojo}s in a given time interval
+ * range.
+ *
+ * @see VmLatestPojoListGetter
+ */
+public class VmTimeIntervalPojoListGetter <T extends TimeStampedPojo> extends AbstractGetter<T> {
+
+    public static final String VM_INTERVAL_QUERY_FORMAT = "QUERY %s WHERE '"
+            + Key.AGENT_ID.getName() + "' = ?s AND '"
+            + Key.VM_ID.getName() + "' = ?s AND '" 
+            + Key.TIMESTAMP.getName() + "' > ?l AND '"
+            + Key.TIMESTAMP.getName() + "' < ?l SORT '"
+            + Key.TIMESTAMP.getName() + "' DSC";
+
+    private static final Logger logger = LoggingUtils.getLogger(VmTimeIntervalPojoListGetter.class);
+
+    private final Storage storage;
+    private final Category<T> cat;
+    private final String query;
+
+    public VmTimeIntervalPojoListGetter(Storage storage, Category<T> cat) {
+        this.storage = storage;
+        this.cat = cat;
+        this.query = String.format(VM_INTERVAL_QUERY_FORMAT, cat.getName());
+    }
+
+    public List<T> getLatest(VmRef vmRef, long since, long to) {
+        PreparedStatement<T> query = buildQuery(vmRef, since, to);
+        return getLatestOrEmpty(query);
+    }
+
+    protected PreparedStatement<T> buildQuery(VmRef vmRef, long since, long to) {
+        StatementDescriptor<T> desc = new StatementDescriptor<>(cat, query);
+        PreparedStatement<T> stmt = null;
+        try {
+            stmt = storage.prepareStatement(desc);
+            stmt.setString(0, vmRef.getHostRef().getAgentId());
+            stmt.setString(1, vmRef.getVmId());
+            stmt.setLong(2, since);
+            stmt.setLong(3, to);
+        } catch (DescriptorParsingException e) {
+            // should not happen, but if it *does* happen, at least log it
+            logger.log(Level.SEVERE, "Preparing query '" + desc + "' failed!", e);
+        }
+        return stmt;
+    }
+
+    // package private for tests
+    String getQueryLatestDesc() {
+        return query;
+    }
+}