提交 bc221d62 编写于 作者: Y Yiming Liu

refactor and integrate test

上级 06f03b7c
......@@ -14,7 +14,6 @@ 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.DefaultStatementVisitor;
import com.dianping.bee.engine.spi.internal.DefaultTableProviderManager;
import com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor;
import com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor;
......@@ -44,7 +43,6 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(TableHelper.class) //
.req(TableProviderManager.class));
all.add(C(DefaultStatementVisitor.class).is(PER_LOOKUP));
all.add(C(SingleTableStatementVisitor.class).is(PER_LOOKUP) //
.req(TableHelper.class, SingleTableStatement.class, RowFilter.class));
all.add(C(MultiTableStatementVisitor.class).is(PER_LOOKUP) //
......
......@@ -20,7 +20,7 @@ import java.util.List;
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public interface MultiTableStatement extends Statement {
public List<String> getTableNames();
public List<TableProvider> getTables();
public void setTableNames(List<String> tableName);
public void setTables(List<TableProvider> tables);
}
package com.dianping.bee.engine.spi;
import java.util.List;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.dianping.bee.engine.spi.meta.Row;
public interface RowFilter {
public boolean filter(List<Object> values);
public boolean filter(Row row);
public void setExpression(Expression where);
}
......@@ -18,7 +18,7 @@ package com.dianping.bee.engine.spi;
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public interface SingleTableStatement extends Statement {
public String getTableName();
public TableProvider getTable();
public void setTableName(String tableName);
public void setTable(TableProvider tableName);
}
......@@ -3,6 +3,8 @@ package com.dianping.bee.engine.spi;
import java.util.List;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Index;
import com.dianping.bee.engine.spi.meta.RowSet;
public interface Statement {
public Index getIndex();
......
package com.dianping.bee.engine.spi;
import java.util.List;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Index;
import com.dianping.bee.engine.spi.meta.RowSet;
public interface TableProvider {
public String getName();
public ColumnMeta[] getColumns();
public Index[] getIndexes();
public String getName();
/**
* @param m_index
* @param m_selectColumns
*/
public RowSet queryByIndex(Index m_index, List<ColumnMeta> m_selectColumns);
}
......@@ -2,14 +2,15 @@ package com.dianping.bee.engine.spi.internal;
import java.util.List;
import com.dianping.bee.engine.spi.Index;
import com.dianping.bee.engine.spi.MultiTableStatement;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.RowSet;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Index;
import com.dianping.bee.engine.spi.meta.RowSet;
public class DefaultMultiTableStatement implements MultiTableStatement {
private List<String> m_tableNames;
private List<TableProvider> m_tables;
private RowFilter m_rowFilter;
......@@ -33,8 +34,8 @@ public class DefaultMultiTableStatement implements MultiTableStatement {
}
@Override
public List<String> getTableNames() {
return m_tableNames;
public List<TableProvider> getTables() {
return m_tables;
}
@Override
......@@ -53,8 +54,8 @@ public class DefaultMultiTableStatement implements MultiTableStatement {
}
@Override
public void setTableNames(List<String> tableNames) {
m_tableNames = tableNames;
public void setTables(List<TableProvider> tables) {
m_tables = tables;
}
@Override
......
package com.dianping.bee.engine.spi.internal;
import java.util.List;
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;
@Override
public boolean filter(List<Object> values) {
return false;
public boolean filter(Row row) {
return true;
}
@Override
......@@ -21,7 +20,7 @@ public class DefaultRowFilter implements RowFilter {
public String toString() {
MySQLOutputASTVisitor visitor = new MySQLOutputASTVisitor(new StringBuilder());
m_expr.accept(visitor);
return visitor.getSql();
}
......
......@@ -2,14 +2,15 @@ package com.dianping.bee.engine.spi.internal;
import java.util.List;
import com.dianping.bee.engine.spi.Index;
import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.RowSet;
import com.dianping.bee.engine.spi.SingleTableStatement;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Index;
import com.dianping.bee.engine.spi.meta.RowSet;
public class DefaultSingleTableStatement implements SingleTableStatement {
private String m_tableName;
private TableProvider m_table;
private RowFilter m_rowFilter;
......@@ -33,8 +34,8 @@ public class DefaultSingleTableStatement implements SingleTableStatement {
}
@Override
public String getTableName() {
return m_tableName;
public TableProvider getTable() {
return m_table;
}
@Override
......@@ -53,12 +54,27 @@ public class DefaultSingleTableStatement implements SingleTableStatement {
}
@Override
public void setTableName(String tableName) {
m_tableName = tableName;
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
providerRowSet.filter(m_rowFilter);
// Build select columns
RowSet returnRowSet = buildReturnRowSet(providerRowSet);
return returnRowSet;
}
/**
* @param providerRowSet
* @return
*/
private RowSet buildReturnRowSet(RowSet providerRowSet) {
return null;
}
}
......@@ -34,7 +34,7 @@ public class DefaultStatementManager extends ContainerHolder implements Statemen
private Statement parseSQL(String sql) throws SQLSyntaxErrorException {
SQLStatement statement = SQLParserDelegate.parse(sql);
DefaultStatementVisitor defaultVisitor = lookup(DefaultStatementVisitor.class);
DefaultStatementVisitor defaultVisitor = new DefaultStatementVisitor();
statement.accept(defaultVisitor);
if (defaultVisitor.getTableAlias().size() > 1) {
......
......@@ -65,7 +65,7 @@ public class SingleTableStatementVisitor extends EmptySQLASTVisitor {
throw new RuntimeException("Not a single table query!");
}
m_stmt.setTableName(m_tableName);
m_stmt.setTable(m_helper.findTable(m_tableName));
// for select clause
m_clause = Clause.SELECT;
......
......@@ -2,10 +2,10 @@ package com.dianping.bee.engine.spi.internal;
import java.util.List;
import com.dianping.bee.engine.spi.Index;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Index;
import com.site.lookup.annotation.Inject;
public class TableHelper {
......
package com.dianping.bee.engine.spi;
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
public interface Cell {
public ColumnMeta getMeta();
......
......@@ -4,6 +4,4 @@ public interface ColumnMeta {
public String getName();
public Class<?> getType();
public int getCobarType();
}
package com.dianping.bee.engine.spi;
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
public interface Index {
public int getLength();
......
package com.dianping.bee.engine.spi;
package com.dianping.bee.engine.spi.meta;
public interface Row {
public Cell getCell(int colIndex);
......
package com.dianping.bee.engine.spi;
package com.dianping.bee.engine.spi.meta;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.RowFilter;
public interface RowSet {
/**
* @param rowFilter
*/
public void filter(RowFilter rowFilter);
public ColumnMeta getColumn(int colIndex);
public int getColumns();
......
/**
* 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.meta.internal;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class DefaultCell implements Cell {
private ColumnMeta m_columnMeta;
private Object m_value;
public DefaultCell(ColumnMeta columnMeta, Object value){
this.m_columnMeta = columnMeta;
this.m_value = value;
}
@Override
public ColumnMeta getMeta() {
return m_columnMeta;
}
@Override
public Object getValue() {
return m_value;
}
}
/**
* 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.meta.internal;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.Row;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class DefaultRow implements Row {
private Cell[] m_cells;
public DefaultRow(Cell[] cells){
this.m_cells = cells;
}
@Override
public Cell getCell(int colIndex) {
return m_cells[colIndex];
}
}
/**
* 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.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;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class DefaultRowSet implements RowSet {
public DefaultRowSet(List<ColumnMeta> columnMetas) {
this.m_columnMetas = columnMetas;
this.m_rows = new ArrayList<Row>();
}
private List<ColumnMeta> m_columnMetas;
private List<Row> m_rows;
public void addRow(Row row) {
this.m_rows.add(row);
}
@Override
public ColumnMeta getColumn(int colIndex) {
return m_columnMetas.get(colIndex);
}
@Override
public int getColumns() {
return m_columnMetas.size();
}
@Override
public Row getRow(int rowIndex) {
return m_rows.get(rowIndex);
}
@Override
public int getRows() {
return m_rows.size();
}
@Override
public void filter(RowFilter rowFilter) {
Iterator<Row> it = m_rows.iterator();
while (it.hasNext()) {
Row row = it.next();
if (rowFilter.filter(row)) {
it.remove();
}
}
}
}
......@@ -35,18 +35,39 @@ import com.alibaba.cobar.server.response.SelectVersion;
import com.alibaba.cobar.server.response.SelectVersionComment;
import com.alibaba.cobar.util.IntegerUtil;
import com.alibaba.cobar.util.StringUtil;
import com.dianping.bee.engine.spi.Cell;
import com.dianping.bee.engine.spi.Row;
import com.dianping.bee.engine.spi.RowSet;
import com.dianping.bee.engine.spi.Statement;
import com.dianping.bee.engine.spi.StatementManager;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SelectHandler {
private static int convertJavaTypeToFieldType(Class<?> clazz) {
String simpleClassName = clazz.getSimpleName();
if ("String".equals(simpleClassName)) {
return Fields.FIELD_TYPE_STRING;
} else if ("int".equals(simpleClassName) || "Integer".equals(simpleClassName)) {
return Fields.FIELD_TYPE_INT24;
} else if ("long".equals(simpleClassName) || "Long".equals(simpleClassName)) {
return Fields.FIELD_TYPE_LONG;
} else if ("float".equals(simpleClassName) || "Float".equals(simpleClassName)) {
return Fields.FIELD_TYPE_FLOAT;
} else if ("double".equals(simpleClassName) || "Double".equals(simpleClassName)) {
return Fields.FIELD_TYPE_DOUBLE;
} else if ("Date".equals(simpleClassName)) {
return Fields.FIELD_TYPE_DATE;
} else if ("Timestamp".equals(simpleClassName)) {
return Fields.FIELD_TYPE_TIMESTAMP;
} else {
return Fields.FIELD_TYPE_STRING;
}
}
@Inject
private StatementManager m_manager;
......@@ -59,8 +80,7 @@ public class SelectHandler {
ColumnMeta column = rowset.getColumn(i);
Cell cell = row.getCell(i);
String value = cell.getValue().toString();
switch (column.getCobarType()) {
switch (convertJavaTypeToFieldType(column.getType())) {
case Fields.FIELD_TYPE_STRING:
packet.add(StringUtil.encode(value, charset));
break;
......@@ -95,6 +115,7 @@ public class SelectHandler {
default:
packet.add(StringUtil.encode(value, charset));
}
}
return packet;
}
......@@ -187,7 +208,8 @@ public class SelectHandler {
int columnIndex = 0;
FieldPacket[] fields = new FieldPacket[fieldCount];
for (int i = 0; i < fieldCount; i++) {
fields[columnIndex] = PacketUtil.getField(rowset.getColumn(i).getName(), rowset.getColumn(i).getCobarType());
fields[columnIndex] = PacketUtil.getField(rowset.getColumn(i).getName(), convertJavaTypeToFieldType(rowset
.getColumn(i).getType()));
fields[columnIndex++].packetId = ++packetId;
}
eof.packetId = ++packetId;
......
......@@ -22,8 +22,13 @@
<implementation>com.dianping.bee.engine.spi.internal.DefaultStatementManager</implementation>
</component>
<component>
<role>com.dianping.bee.engine.spi.Statement</role>
<implementation>com.dianping.bee.engine.spi.internal.DefaultStatement</implementation>
<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>
......@@ -49,12 +54,47 @@
<role>com.dianping.bee.engine.spi.internal.TableHelper</role>
</requirement>
<requirement>
<role>com.dianping.bee.engine.spi.Statement</role>
<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.SelectHandler</role>
<implementation>com.dianping.bee.server.SelectHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.StatementManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.server.SimpleServerQueryHandler</role>
<implementation>com.dianping.bee.server.SimpleServerQueryHandler</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.bee.server.SelectHandler</role>
</requirement>
</requirements>
</component>
</components>
</plexus>
package com.dianping.bee.db;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.RandomStringUtils;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.Index;
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.Index;
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 {
@Override
......@@ -55,6 +66,22 @@ public class CatDatabase implements DatabaseProvider {
public String getName() {
return m_name;
}
@Override
public RowSet queryByIndex(Index index, List<ColumnMeta> selectColumns) {
List<ColumnMeta> columns = new ArrayList<ColumnMeta>();
columns.addAll(selectColumns);
DefaultRowSet rowSet = new DefaultRowSet(columns);
for (int i = 0; i < 10; i++) {
Cell[] cells = new Cell[columns.size()];
for(int j=0;j<cells.length;j++){
cells[j] = new DefaultCell(CatDatabase.TransactionColumn.valueOf(columns.get(j).getName()),RandomStringUtils.randomAlphanumeric(5));
}
Row row = new DefaultRow(cells);
rowSet.addRow(row);
}
return rowSet;
}
}
public static enum TransactionColumn implements ColumnMeta {
......@@ -103,11 +130,6 @@ public class CatDatabase implements DatabaseProvider {
return m_type;
}
@Override
public int getCobarType() {
// TODO
return 0;
}
}
public static enum TransactionIndex implements Index {
......@@ -121,7 +143,8 @@ public class CatDatabase implements DatabaseProvider {
int length = args.length;
if (length % 2 != 0) {
throw new IllegalArgumentException(String.format("Parameters should be paired for %s(%s)!", getClass(), name()));
throw new IllegalArgumentException(String.format("Parameters should be paired for %s(%s)!", getClass(),
name()));
}
m_columns = new ColumnMeta[length / 2];
......
......@@ -4,7 +4,10 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.site.lookup.ComponentTestCase;
@RunWith(JUnit4.class)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册