diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/AvgEvaluator.java b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/AvgEvaluator.java index 83a624fdb6b8660eecada17f03e695059cdd3691..bcdb348dcd95172782a585ff1a38f8de13d15876 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/AvgEvaluator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/AvgEvaluator.java @@ -17,21 +17,22 @@ public class AvgEvaluator extends AbstractEvaluator { Expression first = expr.getArguments().get(0); Object val = eval(ctx, first); - if (val != null) { + if (val != null && val instanceof Number) { m_sum += ((Number) val).doubleValue(); m_count++; } + return 0; } @Override public Object getAggregatedValue() { - return m_sum / m_count; + return m_count == 0 ? 0 : m_sum / m_count; } @Override public Class getResultType(Avg expr) { - return Number.class; + return Double.class; } @Override diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/CountEvaluator.java b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/CountEvaluator.java index 7dbc0726d026625528b6773ec69a2713f5b43f02..a121fb5120b777a802dee5250a6d018988c03bda 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/CountEvaluator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/CountEvaluator.java @@ -4,15 +4,15 @@ import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Count; import com.dianping.bee.engine.evaluator.AbstractEvaluator; import com.dianping.bee.engine.spi.RowContext; -public class CountEvaluator extends AbstractEvaluator { +public class CountEvaluator extends AbstractEvaluator { public static final String ID = Count.class.getName(); private long m_count; @Override - public Long evaluate(RowContext ctx, Count expr) { + public Number evaluate(RowContext ctx, Count expr) { m_count++; - return 0L; + return 0; } @Override diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MaxEvaluator.java b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MaxEvaluator.java index 06ff176111b0a1fb049e9cee9bb2401deed2780b..c7be69154b6e992457c884bd242cba168797b601 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MaxEvaluator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MaxEvaluator.java @@ -16,8 +16,10 @@ public class MaxEvaluator extends AbstractEvaluator { Object val = eval(ctx, first); if (val != null && val instanceof Number) { - if (((Number) val).doubleValue() > m_max) { - m_max = ((Number) val).doubleValue(); + Number value = (Number) val; + + if (value.doubleValue() > m_max) { + m_max = value.doubleValue(); } } @@ -26,12 +28,12 @@ public class MaxEvaluator extends AbstractEvaluator { @Override public Object getAggregatedValue() { - return m_max; + return m_max == Double.MIN_VALUE ? 0 : m_max; } @Override public Class getResultType(Max expr) { - return Number.class; + return Double.class; } @Override diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MinEvaluator.java b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MinEvaluator.java index 9dd8778b921c5ef168f9d42cd6d3f0f986ddee4b..1d68fa75c602eedce93cd24464b828f37d7380e9 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MinEvaluator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/MinEvaluator.java @@ -16,8 +16,10 @@ public class MinEvaluator extends AbstractEvaluator { Object val = eval(ctx, first); if (val != null && val instanceof Number) { - if (((Number) val).doubleValue() < m_min) { - m_min = ((Number) val).doubleValue(); + Number value = (Number) val; + + if (value.doubleValue() < m_min) { + m_min = value.doubleValue(); } } @@ -26,12 +28,12 @@ public class MinEvaluator extends AbstractEvaluator { @Override public Object getAggregatedValue() { - return m_min; + return m_min == Double.MAX_VALUE ? 0 : m_min; } @Override public Class getResultType(Min expr) { - return Number.class; + return Double.class; } @Override diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/SumEvaluator.java b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/SumEvaluator.java index df2c43aaaaeb67f712b03f163ce22be27fc01304..de71a362a7a6230417a242f3cdfef21bc17ba86e 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/SumEvaluator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/evaluator/function/SumEvaluator.java @@ -16,7 +16,9 @@ public class SumEvaluator extends AbstractEvaluator { Object val = eval(ctx, first); if (val != null) { - m_sum += ((Number) val).doubleValue(); + Number value = (Number) val; + + m_sum += value.doubleValue(); } return 0; @@ -29,7 +31,7 @@ public class SumEvaluator extends AbstractEvaluator { @Override public Class getResultType(Sum expr) { - return Number.class; + return Double.class; } @Override diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java index acd6721efd5f0f23f183d1655d4e259c1af8d037..0c9fedfa976fe50b806bca992b2cd58e78b55b07 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java @@ -9,6 +9,8 @@ public interface Statement { public int getColumnSize(); public RowSet query(); - + + public String getSQL(); + public IndexMeta getIndexMeta(); } diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowListener.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowListener.java index 813e0483311de12428dc78d3938e37d6af8113cd..3d1620a71fef2f2df20117f4fc4a206c44e3e14a 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowListener.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowListener.java @@ -35,7 +35,7 @@ public class DefaultRowListener extends ContainerHolder implements RowListener { @Override public void onRow(RowContext ctx) { if (m_filter != null && !m_filter.filter(ctx)) { - return; + return; } int len = m_fields.length; @@ -87,6 +87,7 @@ public class DefaultRowListener extends ContainerHolder implements RowListener { if (field.isAggregator(ctx)) { m_values[i] = field.getAggregatedValue(); + field.reset(); } cells[i] = new DefaultCell(field, m_values[i]); diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java index 89ea388feca7287ee6486275f56beae9740407ca..14dc17eb33d0841a48775ebd92c86716e0471319 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java @@ -66,7 +66,11 @@ public class DefaultStatementManager extends ContainerHolder implements Statemen try { statement.accept(builder); - return builder.getStatement(); + + SingleTableStatement stmt = builder.getStatement(); + + stmt.setSQL(sql); + return stmt; } finally { release(builder); } diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SelectField.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SelectField.java index 891d68341c4500070d47f5dd82d30b388b5b10ae..d82cf74291be42051f79ecd5aefc2f9064869d0e 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SelectField.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SelectField.java @@ -55,6 +55,10 @@ class SelectField implements ColumnMeta { } } + public Object getAggregatedValue() { + return getEvaluator(null).getAggregatedValue(); + } + @SuppressWarnings("unchecked") private Evaluator getEvaluator(RowContext ctx) { if (m_evaluator == null) { @@ -66,6 +70,14 @@ class SelectField implements ColumnMeta { return m_evaluator; } + public String getName() { + return m_name; + } + + public Class getType() { + return m_type; + } + @SuppressWarnings("unchecked") public boolean isAggregator(RowContext ctx) { if (m_expr != null) { @@ -77,15 +89,7 @@ class SelectField implements ColumnMeta { } } - public String getName() { - return m_name; - } - - public Class getType() { - return m_type; - } - - public Object getAggregatedValue() { - return getEvaluator(null).getAggregatedValue(); + public void reset() { + m_evaluator = null; } } \ No newline at end of file diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java index 3f277e13515a041d2e3d23746901084cf008cc66..beb5e291fcd47d5035664999c2eb0e603fc57f4c 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java @@ -5,6 +5,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; + import com.dianping.bee.engine.RowSet; import com.dianping.bee.engine.spi.ColumnMeta; import com.dianping.bee.engine.spi.Index; @@ -16,10 +19,12 @@ import com.dianping.bee.engine.spi.Statement; import com.site.lookup.ContainerHolder; import com.site.lookup.annotation.Inject; -public class SingleTableStatement extends ContainerHolder implements Statement { +public class SingleTableStatement extends ContainerHolder implements Statement, LogEnabled { @Inject protected RowContext ctx; + private String m_sql; + private IndexMeta m_index; private RowFilter m_rowFilter; @@ -30,6 +35,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement { private Map> m_attributes = new HashMap>(); + private Logger m_logger; + public void addAttribute(String name, Object value) { List list = m_attributes.get(name); @@ -41,6 +48,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement { list.add(value); } + @Override + public void enableLogging(Logger logger) { + m_logger = logger; + } + @Override public ColumnMeta getColumnMeta(int colIndex) { return m_fields.get(colIndex); @@ -56,6 +68,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement { return m_index; } + @Override + public String getSQL() { + return m_sql; + } + @Override public RowSet query() { Index index = lookup(m_index.getIndexClass()); @@ -72,6 +89,7 @@ public class SingleTableStatement extends ContainerHolder implements Statement { return listener.getRowSet(); } catch (Exception e) { + m_logger.error(String.format("Error when handling query(%s)!", this), e); throw new RuntimeException(e); } finally { ctx.afterQuery(); @@ -94,4 +112,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement { public void setSelectFields(List fields) { m_fields = fields; } + + public void setSQL(String sql) { + m_sql = sql; + } } diff --git a/bee-engine/src/test/java/com/dianping/bee/jdbc/TestServer.java b/bee-engine/src/test/java/com/dianping/bee/engine/TestServer.java similarity index 92% rename from bee-engine/src/test/java/com/dianping/bee/jdbc/TestServer.java rename to bee-engine/src/test/java/com/dianping/bee/engine/TestServer.java index 55177c2454419a257b19895e4ba7dff42c72da73..99c800899470f12f1287c715a832bfe50547dbf0 100644 --- a/bee-engine/src/test/java/com/dianping/bee/jdbc/TestServer.java +++ b/bee-engine/src/test/java/com/dianping/bee/engine/TestServer.java @@ -12,13 +12,12 @@ * accordance with the terms of the license agreement you entered into * with dianping.com. */ -package com.dianping.bee.jdbc; +package com.dianping.bee.engine; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import com.dianping.bee.engine.TestEnvConfigurator; import com.dianping.bee.server.SimpleServer; import com.site.lookup.ComponentTestCase;