some deep down optimization
authorzapata <zapata>
Sun, 9 Jan 2005 22:07:44 +0000 (22:07 +0000)
committerzapata <zapata>
Sun, 9 Jan 2005 22:07:44 +0000 (22:07 +0000)
source/mir/entity/EntityBrowser.java
source/mir/entity/EntityList.java
source/mir/entity/adapter/ToOneRelationField.java
source/mir/storage/Database.java
source/mircoders/global/JobQueue.java
source/mircoders/global/ProducerEngine.java
source/mircoders/module/ModuleUsers.java

index 77bc559..d42dc90 100755 (executable)
@@ -80,7 +80,8 @@ public class EntityBrowser implements RewindableIterator {
   }
 
   public void readCurrentBatch(int aSkip) throws StorageObjectFailure {
-    currentBatch = storage.selectByWhereClause(mainTablePrefix, extraTables, whereClause, orderByClause, aSkip, batchSize);
+    currentBatch = storage.selectByWhereClause(mainTablePrefix, extraTables,
+        whereClause, orderByClause, aSkip, batchSize);
     batchPosition = aSkip;
     positionInBatch = 0;
   }
index a2e6cce..d3b1fed 100755 (executable)
@@ -57,7 +57,7 @@ public class EntityList implements StorableObject {
   private ArrayList           theEntityArrayList = new ArrayList();
   private String              whereClause, orderClause;
   private StorageObject       storage;
-  private int                 count, offset, limit;
+  private int                 offset, limit;
   private int                 nextOffset = -1;
   private int                 previousOffset = -1;
 
@@ -115,24 +115,6 @@ public class EntityList implements StorableObject {
   }
 
   /**
-   * Sets the number of rows that match the WHERE clause
-   *
-   * @param i The number of rows that match the WHERE clause
-   */
-  public void setCount(int i) {
-    count = i;
-  }
-
-  /**
-   * Returns the number of rows that match the WHERE clause
-   *
-   * @return The number of rows ...
-   */
-  public int getCount() {
-    return count;
-  }
-
-  /**
    * Sets the offset
    *
    * @param i The offset
@@ -187,45 +169,6 @@ public class EntityList implements StorableObject {
   }
 
   /**
-   * Returns the offset of the previous batch.
-   *
-   * @return offset of the previous batch
-   */
-  public int getPrevBatch() {
-    return previousOffset;
-  }
-
-  /**
-   * Returns whether there is a previous batch.
-   *
-   * @return true if yes, false if no
-   */
-  public boolean hasPrevBatch() {
-    return (previousOffset >= 0);
-  }
-
-  /**
-   * Returns the start index of the batch.
-   *
-   * @return
-   */
-  public int getFrom() {
-    return offset+1;
-  }
-
-  /**
-   * Returns the end index of the batch.
-   *
-   * @return
-   */
-  public int getTo() {
-    if (hasNextBatch())
-      return nextOffset;
-    else
-      return count;
-  }
-
-  /**
    * Inserts an Entity into the EntityList.
    *
    * @param anEntity The entity to be inserted.
index d99ab9b..97ffbf9 100755 (executable)
@@ -42,6 +42,10 @@ public class ToOneRelationField implements EntityAdapterDefinition.CalculatedFie
 \r
   public Object getValue(EntityAdapter anEntityAdapter) {\r
     try {\r
+      if (anEntityAdapter.get(fromField)==null) {\r
+        return null;\r
+      }\r
+      \r
       return anEntityAdapter.getToOneRelation(\r
                   toField + "=" + anEntityAdapter.get(fromField),\r
                   toField,\r
index f41f505..452dd98 100755 (executable)
@@ -52,7 +52,7 @@ import java.util.*;
 /**
  * Implements database access.
  *
- * @version $Id: Database.java,v 1.44.2.24 2005/01/09 20:37:09 zapata Exp $
+ * @version $Id: Database.java,v 1.44.2.25 2005/01/09 22:07:45 zapata Exp $
  * @author rk
  *
  */
@@ -500,7 +500,6 @@ public class Database implements StorageObject {
     // cause StringUtil.splitString puts in emptyString
 
     if (anExtraTables!=null && ((String) anExtraTables.get(0)).trim().equals("")){
-      logger.debug("+++ made anExtraTables to null!");
       anExtraTables=null;
     }
 
@@ -534,17 +533,12 @@ public class Database implements StorageObject {
     Statement statement = null;
     ResultSet resultSet;
 
-    int offsetCount = 0;
-    int count = 0;
-
     // build sql-statement
 
     if ((aWhereClause != null) && (aWhereClause.trim().length() == 0)) {
       aWhereClause = null;
     }
 
-    StringBuffer countSql =
-      new StringBuffer("select count(*) from ").append(useTable);
     StringBuffer selectSql =
       new StringBuffer("select "+selection+" from ").append(useTable);
 
@@ -552,7 +546,6 @@ public class Database implements StorageObject {
     if (anExtraTables!=null) {
       for (int i=0;i < anExtraTables.size();i++) {
         if (!anExtraTables.get(i).equals("")) {
-          countSql.append( ", " + anExtraTables.get(i));
           selectSql.append( ", " + anExtraTables.get(i));
         }
       }
@@ -560,7 +553,6 @@ public class Database implements StorageObject {
 
     if (aWhereClause != null) {
       selectSql.append(" where ").append(aWhereClause);
-      countSql.append(" where ").append(aWhereClause);
     }
 
     if ((anOrderByClause != null) && !(anOrderByClause.trim().length() == 0)) {
@@ -568,13 +560,14 @@ public class Database implements StorageObject {
     }
 
     if ((aLimit > -1) && (anOffset > -1)) {
-      selectSql.append(" LIMIT ").append(aLimit).append(" OFFSET ").append(anOffset);
+      selectSql.append(" LIMIT ").append(aLimit+1).append(" OFFSET ").append(anOffset);
     }
 
     // execute sql
     try {
       connection = obtainConnection();
       statement = connection.createStatement();
+      boolean hasMore = false;
 
       // selecting...
       resultSet = executeSql(statement, selectSql.toString());
@@ -582,39 +575,18 @@ public class Database implements StorageObject {
       if (resultSet != null) {
         theReturnList = new EntityList();
         Entity theResultEntity;
-        while (resultSet.next()) {
+        int position = 0;
+        while (((aLimit == -1) || (position<aLimit)) && resultSet.next()) {
           theResultEntity = makeEntityFromResultSet(resultSet);
           theReturnList.add(theResultEntity);
-          offsetCount++;
+          position++;
         }
+        hasMore = resultSet.next();
         resultSet.close();
       }
 
-      // making entitylist infos
-      count = offsetCount;
-
       if (theReturnList != null) {
         // now we decide if we have to know an overall count...
-        count = offsetCount;
-
-        if ((aLimit > -1) && (anOffset > -1)) {
-          if (offsetCount == aLimit) {
-            resultSet = executeSql(statement, countSql.toString());
-
-            if (resultSet != null) {
-              if (resultSet.next()) {
-                count = resultSet.getInt(1);
-              }
-
-              resultSet.close();
-            }
-            else {
-              logger.error("Could not count: " + countSql);
-            }
-          }
-        }
-
-        theReturnList.setCount(count);
         theReturnList.setOffset(anOffset);
         theReturnList.setWhere(aWhereClause);
         theReturnList.setOrder(anOrderByClause);
@@ -625,7 +597,7 @@ public class Database implements StorageObject {
           theReturnList.setPrevBatch(anOffset - aLimit);
         }
 
-        if ((anOffset + offsetCount) < count) {
+        if (hasMore) {
           theReturnList.setNextBatch(anOffset + aLimit);
         }
 
@@ -787,7 +759,7 @@ public class Database implements StorageObject {
                                         .append(") values (").append(v).append(")");
       String sql = sqlBuf.toString();
 
-      logger.info("INSERT: " + sql);
+      logQueryBefore(sql);
       con = obtainConnection();
       con.setAutoCommit(false);
       pstmt = con.prepareStatement(sql);
@@ -906,7 +878,7 @@ public class Database implements StorageObject {
     }
 
     sql.append(" where id=").append(id);
-    logger.info("UPDATE: " + sql);
+    logQueryBefore(sql.toString());
 
     try {
       con = obtainConnection();
@@ -959,7 +931,7 @@ public class Database implements StorageObject {
     String sql =
       "delete from " + mainTable + " where " + primaryKeyField + "='" + id + "'";
 
-    logger.debug("DELETE " + sql);
+    logQueryBefore(sql);
     try {
       con = obtainConnection();
       stmt = con.createStatement();
@@ -1024,15 +996,15 @@ public class Database implements StorageObject {
   public ResultSet executeSql(Statement stmt, String sql)
                             throws StorageObjectFailure, SQLException {
     ResultSet rs;
+    logQueryBefore(sql);
     long startTime = System.currentTimeMillis();
-
     try {
       rs = stmt.executeQuery(sql);
 
-      logger.info((System.currentTimeMillis() - startTime) + "ms. for: " + sql);
+      logQueryAfter(sql, (System.currentTimeMillis() - startTime));
     }
     catch (SQLException e) {
-      logger.error(e.getMessage() +"\n" + (System.currentTimeMillis() - startTime) + "ms. for: " + sql);
+      logQueryError(sql, (System.currentTimeMillis() - startTime), e);
       throw e;
     }
 
@@ -1122,8 +1094,6 @@ public class Database implements StorageObject {
    */
   public int getSize(String mainTablePrefix, List extraTables, String where) throws SQLException, StorageObjectFailure {
 
-    long startTime = System.currentTimeMillis();
-
     String useTable = mainTable;
     if (mainTablePrefix!=null && mainTablePrefix.trim().length()>0) {
       useTable+=" "+mainTablePrefix;
@@ -1146,6 +1116,8 @@ public class Database implements StorageObject {
     Connection con = null;
     Statement stmt = null;
     int result = 0;
+    logQueryBefore(countSql.toString());
+    long startTime = System.currentTimeMillis();
 
     try {
       con = obtainConnection();
@@ -1163,7 +1135,7 @@ public class Database implements StorageObject {
     finally {
       freeConnection(con, stmt);
     }
-    logger.info((System.currentTimeMillis() - startTime) + "ms. for: " + countSql);
+    logQueryAfter(countSql.toString(), (System.currentTimeMillis() - startTime));
 
     return result;
   }
@@ -1171,15 +1143,17 @@ public class Database implements StorageObject {
   public int executeUpdate(Statement stmt, String sql)
     throws StorageObjectFailure, SQLException {
     int rs;
+
+    logQueryBefore(sql);
     long startTime = System.currentTimeMillis();
 
     try {
       rs = stmt.executeUpdate(sql);
 
-      logger.info((System.currentTimeMillis() - startTime) + "ms. for: " + sql);
+      logQueryAfter(sql, (System.currentTimeMillis() - startTime));
     }
     catch (SQLException e) {
-      logger.error("Failed: " + (System.currentTimeMillis() - startTime) + "ms. for: " + sql);
+      logQueryError(sql, (System.currentTimeMillis() - startTime), e);
       throw e;
     }
 
@@ -1189,24 +1163,24 @@ public class Database implements StorageObject {
   public int executeUpdate(String sql)
     throws StorageObjectFailure, SQLException {
     int result = -1;
-    long startTime = System.currentTimeMillis();
     Connection con = null;
     PreparedStatement pstmt = null;
 
+    logQueryBefore(sql);
+    long startTime = System.currentTimeMillis();
     try {
       con = obtainConnection();
       pstmt = con.prepareStatement(sql);
       result = pstmt.executeUpdate();
+      logQueryAfter(sql, System.currentTimeMillis() - startTime);
     }
     catch (Throwable e) {
-      logger.error("Database.executeUpdate(" + sql + "): " + e.getMessage());
+      logQueryError(sql, System.currentTimeMillis() - startTime, e);
       throw new StorageObjectFailure("Database.executeUpdate(" + sql + "): " + e.getMessage(), e);
     }
     finally {
       freeConnection(con, pstmt);
     }
-
-    logger.info((System.currentTimeMillis() - startTime) + "ms. for: " + sql);
     return result;
   }
 
@@ -1422,6 +1396,19 @@ public class Database implements StorageObject {
     }
   }
 
+  private void logQueryBefore(String aQuery) {
+    logger.debug("about to perform QUERY " + aQuery);
+//    (new Throwable()).printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
+  }
+
+  private void logQueryAfter(String aQuery, long aTime) {
+    logger.info("QUERY " + aQuery + " took " + aTime + "ms.");
+  }
+
+  private void logQueryError(String aQuery, long aTime, Throwable anException) {
+    logger.error("QUERY " + aQuery + " took " + aTime + "ms, but threw exception " + anException.toString());
+  }
+
   /**
    * a small wrapper class that allows us to store the DB connection resources
    * that the BlobInputStream is using and free them upon closing of the stream
index 326f702..8a62d11 100755 (executable)
@@ -75,7 +75,7 @@ public class JobQueue {
     lastCleanup = 0;
     jobCleanupTreshold = 900; // seconds
     queueRunner = new JobQueueRunner(logger);
-    thread = new Thread(queueRunner);
+    thread = new Thread(queueRunner, "JobQueue");
     thread.setDaemon(true);
     thread.start();
   }
index 2c42426..33942e0 100755 (executable)
  */
 package mircoders.global;
 
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
 import mir.config.MirPropertiesConfiguration;
 import mir.log.LoggerToWriterAdapter;
 import mir.log.LoggerWrapper;
@@ -45,6 +37,9 @@ import mir.producer.ProducerFactory;
 import mir.util.GeneratorFormatAdapters;
 import mir.util.StringRoutines;
 
+import java.io.PrintWriter;
+import java.util.*;
+
 public class ProducerEngine {
   private JobQueue producerJobQueue;
   private LoggerWrapper logger;
index 259cb45..27efcda 100755 (executable)
@@ -80,7 +80,7 @@ public class ModuleUsers extends AbstractModule
 
       EntityList userList = getByWhereClause(whereString, -1);
 
-      if (userList != null && userList.getCount() == 1) {
+      if (userList != null && userList.size() == 1) {
         EntityUsers result = (EntityUsers) userList.elementAt(0);
 
         if (result.getFieldValue("is_disabled") == null ||