提交 d21dd5ee 编写于 作者: F Frankie Wu

fix bugs in aggregators

上级 6a5cd06a
......@@ -17,21 +17,22 @@ public class AvgEvaluator extends AbstractEvaluator<Avg, Number> {
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
......
......@@ -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<Count, Long> {
public class CountEvaluator extends AbstractEvaluator<Count, Number> {
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
......
......@@ -16,8 +16,10 @@ public class MaxEvaluator extends AbstractEvaluator<Max, Number> {
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<Max, Number> {
@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
......
......@@ -16,8 +16,10 @@ public class MinEvaluator extends AbstractEvaluator<Min, Number> {
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<Min, Number> {
@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
......
......@@ -16,7 +16,9 @@ public class SumEvaluator extends AbstractEvaluator<Sum, Number> {
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<Sum, Number> {
@Override
public Class<?> getResultType(Sum expr) {
return Number.class;
return Double.class;
}
@Override
......
......@@ -9,6 +9,8 @@ public interface Statement {
public int getColumnSize();
public RowSet query();
public String getSQL();
public IndexMeta getIndexMeta();
}
......@@ -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]);
......
......@@ -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);
}
......
......@@ -55,6 +55,10 @@ class SelectField implements ColumnMeta {
}
}
public Object getAggregatedValue() {
return getEvaluator(null).getAggregatedValue();
}
@SuppressWarnings("unchecked")
private Evaluator<Expression, Object> 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
......@@ -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<String, List<Object>> m_attributes = new HashMap<String, List<Object>>();
private Logger m_logger;
public void addAttribute(String name, Object value) {
List<Object> 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<SelectField> fields) {
m_fields = fields;
}
public void setSQL(String sql) {
m_sql = sql;
}
}
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册