提交 7f128d5e 编写于 作者: F Frankie Wu

make some basic progress

support SQL like:

select * from transaction where domain='Cat'
上级 bc11f94a
......@@ -8,6 +8,14 @@ import com.dianping.bee.db.DogDatabase;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.StatementManager;
import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.engine.spi.expr.Evaluator;
import com.dianping.bee.engine.spi.expr.internal.ComparisionEqualsEvaluator;
import com.dianping.bee.engine.spi.expr.internal.ComparisionIsEvaluator;
import com.dianping.bee.engine.spi.expr.internal.IdentifierEvaluator;
import com.dianping.bee.engine.spi.expr.internal.LiteralNumberEvaluator;
import com.dianping.bee.engine.spi.expr.internal.LiteralStringEvaluator;
import com.dianping.bee.engine.spi.expr.internal.LogicalAndEvaluator;
import com.dianping.bee.engine.spi.expr.internal.LogicalOrEvaluator;
import com.dianping.bee.engine.spi.handler.internal.DescHandler;
import com.dianping.bee.engine.spi.handler.internal.PrepareHandler;
import com.dianping.bee.engine.spi.handler.internal.SelectHandler;
......@@ -15,6 +23,7 @@ import com.dianping.bee.engine.spi.handler.internal.ShowHandler;
import com.dianping.bee.engine.spi.handler.internal.UseHandler;
import com.dianping.bee.engine.spi.internal.DefaultStatementManager;
import com.dianping.bee.engine.spi.internal.DefaultTableProviderManager;
import com.dianping.bee.engine.spi.internal.SingleTableRowFilter;
import com.dianping.bee.engine.spi.internal.SingleTableStatement;
import com.dianping.bee.engine.spi.internal.SingleTableStatementBuilder;
import com.dianping.bee.engine.spi.internal.TableHelper;
......@@ -41,19 +50,31 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(TableProviderManager.class, DefaultTableProviderManager.class) //
.req(SessionManager.class));
all.add(C(StatementManager.class, DefaultStatementManager.class));
all.add(C(SingleTableStatement.class).is(PER_LOOKUP));
all.add(C(TableHelper.class) //
.req(TableProviderManager.class));
all.add(C(SingleTableStatement.class).is(PER_LOOKUP));
all.add(C(SingleTableRowFilter.class).is(PER_LOOKUP));
all.add(C(SingleTableStatementBuilder.class).is(PER_LOOKUP) //
.req(TableHelper.class, SingleTableStatement.class));
.req(TableHelper.class, SingleTableStatement.class, SingleTableRowFilter.class));
defineHandlers(all);
defineEvaluators(all);
return all;
}
private void defineEvaluators(List<Component> all) {
all.add(C(Evaluator.class, LogicalAndEvaluator.ID, LogicalAndEvaluator.class));
all.add(C(Evaluator.class, LogicalOrEvaluator.ID, LogicalOrEvaluator.class));
all.add(C(Evaluator.class, ComparisionEqualsEvaluator.ID, ComparisionEqualsEvaluator.class));
all.add(C(Evaluator.class, ComparisionIsEvaluator.ID, ComparisionIsEvaluator.class));
all.add(C(Evaluator.class, IdentifierEvaluator.ID, IdentifierEvaluator.class));
all.add(C(Evaluator.class, LiteralStringEvaluator.ID, LiteralStringEvaluator.class));
all.add(C(Evaluator.class, LiteralNumberEvaluator.ID, LiteralNumberEvaluator.class));
}
private void defineHandlers(List<Component> all) {
all.add(C(SimpleServerQueryHandler.class).is(PER_LOOKUP) //
.req(SelectHandler.class, ShowHandler.class, DescHandler.class, UseHandler.class, PrepareHandler.class));
......
package com.dianping.bee.engine.spi;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.row.RowFilter;
public interface Statement {
public int getParameterSize();
public ColumnMeta[] getSelectColumns();
public int getColumnSize();
public RowSet query();
public void setIndex(IndexMeta index);
public void setParameterSize(int parameterSize);
public void setRowFilter(RowFilter rowFilter);
public void setSelectColumns(ColumnMeta[] selectColumns);
}
......@@ -2,7 +2,6 @@ package com.dianping.bee.engine.spi;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.RowSet;
public interface TableProvider {
public ColumnMeta[] getColumns();
......@@ -12,6 +11,4 @@ public interface TableProvider {
public IndexMeta[] getIndexes();
public String getName();
public RowSet queryByIndex(IndexMeta m_index, ColumnMeta[] m_selectColumns) throws Exception;
}
package com.dianping.bee.engine.spi.expr;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.dianping.bee.engine.spi.row.RowContext;
import com.site.lookup.ContainerHolder;
public abstract class AbstractEvaluator<S extends Expression, T> extends ContainerHolder implements Evaluator<S, T> {
@SuppressWarnings("unchecked")
protected <V> V eval(RowContext ctx, Expression child) {
Evaluator<Expression, V> evaluator = lookup(Evaluator.class, child.getClass().getName());
return (V) evaluator.evaluate(ctx, child);
}
}
package com.dianping.bee.engine.spi.expr;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.dianping.bee.engine.spi.row.RowContext;
public interface Evaluator<S extends Expression, T> {
public T evaluate(RowContext ctx, S expr);
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.ast.expression.comparison.ComparisionEqualsExpression;
import com.alibaba.cobar.parser.util.ExprEvalUtils;
import com.alibaba.cobar.parser.util.Pair;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class ComparisionEqualsEvaluator extends AbstractEvaluator<ComparisionEqualsExpression, Boolean> {
public static final String ID = ComparisionEqualsExpression.class.getName();
@Override
public Boolean evaluate(RowContext ctx, ComparisionEqualsExpression expr) {
Expression left = expr.getLeftOprand();
Expression right = expr.getRightOprand();
Object leftValue = eval(ctx, left);
Object rightValue = eval(ctx, right);
if (leftValue == null || rightValue == null) {
return null;
}
if (left instanceof Number || right instanceof Number) {
Pair<Number, Number> pair = ExprEvalUtils.convertNum2SameLevel(left, right);
leftValue = pair.getKey();
rightValue = pair.getValue();
}
return leftValue.equals(rightValue);
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.ast.expression.comparison.ComparisionIsExpression;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class ComparisionIsEvaluator extends AbstractEvaluator<ComparisionIsExpression, Boolean> {
public static final String ID = ComparisionIsExpression.class.getName();
@Override
public Boolean evaluate(RowContext ctx, ComparisionIsExpression expr) {
Expression operand = expr.getOperand();
Object value = eval(ctx, operand);
int mode = expr.getMode();
if (value == null) {
if (mode == ComparisionIsExpression.IS_NULL) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
switch (mode) {
case ComparisionIsExpression.IS_NOT_NULL:
return Boolean.TRUE;
case ComparisionIsExpression.IS_TRUE:
return "true".equalsIgnoreCase(value.toString());
case ComparisionIsExpression.IS_NOT_TRUE:
return !"true".equalsIgnoreCase(value.toString());
case ComparisionIsExpression.IS_FALSE:
return "false".equalsIgnoreCase(value.toString());
case ComparisionIsExpression.IS_NOT_FALSE:
return !"false".equalsIgnoreCase(value.toString());
case ComparisionIsExpression.IS_UNKNOWN:
case ComparisionIsExpression.IS_NOT_UNKNOWN:
}
return Boolean.FALSE;
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.primary.Identifier;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class IdentifierEvaluator extends AbstractEvaluator<Identifier, Object> {
public static final String ID = Identifier.class.getName();
@Override
public Object evaluate(RowContext ctx, Identifier expr) {
String id = expr.getIdText();
Object value = ctx.getValue(id);
return value;
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralNumber;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class LiteralNumberEvaluator extends AbstractEvaluator<LiteralNumber, Number> {
public static final String ID = LiteralNumber.class.getName();
@Override
public Number evaluate(RowContext ctx, LiteralNumber expr) {
Number value = expr.getNumber();
return value;
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralString;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class LiteralStringEvaluator extends AbstractEvaluator<LiteralString, String> {
public static final String ID = LiteralString.class.getName();
@Override
public String evaluate(RowContext ctx, LiteralString expr) {
String value = expr.getString();
return value;
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.ast.expression.logical.LogicalAndExpression;
import com.alibaba.cobar.parser.util.ExprEvalUtils;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class LogicalAndEvaluator extends AbstractEvaluator<LogicalAndExpression, Boolean> {
public static final String ID = LogicalAndExpression.class.getName();
@Override
public Boolean evaluate(RowContext ctx, LogicalAndExpression expr) {
int len = expr.getArity();
for (int i = 0; i < len; i++) {
Expression operand = expr.getOperand(i);
Object value = eval(ctx, operand);
if (value == null) {
return null;
} else if (!ExprEvalUtils.obj2bool(value)) {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
}
package com.dianping.bee.engine.spi.expr.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.ast.expression.logical.LogicalOrExpression;
import com.alibaba.cobar.parser.util.ExprEvalUtils;
import com.dianping.bee.engine.spi.expr.AbstractEvaluator;
import com.dianping.bee.engine.spi.row.RowContext;
public class LogicalOrEvaluator extends AbstractEvaluator<LogicalOrExpression, Boolean> {
public static final String ID = LogicalOrExpression.class.getName();
@Override
public Boolean evaluate(RowContext ctx, LogicalOrExpression expr) {
int len = expr.getArity();
for (int i = 0; i < len; i++) {
Expression operand = expr.getOperand(i);
Object value = eval(ctx, operand);
if (value == null) {
return null;
} else if (ExprEvalUtils.obj2bool(value)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}
......@@ -116,45 +116,54 @@ public abstract class AbstractCommandHandler extends ContainerHolder implements
}
public void writeRow(Row row) {
RowDataPacket packet = new RowDataPacket(row.getColumnSize());
for (int cellIndex = 0; cellIndex < row.getColumnSize(); cellIndex++) {
int len = row.getColumnSize();
RowDataPacket packet = new RowDataPacket(len);
for (int cellIndex = 0; cellIndex < len; cellIndex++) {
Cell cell = row.getCell(cellIndex);
ColumnMeta column = cell.getMeta();
String value = cell.getValue() == null ? null : String.valueOf(cell.getValue());
switch (TypeUtils.convertJavaTypeToFieldType(column.getType())) {
case Fields.FIELD_TYPE_STRING:
packet.add(StringUtil.encode(value, m_charset));
break;
case Fields.FIELD_TYPE_INT24:
packet.add(value == null ? null : IntegerUtil.toBytes(Integer.parseInt(value)));
break;
case Fields.FIELD_TYPE_DECIMAL:
case Fields.FIELD_TYPE_TINY:
case Fields.FIELD_TYPE_SHORT:
case Fields.FIELD_TYPE_LONG:
case Fields.FIELD_TYPE_FLOAT:
case Fields.FIELD_TYPE_DOUBLE:
case Fields.FIELD_TYPE_NULL:
case Fields.FIELD_TYPE_TIMESTAMP:
case Fields.FIELD_TYPE_LONGLONG:
case Fields.FIELD_TYPE_DATE:
case Fields.FIELD_TYPE_TIME:
case Fields.FIELD_TYPE_DATETIME:
case Fields.FIELD_TYPE_YEAR:
case Fields.FIELD_TYPE_NEWDATE:
case Fields.FIELD_TYPE_VARCHAR:
case Fields.FIELD_TYPE_BIT:
case Fields.FIELD_TYPE_NEW_DECIMAL:
case Fields.FIELD_TYPE_ENUM:
case Fields.FIELD_TYPE_SET:
case Fields.FIELD_TYPE_TINY_BLOB:
case Fields.FIELD_TYPE_MEDIUM_BLOB:
case Fields.FIELD_TYPE_LONG_BLOB:
case Fields.FIELD_TYPE_BLOB:
case Fields.FIELD_TYPE_VAR_STRING:
case Fields.FIELD_TYPE_GEOMETRY:
default:
packet.add(StringUtil.encode(value, m_charset));
try {
switch (TypeUtils.convertJavaTypeToFieldType(column.getType())) {
case Fields.FIELD_TYPE_STRING:
packet.add(StringUtil.encode(value, m_charset));
break;
case Fields.FIELD_TYPE_INT24:
packet.add(value == null ? null : IntegerUtil.toBytes(Integer.parseInt(value)));
break;
case Fields.FIELD_TYPE_DECIMAL:
case Fields.FIELD_TYPE_TINY:
case Fields.FIELD_TYPE_SHORT:
case Fields.FIELD_TYPE_LONG:
case Fields.FIELD_TYPE_FLOAT:
case Fields.FIELD_TYPE_DOUBLE:
case Fields.FIELD_TYPE_NULL:
case Fields.FIELD_TYPE_TIMESTAMP:
case Fields.FIELD_TYPE_LONGLONG:
case Fields.FIELD_TYPE_DATE:
case Fields.FIELD_TYPE_TIME:
case Fields.FIELD_TYPE_DATETIME:
case Fields.FIELD_TYPE_YEAR:
case Fields.FIELD_TYPE_NEWDATE:
case Fields.FIELD_TYPE_VARCHAR:
case Fields.FIELD_TYPE_BIT:
case Fields.FIELD_TYPE_NEW_DECIMAL:
case Fields.FIELD_TYPE_ENUM:
case Fields.FIELD_TYPE_SET:
case Fields.FIELD_TYPE_TINY_BLOB:
case Fields.FIELD_TYPE_MEDIUM_BLOB:
case Fields.FIELD_TYPE_LONG_BLOB:
case Fields.FIELD_TYPE_BLOB:
case Fields.FIELD_TYPE_VAR_STRING:
case Fields.FIELD_TYPE_GEOMETRY:
default:
packet.add(StringUtil.encode(value, m_charset));
break;
}
} catch (Exception e) {
throw new RuntimeException(String.format("Error when writing row for column(%s) with value(%s)!", column.getName(),
value), e);
}
}
......
......@@ -75,7 +75,7 @@ public class PrepareHandler extends AbstractCommandHandler {
long stmtId = m_manager.stmtPrepare(stmt);
CommandContext ctx = new CommandContext(c);
int columnSize = stmt.getSelectColumns().length;
int columnSize = stmt.getColumnSize();
int parameterSize = stmt.getParameterSize();
PreparePacket packet = new PreparePacket(stmtId, columnSize, parameterSize);
......
package com.dianping.bee.engine.spi.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.dianping.bee.engine.spi.expr.Evaluator;
import com.dianping.bee.engine.spi.row.RowContext;
import com.dianping.bee.engine.spi.row.RowFilter;
import com.site.lookup.ContainerHolder;
public class SingleTableRowFilter extends ContainerHolder implements RowFilter {
private Expression m_expr;
@SuppressWarnings("unchecked")
@Override
public boolean filter(RowContext ctx) {
Evaluator<Expression, Boolean> evaluator = lookup(Evaluator.class, m_expr.getClass().getName());
Object value = evaluator.evaluate(ctx, m_expr);
if (value == null) {
return false;
} else {
return (Boolean) value;
}
}
public SingleTableRowFilter setExpression(Expression expr) {
m_expr = expr;
return this;
}
}
package com.dianping.bee.engine.spi.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.dianping.bee.engine.spi.Statement;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
......@@ -13,30 +17,31 @@ import com.dianping.bee.engine.spi.row.RowFilter;
import com.site.lookup.ContainerHolder;
public class SingleTableStatement extends ContainerHolder implements Statement {
private TableProvider m_table;
private IndexMeta m_index;
private RowFilter m_rowFilter;
private IndexMeta m_index;
private ColumnMeta[] m_selectColumns;
private Map<ColumnMeta, Integer> m_allColumns = new TreeMap<ColumnMeta, Integer>();
private int m_parameterSize;
@Override
public int getParameterSize() {
return m_parameterSize;
public int getColumnSize() {
return m_selectColumns.length;
}
@Override
public ColumnMeta[] getSelectColumns() {
return m_selectColumns;
public int getParameterSize() {
return m_parameterSize;
}
@Override
public RowSet query() {
Index<?> index = lookup(m_index.getIndexClass());
RowContext ctx = new DefaultRowContext(m_selectColumns);
List<ColumnMeta> columns = new ArrayList<ColumnMeta>(m_allColumns.keySet());
RowContext ctx = new DefaultRowContext(columns.toArray(new ColumnMeta[0]));
DefaultRowListener listener = new DefaultRowListener(m_selectColumns);
listener.setRowFilter(m_rowFilter);
......@@ -51,32 +56,37 @@ public class SingleTableStatement extends ContainerHolder implements Statement {
}
}
@Override
public void setIndex(IndexMeta index) {
m_index = index;
}
@Override
public void setParameterSize(int parameterSize) {
m_parameterSize = parameterSize;
}
@Override
public void setRowFilter(RowFilter rowFilter) {
m_rowFilter = rowFilter;
}
@Override
public void setSelectColumns(ColumnMeta[] selectColumns) {
if (selectColumns != null && selectColumns.length > 0) {
m_selectColumns = selectColumns;
} else {
m_selectColumns = m_table.getColumns();
public void setSelectColumns(List<ColumnMeta> selectColumns) {
int len = selectColumns.size();
ColumnMeta[] columns = new ColumnMeta[len];
for (int i = 0; i < len; i++) {
ColumnMeta column = selectColumns.get(i);
columns[i] = column;
m_allColumns.put(column, i);
}
}
public void setTable(TableProvider table) {
m_table = table;
m_selectColumns = columns;
}
public void setWhereColumns(List<ColumnMeta> whereColumns) {
for (ColumnMeta column : whereColumns) {
if (!m_allColumns.containsKey(column)) {
m_allColumns.put(column, -1);
}
}
}
}
......@@ -17,10 +17,13 @@ import com.site.lookup.annotation.Inject;
public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
@Inject
private TableHelper m_helper;
private SingleTableStatement m_stmt;
@Inject
private SingleTableStatement m_stmt;
private SingleTableRowFilter m_rowFilter;
@Inject
private TableHelper m_helper;
private String m_alias;
......@@ -36,21 +39,6 @@ public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
private List<ColumnMeta> m_whereColumns = new ArrayList<ColumnMeta>();
private boolean checkSelectAll(List<ColumnMeta> columns, String columnName) {
if ("*".equals(columnName)) {
TableProvider table = m_helper.findTable(m_tableName);
ColumnMeta[] columnMetas = table.getColumns();
for (ColumnMeta meta : columnMetas) {
columns.add(meta);
}
return true;
} else {
return false;
}
}
private ColumnMeta findOrCreateColumnFrom(List<ColumnMeta> columns, String columnName) {
for (ColumnMeta column : columns) {
if (column.getName().equals(columnName)) {
......@@ -81,12 +69,6 @@ public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
throw new RuntimeException("Not a single table query!");
}
if (m_databaseName == null) {
m_stmt.setTable(m_helper.findTable(m_tableName));
} else {
m_stmt.setTable(m_helper.findTable(m_databaseName, m_tableName));
}
// for select clause
m_clause = Clause.SELECT;
......@@ -102,8 +84,7 @@ public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
expr.getKey().accept(this);
}
ColumnMeta[] columnMetas = new ColumnMeta[m_selectColumns.size()];
m_stmt.setSelectColumns(m_selectColumns.toArray(columnMetas));
m_stmt.setSelectColumns(m_selectColumns);
// for where clause
m_clause = Clause.WHERE;
......@@ -115,8 +96,8 @@ public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
where.accept(this);
// to evaluate where clause
// m_rowFilter.setExpression(where);
// m_stmt.setRowFilter(m_rowFilter);
m_stmt.setWhereColumns(m_whereColumns);
m_stmt.setRowFilter(m_rowFilter.setExpression(where));
if (m_databaseName == null) {
m_stmt.setIndex(m_helper.findIndex(m_tableName, m_whereColumns));
......@@ -134,9 +115,17 @@ public class SingleTableStatementBuilder extends EmptySQLASTVisitor {
case SELECT:
String selectColumnName = node.getIdTextUpUnescape();
if (!checkSelectAll(m_selectColumns, selectColumnName)) {
if ("*".equals(selectColumnName)) { // expand it
TableProvider table = m_helper.findTable(m_databaseName, m_tableName);
ColumnMeta[] columnMetas = table.getColumns();
for (ColumnMeta meta : columnMetas) {
m_selectColumns.add(meta);
}
} else {
findOrCreateColumnFrom(m_selectColumns, selectColumnName);
}
break;
case WHERE:
String whereColumnName = node.getIdTextUpUnescape();
......
......@@ -48,4 +48,19 @@ public class DefaultRowContext implements RowContext {
public void setRowListener(RowListener listener) {
m_listener = listener;
}
@Override
public Object getValue(String columnName) {
int len = m_columns.length;
for (int i = 0; i < len; i++) {
ColumnMeta column = m_columns[i];
if (column.getName().equalsIgnoreCase(columnName)) {
return m_values[i];
}
}
return null;
}
}
......@@ -16,4 +16,6 @@ public interface RowContext {
public void setRowListener(RowListener listener);
public Object getValue(String columnName);
}
......@@ -16,12 +16,8 @@ package com.dianping.bee.server;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.meta.internal.DefaultCell;
import com.dianping.bee.engine.spi.meta.internal.DefaultRowSet;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
......@@ -68,19 +64,19 @@ public class InformationSchemaDatabase implements DatabaseProvider {
return m_name;
}
@Override
public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
ColumnMeta[] columns = selectColumns;
DefaultRowSet rowSet = new DefaultRowSet(columns);
Cell[] cells = new Cell[columns.length];
for (int colIndex = 0; colIndex < cells.length; colIndex++) {
ColumnMeta columnMeta = columns[colIndex];
cells[colIndex] = new DefaultCell(columnMeta, null);
}
return rowSet;
}
// @Override
// public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
// ColumnMeta[] columns = selectColumns;
// DefaultRowSet rowSet = new DefaultRowSet(columns);
//
// Cell[] cells = new Cell[columns.length];
// for (int colIndex = 0; colIndex < cells.length; colIndex++) {
// ColumnMeta columnMeta = columns[colIndex];
// cells[colIndex] = new DefaultCell(columnMeta, null);
// }
//
// return rowSet;
// }
@Override
public IndexMeta getDefaultIndex() {
......
......@@ -36,11 +36,6 @@
<role>com.dianping.bee.engine.spi.StatementManager</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultStatementManager</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatement</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableStatement</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.TableHelper</role>
<implementation>com.dianping.bee.engine.spi.internal.TableHelper</implementation>
......@@ -50,6 +45,16 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatement</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableStatement</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.SingleTableRowFilter</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableRowFilter</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatementBuilder</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableStatementBuilder</implementation>
......@@ -61,6 +66,9 @@
<requirement>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatement</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.internal.SingleTableRowFilter</role>
</requirement>
</requirements>
</component>
<component>
......@@ -120,5 +128,40 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.logical.LogicalAndExpression</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.LogicalAndEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.logical.LogicalOrExpression</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.LogicalOrEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.comparison.ComparisionEqualsExpression</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.ComparisionEqualsEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.comparison.ComparisionIsExpression</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.ComparisionIsEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.primary.Identifier</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.IdentifierEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralString</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.LiteralStringEvaluator</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.expr.Evaluator</role>
<role-hint>com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralNumber</role-hint>
<implementation>com.dianping.bee.engine.spi.expr.internal.LiteralNumberEvaluator</implementation>
</component>
</components>
</plexus>
package com.dianping.bee.db;
import org.apache.commons.lang3.RandomStringUtils;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.meta.internal.DefaultCell;
import com.dianping.bee.engine.spi.meta.internal.DefaultRow;
import com.dianping.bee.engine.spi.meta.internal.DefaultRowSet;
public class CatDatabase implements DatabaseProvider {
......@@ -76,32 +68,32 @@ public class CatDatabase implements DatabaseProvider {
return m_name;
}
@Override
public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
ColumnMeta[] columns = selectColumns;
DefaultRowSet rowSet = new DefaultRowSet(columns);
for (int rowIndex = 0; rowIndex < 10; rowIndex++) {
Cell[] cells = new Cell[columns.length];
for (int colIndex = 0; colIndex < cells.length; colIndex++) {
ColumnMeta columnMeta = columns[colIndex];
String randomValue = null;
if (columnMeta.getType().getSimpleName().equals("String")) {
randomValue = RandomStringUtils.randomAlphabetic(5);
} else if (columnMeta.getType().getSimpleName().equals("Integer")
|| columnMeta.getType().getSimpleName().equals("Long")) {
randomValue = RandomStringUtils.randomNumeric(3);
} else {
randomValue = RandomStringUtils.randomAlphanumeric(5);
}
cells[colIndex] = new DefaultCell(columnMeta, randomValue);
}
Row row = new DefaultRow(cells);
rowSet.addRow(row);
}
return rowSet;
}
// @Override
// public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
// ColumnMeta[] columns = selectColumns;
// DefaultRowSet rowSet = new DefaultRowSet(columns);
//
// for (int rowIndex = 0; rowIndex < 10; rowIndex++) {
// Cell[] cells = new Cell[columns.length];
// for (int colIndex = 0; colIndex < cells.length; colIndex++) {
// ColumnMeta columnMeta = columns[colIndex];
// String randomValue = null;
// if (columnMeta.getType().getSimpleName().equals("String")) {
// randomValue = RandomStringUtils.randomAlphabetic(5);
// } else if (columnMeta.getType().getSimpleName().equals("Integer")
// || columnMeta.getType().getSimpleName().equals("Long")) {
// randomValue = RandomStringUtils.randomNumeric(3);
// } else {
// randomValue = RandomStringUtils.randomAlphanumeric(5);
// }
// cells[colIndex] = new DefaultCell(columnMeta, randomValue);
// }
//
// Row row = new DefaultRow(cells);
// rowSet.addRow(row);
// }
// return rowSet;
// }
@Override
public IndexMeta getDefaultIndex() {
......
package com.dianping.bee.db;
import org.apache.commons.lang3.RandomStringUtils;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.meta.internal.DefaultCell;
import com.dianping.bee.engine.spi.meta.internal.DefaultRow;
import com.dianping.bee.engine.spi.meta.internal.DefaultRowSet;
public class DogDatabase implements DatabaseProvider {
......@@ -56,33 +48,33 @@ public class DogDatabase implements DatabaseProvider {
return m_name;
}
@Override
public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
ColumnMeta[] columns = selectColumns;
DefaultRowSet rowSet = new DefaultRowSet(columns);
for (int rowIndex = 0; rowIndex < 10; rowIndex++) {
Cell[] cells = new Cell[columns.length];
for (int colIndex = 0; colIndex < cells.length; colIndex++) {
ColumnMeta columnMeta = columns[colIndex];
String randomValue = null;
if (columnMeta.getType().getSimpleName().equals("String")) {
randomValue = RandomStringUtils.randomAlphabetic(5);
} else if (columnMeta.getType().getSimpleName().equals("Integer")
|| columnMeta.getType().getSimpleName().equals("Long")) {
randomValue = RandomStringUtils.randomNumeric(3);
} else {
randomValue = RandomStringUtils.randomAlphanumeric(5);
}
cells[colIndex] = new DefaultCell(columnMeta, randomValue);
}
Row row = new DefaultRow(cells);
rowSet.addRow(row);
}
return rowSet;
}
// @Override
// public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
// ColumnMeta[] columns = selectColumns;
// DefaultRowSet rowSet = new DefaultRowSet(columns);
//
// for (int rowIndex = 0; rowIndex < 10; rowIndex++) {
// Cell[] cells = new Cell[columns.length];
//
// for (int colIndex = 0; colIndex < cells.length; colIndex++) {
// ColumnMeta columnMeta = columns[colIndex];
// String randomValue = null;
// if (columnMeta.getType().getSimpleName().equals("String")) {
// randomValue = RandomStringUtils.randomAlphabetic(5);
// } else if (columnMeta.getType().getSimpleName().equals("Integer")
// || columnMeta.getType().getSimpleName().equals("Long")) {
// randomValue = RandomStringUtils.randomNumeric(3);
// } else {
// randomValue = RandomStringUtils.randomAlphanumeric(5);
// }
// cells[colIndex] = new DefaultCell(columnMeta, randomValue);
// }
//
// Row row = new DefaultRow(cells);
// rowSet.addRow(row);
// }
// return rowSet;
// }
@Override
public IndexMeta getDefaultIndex() {
......
package com.dianping.cat.data;
import org.codehaus.plexus.PlexusContainer;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.row.DefaultRowListener;
import com.dianping.bee.engine.spi.row.RowContext;
import com.dianping.cat.data.event.EventColumn;
import com.dianping.cat.data.event.EventIndex;
import com.dianping.cat.data.transaction.TransactionColumn;
import com.dianping.cat.data.transaction.TransactionIndex;
import com.site.lookup.ContainerLoader;
public enum CatTableProvider implements TableProvider {
Transaction("transaction", TransactionColumn.values(), TransactionIndex.values()),
......@@ -66,17 +59,4 @@ public enum CatTableProvider implements TableProvider {
public String getName() {
return m_name;
}
@Override
public RowSet queryByIndex(IndexMeta meta, ColumnMeta[] selectColumns) throws Exception {
PlexusContainer container = ContainerLoader.getDefaultContainer();
Index<?> index = container.lookup(meta.getIndexClass());
RowContext ctx = container.lookup(RowContext.class);
DefaultRowListener listener = new DefaultRowListener(selectColumns);
ctx.setRowListener(listener);
index.queryById(ctx, null);
return listener.getRowSet();
}
}
\ No newline at end of file
......@@ -17,15 +17,15 @@ public enum TransactionColumn implements ColumnMeta {
SampleMessage(String.class), // MobileApi-0a0101a6-1345600834200-1
MinDuration(Integer.class), // 1
MinDuration(Double.class), // 1
MaxDuration(Integer.class), // 1234
MaxDuration(Double.class), // 1234
SumDuration(Long.class), // 123456
SumDuration(Double.class), // 123456
Sum2Duration(Long.class), // 2364233
Sum2Duration(Double.class), // 2364233
Line95(Integer.class); // 123
Line95(Double.class); // 123
private String m_name;
......
......@@ -19,25 +19,23 @@ import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
public class TransactionIndexer implements Index<Pair<String, String>> {
@Override
public void queryById(RowContext ctx, Pair<String, String> pair) throws Exception {
if (pair == null) {
pair = new Pair<String, String>("", "Cat");
}
pair = new Pair<String, String>("", "Cat");
TransactionReport report = getHourlyReport(pair.getValue(), pair.getKey());
Machine machine = report.getMachines().get("All");
for (TransactionType type : machine.getTypes().values()) {
if (type.getNames().isEmpty()) {
applyRow(ctx, type, null);
applyRow(ctx, report, type, null);
} else {
for (TransactionName name : type.getNames().values()) {
applyRow(ctx, type, name);
applyRow(ctx, report, type, name);
}
}
}
}
private void applyRow(RowContext ctx, TransactionType type, TransactionName name) {
private void applyRow(RowContext ctx, TransactionReport report, TransactionType type, TransactionName name) {
int cols = ctx.getColumnSize();
for (int i = 0; i < cols; i++) {
......@@ -49,6 +47,49 @@ public class TransactionIndexer implements Index<Pair<String, String>> {
break;
case Name:
ctx.setColumnValue(i, name == null ? null : name.getId());
break;
case Domain:
ctx.setColumnValue(i, report.getDomain());
break;
case StartTime:
ctx.setColumnValue(i, report.getStartTime());
break;
case MinDuration:
ctx.setColumnValue(i, name != null ? name.getMin() : type.getMin());
break;
case MaxDuration:
ctx.setColumnValue(i, name != null ? name.getMax() : type.getMax());
break;
case SampleMessage:
String url;
if (name != null) {
if (name.getFailMessageUrl() != null) {
url = name.getFailMessageUrl();
} else {
url = name.getSuccessMessageUrl();
}
} else {
if (type.getFailMessageUrl() != null) {
url = type.getFailMessageUrl();
} else {
url = type.getSuccessMessageUrl();
}
}
ctx.setColumnValue(i, url);
break;
case TotalCount:
ctx.setColumnValue(i, name != null ? name.getTotalCount() : type.getTotalCount());
break;
case Failures:
ctx.setColumnValue(i, name != null ? name.getFailCount() : type.getFailCount());
break;
case SumDuration:
ctx.setColumnValue(i, name != null ? name.getSum() : type.getSum());
break;
case Line95:
ctx.setColumnValue(i, name != null ? name.getLine95Value() : type.getLine95Value());
break;
default:
// TODO more here
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册