You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2019/11/08 08:24:04 UTC

[empire-db] branch master updated: EMPIREDB-318 DBQuery code optimization

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 526cb2e  EMPIREDB-318 DBQuery code optimization
526cb2e is described below

commit 526cb2e7478da6314b6495fbffccf5d235a1a3d6
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Fri Nov 8 09:24:00 2019 +0100

    EMPIREDB-318
    DBQuery code optimization
---
 .../main/java/org/apache/empire/db/DBQuery.java    | 148 +++------------------
 .../java/org/apache/empire/db/DBQueryColumn.java   |   7 +-
 .../main/java/org/apache/empire/db/DBReader.java   |   2 +-
 .../apache/empire/db/expr/column/DBAliasExpr.java  |   4 +-
 4 files changed, 25 insertions(+), 136 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index 147ecd8..e0c5535 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -25,9 +25,7 @@ import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.empire.commons.ObjectUtils;
-import org.apache.empire.commons.Options;
 import org.apache.empire.commons.StringUtils;
-import org.apache.empire.data.DataType;
 import org.apache.empire.db.exceptions.InvalidKeyException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
@@ -43,8 +41,6 @@ import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.ItemNotFoundException;
 import org.apache.empire.exceptions.NotImplementedException;
 import org.apache.empire.exceptions.NotSupportedException;
-import org.apache.empire.xml.XMLUtil;
-import org.w3c.dom.Element;
 
 
 /**
@@ -64,102 +60,6 @@ public class DBQuery extends DBRowSet
     private final static long serialVersionUID = 1L;
 
     private static AtomicInteger queryCount = new AtomicInteger(0);
-    
-    /**
-     * DBQueryExprColumn
-     * wraps a DBColumnExpr object into a DBColumn interface object
-     * @author doebele
-     */
-    protected static class DBQueryExprColumn extends DBColumn
-    {
-        private static final long serialVersionUID = 1L;
-        
-        private final DBColumnExpr expr;
-
-        public DBQueryExprColumn(DBQuery query, String name, DBColumnExpr expr)
-        {
-            super(query, name);
-            this.expr = expr;
-        }
-        
-        public DBColumnExpr getExpr()
-        {
-            return expr;
-        }
-
-        @Override
-        public DBColumn getUpdateColumn()
-        {
-            return expr.getUpdateColumn();
-        }
-
-        @Override
-        public DataType getDataType()
-        {
-            return expr.getDataType();
-        }
-
-        @Override
-        public double getSize()
-        {
-            return 0;
-        }
-
-        @Override
-        public boolean isRequired()
-        {
-            return false;
-        }
-
-        @Override
-        public boolean isAutoGenerated()
-        {
-            return false;
-        }
-
-        @Override
-        public boolean isReadOnly()
-        {
-            return true;
-        }
-
-        @Override
-        public Object getAttribute(String name)
-        {
-            return expr.getAttribute(name);
-        }
-
-        @Override
-        public Options getOptions()
-        {
-            return expr.getOptions();
-        }
-
-        @Override
-        public String getBeanPropertyName()
-        {
-            return expr.getBeanPropertyName();
-        }
-
-        @Override
-        public Object validate(Object value)
-        {
-            log.warn("validate not supported for {}", expr.getName());
-            return value;
-        }
-
-        @Override
-        public Element addXml(Element parent, long flags)
-        {
-            Element elem = XMLUtil.addElement(parent, "column");
-            elem.setAttribute("name", name);
-            // add All Attributes
-            if (attributes != null)
-                attributes.addXml(elem, flags);
-            // done
-            return elem;
-        }
-    }
 
     protected final DBCommandExpr   cmdExpr;
     protected final DBColumn[]      keyColumns;
@@ -178,18 +78,23 @@ public class DBQuery extends DBRowSet
     { // Set the column expressions
         super(cmd.getDatabase());
         this.cmdExpr = cmd;
+        this.alias = alias;
         // Set Query Columns
         DBColumnExpr[] exprList = cmd.getSelectExprList();
         this.queryColumns = new DBQueryColumn[exprList.length];
         for (int i = 0; i < exprList.length; i++)
         {   // Init Columns 
-            columns.add(getColumnFromExpr(exprList[i], i));
-            queryColumns[i] = createQueryColumn(exprList[i]);
+            queryColumns[i] = createQueryColumn(exprList[i], i);
+            // add column
+            DBColumn column = exprList[i].getUpdateColumn();
+            if (column==null || (exprList[i] instanceof DBAliasExpr))
+            {   // user QueryColumn
+                column = queryColumns[i]; 
+            }
+            columns.add(column);
         }
         // Set the key Column
         this.keyColumns = keyColumns;
-        // set alias
-        this.alias = alias;
     }
 
     /**
@@ -708,30 +613,13 @@ public class DBQuery extends DBRowSet
      * @param expr
      * @return the query column
      */
-    protected DBQueryColumn createQueryColumn(DBColumnExpr expr)
+    protected DBQueryColumn createQueryColumn(DBColumnExpr expr, int index)
     {
-        return new DBQueryColumn(this, expr);
-    }
-
-    /**
-     * Gets the underlying DBColumn from a column expression
-     * If there is no underlying column, a wrapper will be generated
-     * @param expr
-     * @param index
-     * @return the column
-     */
-    protected DBColumn getColumnFromExpr(DBColumnExpr expr, int index)
-    {
-        DBColumn column;
-        if ((expr instanceof DBAliasExpr) || (column=expr.getUpdateColumn())==null) 
-        {   // generate name
-            String name = expr.getName();
-            if (StringUtils.isEmpty(name))
-                name = getName()+"_COL"+String.valueOf(index);
-            // create wrapper
-            column=new DBQueryExprColumn(this, name, expr); 
-        }
-        return column;
+        String name = expr.getName();
+        if (StringUtils.isEmpty(name))
+            name = "COL_"+String.valueOf(index);
+        // create wrapper
+        return new DBQueryColumn(this, name, expr);
     }
 
     @Override
@@ -744,7 +632,7 @@ public class DBQuery extends DBRowSet
         index=0;
         for (DBColumn c : columns)
         {   // check update column
-            if ((c instanceof DBQueryExprColumn) && column.equals(c.getUpdateColumn()))
+            if ((c instanceof DBQueryColumn) && column.equals(c.getUpdateColumn()))
                  return index;
             // next
             index++;
@@ -757,8 +645,8 @@ public class DBQuery extends DBRowSet
     protected DBColumnExpr getColumnExprAt(int index)
     {
         DBColumn column = columns.get(index);
-        if (column instanceof DBQueryExprColumn)
-            return ((DBQueryExprColumn)column).getExpr();  // unwrap
+        if (column instanceof DBQueryColumn)
+            return ((DBQueryColumn)column).expr;  // unwrap
         // use column
         return column;
     }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java b/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
index d1d28cc..2bee498 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
@@ -25,6 +25,7 @@ import org.w3c.dom.Element;
 public class DBQueryColumn extends DBColumn
 {
     private final static long serialVersionUID = 1L;
+    
     protected final DBColumnExpr expr;
 
     /**
@@ -33,14 +34,14 @@ public class DBQueryColumn extends DBColumn
      * @param query the DBQuery object
      * @param expr the concrete DBColumnExpr object
      */
-    public DBQueryColumn(DBQuery query, DBColumnExpr expr)
+    public DBQueryColumn(DBQuery query, String name, DBColumnExpr expr)
     { // call base
-        super(query, expr.getName());
+        super(query, name);
         // set Expression
         this.expr = expr;
     }
     
-    public DBColumnExpr getQueryExpression()
+    public DBColumnExpr getExpr()
     {
         return expr;
     }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBReader.java b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
index 1d35097..cf3d939 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBReader.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
@@ -881,7 +881,7 @@ public class DBReader extends DBRecordData
                     return i;
                  // Query Expression?
                 if (updColumn instanceof DBQueryColumn)
-                {   updColumn = ((DBQueryColumn)updColumn).getQueryExpression().getUpdateColumn();
+                {   updColumn = ((DBQueryColumn)updColumn).getExpr().getUpdateColumn();
                     if (updColumn!=null && updColumn.equals(column))
                         return i;
                 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
index 2c85c24..dddbee4 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
@@ -136,14 +136,14 @@ public class DBAliasExpr extends DBColumnExpr
     }
 
     /**
-     * Always returns false since an alias expression cannot be an aggregate.
+     * Forward to expression
      *
      * @return false
      */
     @Override
     public boolean isAggregate()
     {
-        return false;
+        return expr.isAggregate();
     }
 
     /**