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

fix bugs in aggregators

上级 6a5cd06a
...@@ -17,21 +17,22 @@ public class AvgEvaluator extends AbstractEvaluator<Avg, Number> { ...@@ -17,21 +17,22 @@ public class AvgEvaluator extends AbstractEvaluator<Avg, Number> {
Expression first = expr.getArguments().get(0); Expression first = expr.getArguments().get(0);
Object val = eval(ctx, first); Object val = eval(ctx, first);
if (val != null) { if (val != null && val instanceof Number) {
m_sum += ((Number) val).doubleValue(); m_sum += ((Number) val).doubleValue();
m_count++; m_count++;
} }
return 0; return 0;
} }
@Override @Override
public Object getAggregatedValue() { public Object getAggregatedValue() {
return m_sum / m_count; return m_count == 0 ? 0 : m_sum / m_count;
} }
@Override @Override
public Class<?> getResultType(Avg expr) { public Class<?> getResultType(Avg expr) {
return Number.class; return Double.class;
} }
@Override @Override
......
...@@ -4,15 +4,15 @@ import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Count; ...@@ -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.evaluator.AbstractEvaluator;
import com.dianping.bee.engine.spi.RowContext; 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(); public static final String ID = Count.class.getName();
private long m_count; private long m_count;
@Override @Override
public Long evaluate(RowContext ctx, Count expr) { public Number evaluate(RowContext ctx, Count expr) {
m_count++; m_count++;
return 0L; return 0;
} }
@Override @Override
......
...@@ -16,8 +16,10 @@ public class MaxEvaluator extends AbstractEvaluator<Max, Number> { ...@@ -16,8 +16,10 @@ public class MaxEvaluator extends AbstractEvaluator<Max, Number> {
Object val = eval(ctx, first); Object val = eval(ctx, first);
if (val != null && val instanceof Number) { if (val != null && val instanceof Number) {
if (((Number) val).doubleValue() > m_max) { Number value = (Number) val;
m_max = ((Number) val).doubleValue();
if (value.doubleValue() > m_max) {
m_max = value.doubleValue();
} }
} }
...@@ -26,12 +28,12 @@ public class MaxEvaluator extends AbstractEvaluator<Max, Number> { ...@@ -26,12 +28,12 @@ public class MaxEvaluator extends AbstractEvaluator<Max, Number> {
@Override @Override
public Object getAggregatedValue() { public Object getAggregatedValue() {
return m_max; return m_max == Double.MIN_VALUE ? 0 : m_max;
} }
@Override @Override
public Class<?> getResultType(Max expr) { public Class<?> getResultType(Max expr) {
return Number.class; return Double.class;
} }
@Override @Override
......
...@@ -16,8 +16,10 @@ public class MinEvaluator extends AbstractEvaluator<Min, Number> { ...@@ -16,8 +16,10 @@ public class MinEvaluator extends AbstractEvaluator<Min, Number> {
Object val = eval(ctx, first); Object val = eval(ctx, first);
if (val != null && val instanceof Number) { if (val != null && val instanceof Number) {
if (((Number) val).doubleValue() < m_min) { Number value = (Number) val;
m_min = ((Number) val).doubleValue();
if (value.doubleValue() < m_min) {
m_min = value.doubleValue();
} }
} }
...@@ -26,12 +28,12 @@ public class MinEvaluator extends AbstractEvaluator<Min, Number> { ...@@ -26,12 +28,12 @@ public class MinEvaluator extends AbstractEvaluator<Min, Number> {
@Override @Override
public Object getAggregatedValue() { public Object getAggregatedValue() {
return m_min; return m_min == Double.MAX_VALUE ? 0 : m_min;
} }
@Override @Override
public Class<?> getResultType(Min expr) { public Class<?> getResultType(Min expr) {
return Number.class; return Double.class;
} }
@Override @Override
......
...@@ -16,7 +16,9 @@ public class SumEvaluator extends AbstractEvaluator<Sum, Number> { ...@@ -16,7 +16,9 @@ public class SumEvaluator extends AbstractEvaluator<Sum, Number> {
Object val = eval(ctx, first); Object val = eval(ctx, first);
if (val != null) { if (val != null) {
m_sum += ((Number) val).doubleValue(); Number value = (Number) val;
m_sum += value.doubleValue();
} }
return 0; return 0;
...@@ -29,7 +31,7 @@ public class SumEvaluator extends AbstractEvaluator<Sum, Number> { ...@@ -29,7 +31,7 @@ public class SumEvaluator extends AbstractEvaluator<Sum, Number> {
@Override @Override
public Class<?> getResultType(Sum expr) { public Class<?> getResultType(Sum expr) {
return Number.class; return Double.class;
} }
@Override @Override
......
...@@ -10,5 +10,7 @@ public interface Statement { ...@@ -10,5 +10,7 @@ public interface Statement {
public RowSet query(); public RowSet query();
public String getSQL();
public IndexMeta getIndexMeta(); public IndexMeta getIndexMeta();
} }
...@@ -87,6 +87,7 @@ public class DefaultRowListener extends ContainerHolder implements RowListener { ...@@ -87,6 +87,7 @@ public class DefaultRowListener extends ContainerHolder implements RowListener {
if (field.isAggregator(ctx)) { if (field.isAggregator(ctx)) {
m_values[i] = field.getAggregatedValue(); m_values[i] = field.getAggregatedValue();
field.reset();
} }
cells[i] = new DefaultCell(field, m_values[i]); cells[i] = new DefaultCell(field, m_values[i]);
......
...@@ -66,7 +66,11 @@ public class DefaultStatementManager extends ContainerHolder implements Statemen ...@@ -66,7 +66,11 @@ public class DefaultStatementManager extends ContainerHolder implements Statemen
try { try {
statement.accept(builder); statement.accept(builder);
return builder.getStatement();
SingleTableStatement stmt = builder.getStatement();
stmt.setSQL(sql);
return stmt;
} finally { } finally {
release(builder); release(builder);
} }
......
...@@ -55,6 +55,10 @@ class SelectField implements ColumnMeta { ...@@ -55,6 +55,10 @@ class SelectField implements ColumnMeta {
} }
} }
public Object getAggregatedValue() {
return getEvaluator(null).getAggregatedValue();
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Evaluator<Expression, Object> getEvaluator(RowContext ctx) { private Evaluator<Expression, Object> getEvaluator(RowContext ctx) {
if (m_evaluator == null) { if (m_evaluator == null) {
...@@ -66,6 +70,14 @@ class SelectField implements ColumnMeta { ...@@ -66,6 +70,14 @@ class SelectField implements ColumnMeta {
return m_evaluator; return m_evaluator;
} }
public String getName() {
return m_name;
}
public Class<?> getType() {
return m_type;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public boolean isAggregator(RowContext ctx) { public boolean isAggregator(RowContext ctx) {
if (m_expr != null) { if (m_expr != null) {
...@@ -77,15 +89,7 @@ class SelectField implements ColumnMeta { ...@@ -77,15 +89,7 @@ class SelectField implements ColumnMeta {
} }
} }
public String getName() { public void reset() {
return m_name; m_evaluator = null;
}
public Class<?> getType() {
return m_type;
}
public Object getAggregatedValue() {
return getEvaluator(null).getAggregatedValue();
} }
} }
\ No newline at end of file
...@@ -5,6 +5,9 @@ import java.util.HashMap; ...@@ -5,6 +5,9 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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.RowSet;
import com.dianping.bee.engine.spi.ColumnMeta; import com.dianping.bee.engine.spi.ColumnMeta;
import com.dianping.bee.engine.spi.Index; import com.dianping.bee.engine.spi.Index;
...@@ -16,10 +19,12 @@ import com.dianping.bee.engine.spi.Statement; ...@@ -16,10 +19,12 @@ import com.dianping.bee.engine.spi.Statement;
import com.site.lookup.ContainerHolder; import com.site.lookup.ContainerHolder;
import com.site.lookup.annotation.Inject; import com.site.lookup.annotation.Inject;
public class SingleTableStatement extends ContainerHolder implements Statement { public class SingleTableStatement extends ContainerHolder implements Statement, LogEnabled {
@Inject @Inject
protected RowContext ctx; protected RowContext ctx;
private String m_sql;
private IndexMeta m_index; private IndexMeta m_index;
private RowFilter m_rowFilter; private RowFilter m_rowFilter;
...@@ -30,6 +35,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement { ...@@ -30,6 +35,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
private Map<String, List<Object>> m_attributes = new HashMap<String, List<Object>>(); private Map<String, List<Object>> m_attributes = new HashMap<String, List<Object>>();
private Logger m_logger;
public void addAttribute(String name, Object value) { public void addAttribute(String name, Object value) {
List<Object> list = m_attributes.get(name); List<Object> list = m_attributes.get(name);
...@@ -41,6 +48,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement { ...@@ -41,6 +48,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
list.add(value); list.add(value);
} }
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override @Override
public ColumnMeta getColumnMeta(int colIndex) { public ColumnMeta getColumnMeta(int colIndex) {
return m_fields.get(colIndex); return m_fields.get(colIndex);
...@@ -56,6 +68,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement { ...@@ -56,6 +68,11 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
return m_index; return m_index;
} }
@Override
public String getSQL() {
return m_sql;
}
@Override @Override
public RowSet query() { public RowSet query() {
Index index = lookup(m_index.getIndexClass()); Index index = lookup(m_index.getIndexClass());
...@@ -72,6 +89,7 @@ public class SingleTableStatement extends ContainerHolder implements Statement { ...@@ -72,6 +89,7 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
return listener.getRowSet(); return listener.getRowSet();
} catch (Exception e) { } catch (Exception e) {
m_logger.error(String.format("Error when handling query(%s)!", this), e);
throw new RuntimeException(e); throw new RuntimeException(e);
} finally { } finally {
ctx.afterQuery(); ctx.afterQuery();
...@@ -94,4 +112,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement { ...@@ -94,4 +112,8 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
public void setSelectFields(List<SelectField> fields) { public void setSelectFields(List<SelectField> fields) {
m_fields = fields; m_fields = fields;
} }
public void setSQL(String sql) {
m_sql = sql;
}
} }
...@@ -12,13 +12,12 @@ ...@@ -12,13 +12,12 @@
* accordance with the terms of the license agreement you entered into * accordance with the terms of the license agreement you entered into
* with dianping.com. * with dianping.com.
*/ */
package com.dianping.bee.jdbc; package com.dianping.bee.engine;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
import com.dianping.bee.engine.TestEnvConfigurator;
import com.dianping.bee.server.SimpleServer; import com.dianping.bee.server.SimpleServer;
import com.site.lookup.ComponentTestCase; import com.site.lookup.ComponentTestCase;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册