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

temporary submit to pull change

上级 d46036ef
......@@ -6,9 +6,6 @@ import java.util.List;
import com.dianping.bee.db.CatDatabase;
import com.dianping.bee.db.DogDatabase;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.MultiTableStatement;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.SingleTableStatement;
import com.dianping.bee.engine.spi.StatementManager;
import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.engine.spi.handler.internal.DescHandler;
......@@ -16,12 +13,9 @@ import com.dianping.bee.engine.spi.handler.internal.PrepareHandler;
import com.dianping.bee.engine.spi.handler.internal.SelectHandler;
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.DefaultMultiTableStatement;
import com.dianping.bee.engine.spi.internal.DefaultRowFilter;
import com.dianping.bee.engine.spi.internal.DefaultSingleTableStatement;
import com.dianping.bee.engine.spi.internal.DefaultStatementManager;
import com.dianping.bee.engine.spi.internal.DefaultTableProviderManager;
import com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor;
import com.dianping.bee.engine.spi.internal.SingleTableStatement;
import com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor;
import com.dianping.bee.engine.spi.internal.TableHelper;
import com.dianping.bee.engine.spi.session.DefaultSessionManager;
......@@ -47,17 +41,13 @@ 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, DefaultSingleTableStatement.class).is(PER_LOOKUP));
all.add(C(MultiTableStatement.class, DefaultMultiTableStatement.class).is(PER_LOOKUP));
all.add(C(RowFilter.class, DefaultRowFilter.class).is(PER_LOOKUP));
all.add(C(SingleTableStatement.class).is(PER_LOOKUP));
all.add(C(TableHelper.class) //
.req(TableProviderManager.class));
all.add(C(SingleTableStatementVisitor.class).is(PER_LOOKUP) //
.req(TableHelper.class, SingleTableStatement.class, RowFilter.class));
all.add(C(MultiTableStatementVisitor.class).is(PER_LOOKUP) //
.req(TableHelper.class, MultiTableStatement.class, RowFilter.class));
.req(TableHelper.class, SingleTableStatement.class));
defineHandlers(all);
......
/**
* Project: bee-engine
*
* File Created at 2012-8-23
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.engine.spi;
import java.util.List;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public interface MultiTableStatement extends Statement {
public List<TableProvider> getTables();
public void setTables(List<TableProvider> tables);
}
package com.dianping.bee.engine.spi;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.dianping.bee.engine.spi.meta.Row;
public interface RowFilter {
public boolean filter(Row row);
public void setExpression(Expression where);
}
/**
* Project: bee-engine
*
* File Created at 2012-8-23
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.engine.spi;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public interface SingleTableStatement extends Statement {
public TableProvider getTable();
public void setTable(TableProvider tableName);
}
......@@ -7,14 +7,10 @@ import com.dianping.bee.engine.spi.meta.RowSet;
public interface Statement {
public IndexMeta getIndex();
public RowFilter getRowFilter();
public ColumnMeta[] getSelectColumns();
public void setIndex(IndexMeta index);
public void setRowFilter(RowFilter rowFilter);
public void setSelectColumns(ColumnMeta[] selectColumns);
public RowSet query();
......
package com.dianping.bee.engine.spi;
import com.dianping.bee.engine.spi.meta.IndexMeta;
import com.dianping.bee.engine.spi.meta.RowSet;
public interface TableExecutor {
public void execute(RowSet rowset, IndexMeta index, Object[] values);
}
......@@ -11,9 +11,5 @@ public interface TableProvider {
public String getName();
/**
* @param m_index
* @param m_selectColumns
*/
public RowSet queryByIndex(IndexMeta m_index, ColumnMeta[] m_selectColumns);
public RowSet queryByIndex(IndexMeta m_index, ColumnMeta[] m_selectColumns) throws Exception;
}
package com.dianping.bee.engine.spi.index;
import com.dianping.bee.engine.spi.row.RowContext;
public interface Index<T> {
public void queryById(RowContext ctx, T id) throws Exception;
public void queryByIds(RowContext ctx, T[] ids) throws Exception;
public void queryByRange(RowContext ctx, T start, T end, RangeType rangeType) throws Exception;
}
package com.dianping.bee.engine.spi.index;
public class Pair<S, T> {
private S m_key;
private T m_value;
public Pair(S key, T value) {
m_key = key;
m_value = value;
}
public S getKey() {
return m_key;
}
public T getValue() {
return m_value;
}
}
package com.dianping.bee.engine.spi.index;
public enum RangeType {
II(true, true),
IE(true, false),
EI(false, true),
EE(false, false);
private boolean m_startInclusive;
private boolean m_endInclusive;
private RangeType(boolean startInclusive, boolean endInclusive) {
m_startInclusive = startInclusive;
m_endInclusive = endInclusive;
}
protected boolean isStartInclusive() {
return m_startInclusive;
}
protected boolean isEndInclusive() {
return m_endInclusive;
}
}
\ No newline at end of file
package com.dianping.bee.engine.spi.internal;
import java.util.List;
import com.dianping.bee.engine.spi.MultiTableStatement;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.TableProvider;
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 class DefaultMultiTableStatement implements MultiTableStatement {
private List<TableProvider> m_tables;
private RowFilter m_rowFilter;
private IndexMeta m_index;
private ColumnMeta[] m_selectColumns;
@Override
public IndexMeta getIndex() {
return m_index;
}
@Override
public RowFilter getRowFilter() {
return m_rowFilter;
}
@Override
public ColumnMeta[] getSelectColumns() {
return m_selectColumns;
}
@Override
public List<TableProvider> getTables() {
return m_tables;
}
@Override
public void setIndex(IndexMeta index) {
m_index = index;
}
@Override
public void setRowFilter(RowFilter rowFilter) {
m_rowFilter = rowFilter;
}
@Override
public void setSelectColumns(ColumnMeta[] selectColumns) {
m_selectColumns = selectColumns;
}
@Override
public void setTables(List<TableProvider> tables) {
m_tables = tables;
}
@Override
public RowSet query() {
return null;
}
}
package com.dianping.bee.engine.spi.internal;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.visitor.MySQLOutputASTVisitor;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.meta.Row;
public class DefaultRowFilter implements RowFilter {
private Expression m_expr;
/**
* Return true if the row passed the filter
*/
@Override
public boolean filter(Row row) {
return true;
}
@Override
public void setExpression(Expression expr) {
m_expr = expr;
}
public String toString() {
MySQLOutputASTVisitor visitor = new MySQLOutputASTVisitor(new StringBuilder());
m_expr.accept(visitor);
return visitor.getSql();
}
}
......@@ -39,11 +39,7 @@ public class DefaultStatementManager extends ContainerHolder implements Statemen
DefaultStatementVisitor defaultVisitor = new DefaultStatementVisitor();
statement.accept(defaultVisitor);
if (defaultVisitor.getTableAlias().size() > 1) {
MultiTableStatementVisitor visitor = lookup(MultiTableStatementVisitor.class);
statement.accept(visitor);
return visitor.getStatement();
} else if (defaultVisitor.getTableAlias().size() == 1) {
if (defaultVisitor.getTableAlias().size() == 1) {
SingleTableStatementVisitor visitor = lookup(SingleTableStatementVisitor.class);
statement.accept(visitor);
return visitor.getStatement();
......
/**
* Project: bee-engine
*
* File Created at 2012-8-23
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.engine.spi.internal;
import com.alibaba.cobar.parser.visitor.EmptySQLASTVisitor;
import com.dianping.bee.engine.spi.MultiTableStatement;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class MultiTableStatementVisitor extends EmptySQLASTVisitor {
@Inject
private MultiTableStatement m_stmt;
/**
* @return
*/
public MultiTableStatement getStatement() {
return m_stmt;
}
}
package com.dianping.bee.engine.spi.internal;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.SingleTableStatement;
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;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.row.DefaultRowContext;
import com.dianping.bee.engine.spi.row.DefaultRowListener;
import com.dianping.bee.engine.spi.row.RowContext;
import com.dianping.bee.engine.spi.row.RowFilter;
import com.site.lookup.ContainerHolder;
public class DefaultSingleTableStatement implements SingleTableStatement {
public class SingleTableStatement extends ContainerHolder implements Statement {
private TableProvider m_table;
private RowFilter m_rowFilter;
......@@ -21,27 +26,16 @@ public class DefaultSingleTableStatement implements SingleTableStatement {
return m_index;
}
@Override
public RowFilter getRowFilter() {
return m_rowFilter;
}
@Override
public ColumnMeta[] getSelectColumns() {
return m_selectColumns;
}
@Override
public TableProvider getTable() {
return m_table;
}
@Override
public void setIndex(IndexMeta index) {
m_index = index;
}
@Override
public void setRowFilter(RowFilter rowFilter) {
m_rowFilter = rowFilter;
}
......@@ -55,29 +49,25 @@ public class DefaultSingleTableStatement implements SingleTableStatement {
}
}
@Override
public void setTable(TableProvider table) {
m_table = table;
}
@Override
public RowSet query() {
// Query By Index
RowSet providerRowSet = m_table.queryByIndex(m_index, m_selectColumns);
// Filter
if (providerRowSet != null) {
providerRowSet.filter(m_rowFilter);
}
// Build select columns
RowSet returnRowSet = buildReturnRowSet(providerRowSet);
return returnRowSet;
}
Index<?> index = lookup(m_index.getIndexClass());
RowContext ctx = new DefaultRowContext(m_selectColumns);
DefaultRowListener listener = new DefaultRowListener(m_selectColumns);
/**
* @param providerRowSet
* @return
*/
private RowSet buildReturnRowSet(RowSet c) {
return c;
listener.setRowFilter(m_rowFilter);
ctx.setRowListener(listener);
try {
index.queryById(ctx, null);
return listener.getRowSet();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
......@@ -10,8 +10,6 @@ import com.alibaba.cobar.parser.ast.fragment.tableref.TableReference;
import com.alibaba.cobar.parser.ast.stmt.dml.DMLSelectStatement;
import com.alibaba.cobar.parser.util.Pair;
import com.alibaba.cobar.parser.visitor.EmptySQLASTVisitor;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.SingleTableStatement;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.site.lookup.annotation.Inject;
......@@ -37,9 +35,6 @@ public class SingleTableStatementVisitor extends EmptySQLASTVisitor {
@Inject
private SingleTableStatement m_stmt;
@Inject
private RowFilter m_rowFilter;
private String m_alias;
private String m_tableName;
......@@ -132,8 +127,9 @@ public class SingleTableStatementVisitor extends EmptySQLASTVisitor {
where.accept(this);
// to evaluate where clause
m_rowFilter.setExpression(where);
m_stmt.setRowFilter(m_rowFilter);
// m_rowFilter.setExpression(where);
// m_stmt.setRowFilter(m_rowFilter);
if (m_databaseName == null) {
m_stmt.setIndex(m_helper.findIndex(m_tableName, m_whereColumns));
} else {
......
package com.dianping.bee.engine.spi.meta;
public abstract class AbstractIndex implements Index {
@Override
public IndexMeta getMeta() {
return null;
}
@Override
public void setValue(int index, Object value) {
}
@Override
public void addValue(int index, Object value, PredicateType type) {
}
}
package com.dianping.bee.engine.spi.meta;
import java.util.ArrayList;
import java.util.List;
import com.dianping.bee.engine.spi.index.Index;
public abstract class AbstractIndexMeta<T extends ColumnMeta> implements IndexMeta {
private List<T> m_columns;
private boolean[] m_orders;
@SuppressWarnings("unchecked")
protected AbstractIndexMeta(Object... args) {
int length = args.length;
if (length % 2 != 0) {
throw new IllegalArgumentException(String.format("Parameters should be paired for %s!", getClass()));
}
m_columns = new ArrayList<T>(length / 2);
m_orders = new boolean[length / 2];
for (int i = 0; i < length / 2; i++) {
m_columns.add((T) args[2 * i]);
m_orders[i] = (Boolean) args[2 * i + 1];
}
}
@Override
public T getColumn(int index) {
if (index >= 0 && index < m_columns.size()) {
return m_columns.get(index);
} else {
throw new IndexOutOfBoundsException("size: " + m_columns.size() + ", index: " + index);
}
}
@Override
public int getLength() {
return m_columns.size();
}
@Override
public boolean isAscend(int index) {
if (index >= 0 && index < m_orders.length) {
return m_orders[index];
} else {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
}
@Override
public Class<? extends Index<?>> getIndexClass() {
throw new UnsupportedOperationException("Not implemented yet!");
}
}
\ No newline at end of file
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.row.RowContext;
public interface Index {
public IndexMeta getMeta();
......@@ -9,7 +9,9 @@ public interface Index {
public void addValue(int index, Object value, PredicateType type);
public void scan(RowSet rowset, RowFilter filter);
public void findByKey(RowContext ctx);
public void findByRange(RowContext ctx);
public static enum PredicateType {
LT("<"),
......
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.index.Index;
public interface IndexMeta {
public int getLength();
public ColumnMeta getColumn(int index);
public boolean isAscend(int index);
public Class<? extends Index<?>> getIndexClass();
}
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.RowFilter;
public interface RowSet {
/**
* @param rowFilter
*/
public void filter(RowFilter rowFilter);
public ColumnMeta getColumn(int colIndex);
public int getColumnSize();
......
......@@ -15,10 +15,8 @@
package com.dianping.bee.engine.spi.meta.internal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
......@@ -41,19 +39,6 @@ public class DefaultRowSet implements RowSet {
this.m_rows.add(row);
}
@Override
public void filter(RowFilter rowFilter) {
if (rowFilter == null)
return;
Iterator<Row> it = m_rows.iterator();
while (it.hasNext()) {
Row row = it.next();
if (!rowFilter.filter(row)) {
it.remove();
}
}
}
@Override
public ColumnMeta getColumn(int colIndex) {
if (colIndex >= 0 && colIndex < m_columnMetas.length) {
......
package com.dianping.bee.engine.spi.row;
import java.util.Arrays;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
public class DefaultRowContext implements RowContext {
private ColumnMeta[] m_columns;
private Object[] m_values;
private RowListener m_listener;
public DefaultRowContext(ColumnMeta[] columns) {
m_columns = columns;
m_values = new Object[columns.length];
}
@Override
public void apply() {
m_listener.onRow(this);
Arrays.fill(m_values, null);
}
@SuppressWarnings("unchecked")
@Override
public <T extends ColumnMeta> T getColumn(int colIndex) {
return (T) m_columns[colIndex];
}
@Override
public int getColumnSize() {
return m_columns.length;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getValue(int colIndex) {
return (T) m_values[colIndex];
}
@Override
public void setColumnValue(int colIndex, Object value) {
m_values[colIndex] = value;
}
@Override
public void setRowListener(RowListener listener) {
m_listener = listener;
}
}
package com.dianping.bee.engine.spi.row;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
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 DefaultRowListener implements RowListener {
private RowFilter m_filter;
private DefaultRowSet m_rowset;
public DefaultRowListener(ColumnMeta[] selectColumns) {
m_rowset = new DefaultRowSet(selectColumns);
}
@Override
public void onRow(RowContext ctx) {
if (m_filter == null || m_filter.filter(ctx)) {
int cols = m_rowset.getColumnSize();
Cell[] cells = new Cell[cols];
for (int i = 0; i < cols; i++) {
cells[i] = new DefaultCell(ctx.getColumn(i), ctx.getValue(i));
}
m_rowset.addRow(new DefaultRow(cells));
}
}
public void setRowFilter(RowFilter filter) {
m_filter = filter;
}
public RowSet getRowSet() {
return m_rowset;
}
}
package com.dianping.bee.engine.spi.row;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
public interface RowContext {
public int getColumnSize();
public <T extends ColumnMeta> T getColumn(int colIndex);
public <T> T getValue(int colIndex);
public void apply();
public void setColumnValue(int colIndex, Object value);
public void setRowListener(RowListener listener);
}
package com.dianping.bee.engine.spi.row;
public interface RowFilter {
public boolean filter(RowContext ctx);
}
package com.dianping.bee.engine.spi.row;
public interface RowListener {
public void onRow(RowContext ctx);
}
......@@ -7,8 +7,7 @@
<component>
<role>com.dianping.bee.engine.spi.DatabaseProvider</role>
<role-hint>information_schema</role-hint>
<implementation>com.dianping.bee.server.InformationSchemaDatabase
</implementation>
<implementation>com.dianping.bee.server.InformationSchemaDatabase</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.DatabaseProvider</role>
......@@ -22,13 +21,11 @@
</component>
<component>
<role>com.dianping.bee.engine.spi.session.SessionManager</role>
<implementation>com.dianping.bee.engine.spi.session.DefaultSessionManager
</implementation>
<implementation>com.dianping.bee.engine.spi.session.DefaultSessionManager</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.TableProviderManager</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultTableProviderManager
</implementation>
<implementation>com.dianping.bee.engine.spi.internal.DefaultTableProviderManager</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.session.SessionManager</role>
......@@ -37,31 +34,16 @@
</component>
<component>
<role>com.dianping.bee.engine.spi.StatementManager</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultStatementManager
</implementation>
<implementation>com.dianping.bee.engine.spi.internal.DefaultStatementManager</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.SingleTableStatement</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultSingleTableStatement
</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
<component>
<role>com.dianping.bee.engine.spi.MultiTableStatement</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultMultiTableStatement
</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
<component>
<role>com.dianping.bee.engine.spi.RowFilter</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultRowFilter
</implementation>
<implementation>com.dianping.bee.engine.spi.internal.DefaultSingleTableStatement</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>
<implementation>com.dianping.bee.engine.spi.internal.TableHelper</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.TableProviderManager</role>
......@@ -69,10 +51,8 @@
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor
</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor
</implementation>
<role>com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor</role>
<implementation>com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
......@@ -81,71 +61,41 @@
<requirement>
<role>com.dianping.bee.engine.spi.SingleTableStatement</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.RowFilter</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor
</role>
<implementation>com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor
</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.internal.TableHelper</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.MultiTableStatement</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.RowFilter</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.server.SimpleServerQueryHandler</role>
<implementation>com.dianping.bee.server.SimpleServerQueryHandler
</implementation>
<implementation>com.dianping.bee.server.SimpleServerQueryHandler</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.handler.internal.SelectHandler
</role>
<role>com.dianping.bee.engine.spi.handler.internal.SelectHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.handler.internal.ShowHandler
</role>
<role>com.dianping.bee.engine.spi.handler.internal.ShowHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.handler.internal.DescHandler
</role>
<role>com.dianping.bee.engine.spi.handler.internal.DescHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.handler.internal.UseHandler
</role>
<role>com.dianping.bee.engine.spi.handler.internal.UseHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.handler.internal.PrepareHandler
</role>
<role>com.dianping.bee.engine.spi.handler.internal.PrepareHandler</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.UseHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.UseHandler
</implementation>
<implementation>com.dianping.bee.engine.spi.handler.internal.UseHandler</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.ShowHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.ShowHandler
</implementation>
<implementation>com.dianping.bee.engine.spi.handler.internal.ShowHandler</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.DescHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.DescHandler
</implementation>
<implementation>com.dianping.bee.engine.spi.handler.internal.DescHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.TableProviderManager</role>
......@@ -153,10 +103,8 @@
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.SelectHandler
</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.SelectHandler
</implementation>
<role>com.dianping.bee.engine.spi.handler.internal.SelectHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.SelectHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.StatementManager</role>
......@@ -164,10 +112,8 @@
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.PrepareHandler
</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.PrepareHandler
</implementation>
<role>com.dianping.bee.engine.spi.handler.internal.PrepareHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.PrepareHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.StatementManager</role>
......
......@@ -4,6 +4,7 @@ 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;
......@@ -194,6 +195,11 @@ public class CatDatabase implements DatabaseProvider {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
}
@Override
public Class<? extends Index<?>> getIndexClass() {
throw new UnsupportedOperationException("Not implemented yet!");
}
}
public static enum TransactionColumn implements ColumnMeta {
......@@ -287,6 +293,11 @@ public class CatDatabase implements DatabaseProvider {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
}
@Override
public Class<? extends Index<?>> getIndexClass() {
throw new UnsupportedOperationException("Not implemented yet!");
}
}
@Override
......
......@@ -4,6 +4,7 @@ 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;
......@@ -177,6 +178,11 @@ public class DogDatabase implements DatabaseProvider {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
}
@Override
public Class<? extends Index<?>> getIndexClass() {
throw new UnsupportedOperationException("Not implemented yet!");
}
}
@Override
......
......@@ -15,6 +15,10 @@
<artifactId>bee-engine</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-consumer</artifactId>
</dependency>
<dependency>
<groupId>com.site.common</groupId>
<artifactId>test-framework</artifactId>
......
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()),
......@@ -50,7 +56,15 @@ public enum CatTableProvider implements TableProvider {
}
@Override
public RowSet queryByIndex(IndexMeta index, ColumnMeta[] selectColumns) {
return null;
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
......@@ -5,6 +5,7 @@ import java.util.List;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.cat.data.CatDatabaseProvider;
import com.dianping.cat.data.transaction.TransactionIndexer;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
......@@ -15,6 +16,8 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(DatabaseProvider.class, CatDatabaseProvider.ID, CatDatabaseProvider.class));
all.add(C(TransactionIndexer.class));
return all;
}
......
package com.dianping.cat.data.event;
import com.dianping.bee.engine.spi.meta.AbstractIndexMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
public enum EventIndex implements IndexMeta {
IDX_STARTTIME_DOMAIN(EventColumn.StartTime, false, EventColumn.Domain, true);
private EventColumn[] m_columns;
private boolean[] m_orders;
public class EventIndex extends AbstractIndexMeta<EventColumn> implements IndexMeta {
public static final EventIndex IDX_STARTTIME_DOMAIN = new EventIndex(EventColumn.StartTime, false,
EventColumn.Domain, true);
private EventIndex(Object... args) {
int length = args.length;
if (length % 2 != 0) {
throw new IllegalArgumentException(String.format("Parameters should be paired for %s(%s)!", getClass(), name()));
}
m_columns = new EventColumn[length / 2];
m_orders = new boolean[length / 2];
for (int i = 0; i < length / 2; i++) {
m_columns[i] = (EventColumn) args[2 * i];
m_orders[i] = (Boolean) args[2 * i + 1];
}
}
@Override
public EventColumn getColumn(int index) {
if (index >= 0 && index < m_columns.length) {
return m_columns[index];
} else {
throw new IndexOutOfBoundsException("size: " + m_columns.length + ", index: " + index);
}
}
@Override
public int getLength() {
return m_columns.length;
super(args);
}
@Override
public boolean isAscend(int index) {
if (index >= 0 && index < m_orders.length) {
return m_orders[index];
} else {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
public static EventIndex[] values() {
return new EventIndex[] { IDX_STARTTIME_DOMAIN };
}
}
\ No newline at end of file
package com.dianping.cat.data.transaction;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.TableExecutor;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.meta.internal.DefaultRowSet;
public class TransactionExecutor implements TableExecutor<TransactionIndex, TransactionColumn> {
@Override
public RowSet execute(TransactionIndex index, TransactionColumn[] columns, RowFilter filter) {
RowSet rowset = new DefaultRowSet(columns);
if (index == TransactionIndex.IDX_STARTTIME_DOMAIN) {
} else {
}
return rowset;
}
}
package com.dianping.cat.data.transaction;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.meta.AbstractIndexMeta;
import com.dianping.bee.engine.spi.meta.IndexMeta;
public enum TransactionIndex implements IndexMeta {
IDX_STARTTIME_DOMAIN(TransactionColumn.StartTime, false, TransactionColumn.Domain, true);
private TransactionColumn[] m_columns;
private boolean[] m_orders;
public class TransactionIndex extends AbstractIndexMeta<TransactionColumn> implements IndexMeta {
public static final TransactionIndex IDX_STARTTIME_DOMAIN = new TransactionIndex(TransactionColumn.StartTime, false,
TransactionColumn.Domain, true);
private TransactionIndex(Object... args) {
int length = args.length;
if (length % 2 != 0) {
throw new IllegalArgumentException(String.format("Parameters should be paired for %s(%s)!", getClass(), name()));
}
m_columns = new TransactionColumn[length / 2];
m_orders = new boolean[length / 2];
for (int i = 0; i < length / 2; i++) {
m_columns[i] = (TransactionColumn) args[2 * i];
m_orders[i] = (Boolean) args[2 * i + 1];
}
super(args);
}
@Override
public TransactionColumn getColumn(int index) {
if (index >= 0 && index < m_columns.length) {
return m_columns[index];
} else {
throw new IndexOutOfBoundsException("size: " + m_columns.length + ", index: " + index);
}
public Class<? extends Index<?>> getIndexClass() {
return TransactionIndexer.class;
}
@Override
public int getLength() {
return m_columns.length;
}
@Override
public boolean isAscend(int index) {
if (index >= 0 && index < m_orders.length) {
return m_orders[index];
} else {
throw new IndexOutOfBoundsException("size: " + m_orders.length + ", index: " + index);
}
public static TransactionIndex[] values() {
return new TransactionIndex[] { IDX_STARTTIME_DOMAIN };
}
}
\ No newline at end of file
package com.dianping.cat.data.transaction;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.xml.sax.SAXException;
import com.dianping.bee.engine.spi.index.Index;
import com.dianping.bee.engine.spi.index.Pair;
import com.dianping.bee.engine.spi.index.RangeType;
import com.dianping.bee.engine.spi.row.RowContext;
import com.dianping.cat.consumer.transaction.model.entity.Machine;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
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");
}
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);
} else {
for (TransactionName name : type.getNames().values()) {
applyRow(ctx, type, name);
}
}
}
}
private void applyRow(RowContext ctx, TransactionType type, TransactionName name) {
int cols = ctx.getColumnSize();
for (int i = 0; i < cols; i++) {
TransactionColumn column = ctx.getColumn(i);
switch (column) {
case Type:
ctx.setColumnValue(i, type.getId());
break;
case Name:
ctx.setColumnValue(i, name == null ? null : name.getId());
default:
// TODO more here
}
}
ctx.apply();
}
@Override
public void queryByIds(RowContext ctx, Pair<String, String>[] pairs) throws Exception {
throw new UnsupportedOperationException("Not implemented yet!");
}
@Override
public void queryByRange(RowContext ctx, Pair<String, String> start, Pair<String, String> end, RangeType rangeType)
throws Exception {
throw new UnsupportedOperationException("Not implemented yet!");
}
private TransactionReport getHourlyReport(String domain, String date) throws IOException, SAXException {
URL url = new URL(String.format("http://localhost:2281/cat/r/t?domain=%s&date=%s&xml=true", domain, date));
InputStream in = url.openStream();
try {
TransactionReport report = DefaultSaxParser.parse(in);
return report;
} finally {
in.close();
}
}
}
......@@ -5,5 +5,9 @@
<role-hint>cat</role-hint>
<implementation>com.dianping.cat.data.CatDatabaseProvider</implementation>
</component>
<component>
<role>com.dianping.cat.data.transaction.TransactionIndexer</role>
<implementation>com.dianping.cat.data.transaction.TransactionIndexer</implementation>
</component>
</components>
</plexus>
package com.dianping.cat.data;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.alibaba.cobar.CobarServer;
import com.dianping.bee.server.SimpleServer;
import com.site.lookup.ComponentTestCase;
@RunWith(JUnit4.class)
public class BeeTestServer extends ComponentTestCase {
@Test
public void runServer() throws Exception {
SimpleServer server = lookup(SimpleServer.class);
server.startup();
System.out.println(CobarServer.getInstance().getConfig().getUsers());
System.out.println("Press any key to continue ...");
System.in.read();
}
}
package com.dianping.cat.data;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.site.lookup.ComponentTestCase;
@RunWith(JUnit4.class)
public class TransactionTest extends ComponentTestCase {
private Connection m_conn;
@Before
public void before() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:2330/cat?useServerPrepStmts=true";
String driver = "com.mysql.jdbc.Driver";
String userName = "test";
String password = "test";
Class.forName(driver).newInstance();
DriverManager.setLoginTimeout(600);
m_conn = DriverManager.getConnection(url, userName, password);
}
@Test
public void testQuery1() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
String sql = "select type from transaction where domain='Cat' and starttime is null";
ResultSet rs = m_conn.createStatement().executeQuery(sql);
Assert.assertNotNull(rs);
rs.last();
Assert.assertTrue(rs.getRow() > 0);
displayResultSet(rs);
m_conn.close();
}
private void displayResultSet(ResultSet rs) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
int columns = meta.getColumnCount();
for (int column = 1; column <= columns; column++) {
String columnName = meta.getColumnName(column);
System.out.print(columnName + "\t");
}
System.out.println();
rs.first();
while (rs.next()) {
for (int column = 1; column <= columns; column++) {
System.out.print(rs.getString(column) + "\t");
}
System.out.println();
}
}
}
......@@ -57,6 +57,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject
private XmlViewer m_xmlViewer;
@Inject
private TransactionMerger m_transactionMerger;
......@@ -206,10 +209,15 @@ public class Handler implements PageHandler<Context> {
}
break;
}
m_jspViewer.view(ctx, model);
if (payload.isXml()) {
m_xmlViewer.view(ctx, model);
} else {
m_jspViewer.view(ctx, model);
}
}
public void normalize(Model model, Payload payload) {
private void normalize(Model model, Payload payload) {
Action action = payload.getAction();
model.setAction(action);
model.setPage(ReportPage.TRANSACTION);
......@@ -271,8 +279,8 @@ public class Handler implements PageHandler<Context> {
String graph1 = m_builder.build(new DurationPayload("Duration Distribution", "Duration (ms)", "Count", name));
String graph2 = m_builder.build(new HitPayload("Hits Over Time", "Time (min)", "Count", name));
String graph3 = m_builder.build(new AverageTimePayload("Average Duration Over Time", "Time (min)",
"Average Duration (ms)", name));
String graph3 = m_builder.build(new AverageTimePayload("Average Duration Over Time", "Time (min)", "Average Duration (ms)",
name));
String graph4 = m_builder.build(new FailurePayload("Failures Over Time", "Time (min)", "Count", name));
model.setGraph1(graph1);
......@@ -365,8 +373,7 @@ public class Handler implements PageHandler<Context> {
calculateTps(payload, transactionReport);
model.setReport(transactionReport);
if (!StringUtils.isEmpty(type)) {
model.setDisplayNameReport(new DisplayNames().display(sorted, type, ip, transactionReport,
payload.getQueryName()));
model.setDisplayNameReport(new DisplayNames().display(sorted, type, ip, transactionReport, payload.getQueryName()));
} else {
model.setDisplayTypeReport(new DisplayTypes().display(sorted, ip, transactionReport));
}
......
......@@ -20,6 +20,9 @@ public class Payload extends AbstractReportPayload<Action> {
@FieldMeta("type")
private String m_type;
@FieldMeta("xml")
private boolean m_xml;
public Payload() {
super(ReportPage.TRANSACTION);
......@@ -46,6 +49,10 @@ public class Payload extends AbstractReportPayload<Action> {
return m_type;
}
public boolean isXml() {
return m_xml;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
......@@ -66,6 +73,10 @@ public class Payload extends AbstractReportPayload<Action> {
m_type = type;
}
public void setXml(boolean xml) {
m_xml = xml;
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
......
package com.dianping.cat.report.page.transaction;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.report.ReportPage;
import com.site.web.mvc.view.Viewer;
public class XmlViewer implements Viewer<ReportPage, Action, Context, Model> {
public void view(Context ctx, Model model) throws ServletException, IOException {
TransactionReport report = model.getReport();
HttpServletResponse res = ctx.getHttpServletResponse();
if (report != null) {
ServletOutputStream out = res.getOutputStream();
res.setContentType("text/xml");
out.print(report.toString());
} else {
res.sendError(404, "Not found!");
}
}
}
......@@ -845,6 +845,9 @@
<requirement>
<role>com.dianping.cat.report.page.transaction.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.transaction.XmlViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.transaction.TransactionMerger</role>
</requirement>
......@@ -874,6 +877,10 @@
<role>com.dianping.cat.report.page.transaction.JspViewer</role>
<implementation>com.dianping.cat.report.page.transaction.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.transaction.XmlViewer</role>
<implementation>com.dianping.cat.report.page.transaction.XmlViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.transaction.TransactionMerger</role>
<implementation>com.dianping.cat.report.task.transaction.TransactionMerger</implementation>
......
......@@ -55,7 +55,7 @@
<dependency>
<groupId>com.site.common</groupId>
<artifactId>lookup</artifactId>
<version>1.1.3</version>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
......
......@@ -72,6 +72,7 @@ CREATE TABLE `task` (
`report_domain` varchar(20) NOT NULL COMMENT '报表处理的Domain信息',
`report_period` datetime NOT NULL COMMENT '报表时间',
`status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed',
`task_type` tinyint(4) NOT NULL COMMENT '执行状态: /daily',
`creation_date` datetime NOT NULL COMMENT '任务创建时间',
`start_date` datetime NULL COMMENT '开始时间, 这次执行开始时间',
`end_date` datetime NULL COMMENT '结束时间, 这次执行结束时间',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册