From eb8405583ae682750a0954015cfc9a213ae902e3 Mon Sep 17 00:00:00 2001 From: Frankie Wu Date: Fri, 31 Aug 2012 19:06:07 +0800 Subject: [PATCH] temporary submit to pull change --- .../engine/build/ComponentsConfigurator.java | 16 +--- .../bee/engine/spi/MultiTableStatement.java | 26 ----- .../dianping/bee/engine/spi/RowFilter.java | 10 -- .../bee/engine/spi/SingleTableStatement.java | 24 ----- .../dianping/bee/engine/spi/Statement.java | 4 - .../bee/engine/spi/TableExecutor.java | 8 -- .../bee/engine/spi/TableProvider.java | 6 +- .../dianping/bee/engine/spi/index/Index.java | 11 +++ .../dianping/bee/engine/spi/index/Pair.java | 20 ++++ .../bee/engine/spi/index/RangeType.java | 28 ++++++ .../internal/DefaultMultiTableStatement.java | 65 ------------- .../engine/spi/internal/DefaultRowFilter.java | 30 ------ .../spi/internal/DefaultStatementManager.java | 6 +- .../internal/MultiTableStatementVisitor.java | 36 ------- ...atement.java => SingleTableStatement.java} | 52 ++++------ .../internal/SingleTableStatementVisitor.java | 10 +- .../bee/engine/spi/meta/AbstractIndex.java | 19 ++++ .../engine/spi/meta/AbstractIndexMeta.java | 57 +++++++++++ .../dianping/bee/engine/spi/meta/Index.java | 6 +- .../bee/engine/spi/meta/IndexMeta.java | 4 + .../dianping/bee/engine/spi/meta/RowSet.java | 8 -- .../spi/meta/internal/DefaultRowSet.java | 15 --- .../bee/engine/spi/row/DefaultRowContext.java | 51 ++++++++++ .../engine/spi/row/DefaultRowListener.java | 40 ++++++++ .../bee/engine/spi/row/RowContext.java | 19 ++++ .../bee/engine/spi/row/RowFilter.java | 5 + .../bee/engine/spi/row/RowListener.java | 5 + .../resources/META-INF/plexus/components.xml | 96 ++++--------------- .../java/com/dianping/bee/db/CatDatabase.java | 11 +++ .../java/com/dianping/bee/db/DogDatabase.java | 6 ++ cat-data/pom.xml | 4 + .../dianping/cat/data/CatTableProvider.java | 18 +++- .../data/build/ComponentsConfigurator.java | 3 + .../dianping/cat/data/event/EventIndex.java | 47 ++------- .../data/transaction/TransactionExecutor.java | 21 ---- .../data/transaction/TransactionIndex.java | 47 ++------- .../data/transaction/TransactionIndexer.java | 83 ++++++++++++++++ .../resources/META-INF/plexus/components.xml | 4 + .../com/dianping/cat/data/BeeTestServer.java | 26 +++++ .../dianping/cat/data/TransactionTest.java | 67 +++++++++++++ .../cat/report/page/transaction/Handler.java | 19 ++-- .../cat/report/page/transaction/Payload.java | 11 +++ .../report/page/transaction/XmlViewer.java | 27 ++++++ .../resources/META-INF/plexus/components.xml | 7 ++ pom.xml | 2 +- src/main/conf/Cat.sql | 1 + 46 files changed, 610 insertions(+), 471 deletions(-) delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/MultiTableStatement.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/RowFilter.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/SingleTableStatement.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/TableExecutor.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Index.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Pair.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/index/RangeType.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultMultiTableStatement.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowFilter.java delete mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/MultiTableStatementVisitor.java rename bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/{DefaultSingleTableStatement.java => SingleTableStatement.java} (55%) create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndex.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndexMeta.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowContext.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowListener.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowContext.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowFilter.java create mode 100644 bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowListener.java delete mode 100644 cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionExecutor.java create mode 100644 cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndexer.java create mode 100644 cat-data/src/test/java/com/dianping/cat/data/BeeTestServer.java create mode 100644 cat-data/src/test/java/com/dianping/cat/data/TransactionTest.java create mode 100644 cat-home/src/main/java/com/dianping/cat/report/page/transaction/XmlViewer.java diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/build/ComponentsConfigurator.java b/bee-engine/src/main/java/com/dianping/bee/engine/build/ComponentsConfigurator.java index 3ef48316f..93da071b4 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/build/ComponentsConfigurator.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/build/ComponentsConfigurator.java @@ -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); diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/MultiTableStatement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/MultiTableStatement.java deleted file mode 100644 index 468840c58..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/MultiTableStatement.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 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 Yiming Liu - */ -public interface MultiTableStatement extends Statement { - public List getTables(); - - public void setTables(List tables); -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/RowFilter.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/RowFilter.java deleted file mode 100644 index 5f43ad852..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/RowFilter.java +++ /dev/null @@ -1,10 +0,0 @@ -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); -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/SingleTableStatement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/SingleTableStatement.java deleted file mode 100644 index 21eb9ad65..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/SingleTableStatement.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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 Yiming Liu - */ -public interface SingleTableStatement extends Statement { - public TableProvider getTable(); - - public void setTable(TableProvider tableName); -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java index 3f1f529da..bcdfb7fb3 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/Statement.java @@ -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(); diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableExecutor.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableExecutor.java deleted file mode 100644 index 496914fe4..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableExecutor.java +++ /dev/null @@ -1,8 +0,0 @@ -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); -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableProvider.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableProvider.java index 2d05c2508..d368eda40 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableProvider.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/TableProvider.java @@ -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; } diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Index.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Index.java new file mode 100644 index 000000000..5c42d7f02 --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Index.java @@ -0,0 +1,11 @@ +package com.dianping.bee.engine.spi.index; + +import com.dianping.bee.engine.spi.row.RowContext; + +public interface Index { + 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; +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Pair.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Pair.java new file mode 100644 index 000000000..6c81dff02 --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/Pair.java @@ -0,0 +1,20 @@ +package com.dianping.bee.engine.spi.index; + +public class Pair { + 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; + } +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/RangeType.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/RangeType.java new file mode 100644 index 000000000..3e803290e --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/index/RangeType.java @@ -0,0 +1,28 @@ +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 diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultMultiTableStatement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultMultiTableStatement.java deleted file mode 100644 index 43f92e221..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultMultiTableStatement.java +++ /dev/null @@ -1,65 +0,0 @@ -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 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 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 tables) { - m_tables = tables; - } - - @Override - public RowSet query() { - return null; - } -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowFilter.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowFilter.java deleted file mode 100644 index 103f5e368..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultRowFilter.java +++ /dev/null @@ -1,30 +0,0 @@ -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(); - } -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java index e8b433213..2481a0131 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultStatementManager.java @@ -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(); diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/MultiTableStatementVisitor.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/MultiTableStatementVisitor.java deleted file mode 100644 index 3b339cdea..000000000 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/MultiTableStatementVisitor.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * 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 Yiming Liu - */ -public class MultiTableStatementVisitor extends EmptySQLASTVisitor { - - @Inject - private MultiTableStatement m_stmt; - - /** - * @return - */ - public MultiTableStatement getStatement() { - return m_stmt; - } - -} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultSingleTableStatement.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java similarity index 55% rename from bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultSingleTableStatement.java rename to bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java index 101e781cb..170418d3e 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/DefaultSingleTableStatement.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatement.java @@ -1,13 +1,18 @@ 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); + } } } diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatementVisitor.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatementVisitor.java index f5a74edb8..7af22801a 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatementVisitor.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/internal/SingleTableStatementVisitor.java @@ -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 { diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndex.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndex.java new file mode 100644 index 000000000..75043c3eb --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndex.java @@ -0,0 +1,19 @@ +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) { + + } +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndexMeta.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndexMeta.java new file mode 100644 index 000000000..d00d0626d --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/AbstractIndexMeta.java @@ -0,0 +1,57 @@ +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 implements IndexMeta { + private List 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(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> getIndexClass() { + throw new UnsupportedOperationException("Not implemented yet!"); + } +} \ No newline at end of file diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/Index.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/Index.java index 26956f8f5..747eaf3fb 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/Index.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/Index.java @@ -1,6 +1,6 @@ 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("<"), diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/IndexMeta.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/IndexMeta.java index 998753ee9..0f911c0f2 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/IndexMeta.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/IndexMeta.java @@ -1,9 +1,13 @@ 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> getIndexClass(); } diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/RowSet.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/RowSet.java index c53ce2661..315863d8e 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/RowSet.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/RowSet.java @@ -1,14 +1,6 @@ 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(); diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/internal/DefaultRowSet.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/internal/DefaultRowSet.java index 93281fb62..17c426887 100644 --- a/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/internal/DefaultRowSet.java +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/meta/internal/DefaultRowSet.java @@ -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 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) { diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowContext.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowContext.java new file mode 100644 index 000000000..ed138bb11 --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowContext.java @@ -0,0 +1,51 @@ +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 getColumn(int colIndex) { + return (T) m_columns[colIndex]; + } + + @Override + public int getColumnSize() { + return m_columns.length; + } + + @SuppressWarnings("unchecked") + @Override + public 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; + } +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowListener.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowListener.java new file mode 100644 index 000000000..859547732 --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/DefaultRowListener.java @@ -0,0 +1,40 @@ +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; + } +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowContext.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowContext.java new file mode 100644 index 000000000..e4607a5df --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowContext.java @@ -0,0 +1,19 @@ +package com.dianping.bee.engine.spi.row; + +import com.dianping.bee.engine.spi.meta.ColumnMeta; + +public interface RowContext { + + public int getColumnSize(); + + public T getColumn(int colIndex); + + public T getValue(int colIndex); + + public void apply(); + + public void setColumnValue(int colIndex, Object value); + + public void setRowListener(RowListener listener); + +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowFilter.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowFilter.java new file mode 100644 index 000000000..8420375d4 --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowFilter.java @@ -0,0 +1,5 @@ +package com.dianping.bee.engine.spi.row; + +public interface RowFilter { + public boolean filter(RowContext ctx); +} diff --git a/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowListener.java b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowListener.java new file mode 100644 index 000000000..805d98eff --- /dev/null +++ b/bee-engine/src/main/java/com/dianping/bee/engine/spi/row/RowListener.java @@ -0,0 +1,5 @@ +package com.dianping.bee.engine.spi.row; + +public interface RowListener { + public void onRow(RowContext ctx); +} diff --git a/bee-engine/src/main/resources/META-INF/plexus/components.xml b/bee-engine/src/main/resources/META-INF/plexus/components.xml index 28b5cc7a9..24010523f 100644 --- a/bee-engine/src/main/resources/META-INF/plexus/components.xml +++ b/bee-engine/src/main/resources/META-INF/plexus/components.xml @@ -7,8 +7,7 @@ com.dianping.bee.engine.spi.DatabaseProvider information_schema - com.dianping.bee.server.InformationSchemaDatabase - + com.dianping.bee.server.InformationSchemaDatabase com.dianping.bee.engine.spi.DatabaseProvider @@ -22,13 +21,11 @@ com.dianping.bee.engine.spi.session.SessionManager - com.dianping.bee.engine.spi.session.DefaultSessionManager - + com.dianping.bee.engine.spi.session.DefaultSessionManager com.dianping.bee.engine.spi.TableProviderManager - com.dianping.bee.engine.spi.internal.DefaultTableProviderManager - + com.dianping.bee.engine.spi.internal.DefaultTableProviderManager com.dianping.bee.engine.spi.session.SessionManager @@ -37,31 +34,16 @@ com.dianping.bee.engine.spi.StatementManager - com.dianping.bee.engine.spi.internal.DefaultStatementManager - + com.dianping.bee.engine.spi.internal.DefaultStatementManager com.dianping.bee.engine.spi.SingleTableStatement - com.dianping.bee.engine.spi.internal.DefaultSingleTableStatement - - per-lookup - - - com.dianping.bee.engine.spi.MultiTableStatement - com.dianping.bee.engine.spi.internal.DefaultMultiTableStatement - - per-lookup - - - com.dianping.bee.engine.spi.RowFilter - com.dianping.bee.engine.spi.internal.DefaultRowFilter - + com.dianping.bee.engine.spi.internal.DefaultSingleTableStatement per-lookup com.dianping.bee.engine.spi.internal.TableHelper - com.dianping.bee.engine.spi.internal.TableHelper - + com.dianping.bee.engine.spi.internal.TableHelper com.dianping.bee.engine.spi.TableProviderManager @@ -69,10 +51,8 @@ - com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor - - com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor - + com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor + com.dianping.bee.engine.spi.internal.SingleTableStatementVisitor per-lookup @@ -81,71 +61,41 @@ com.dianping.bee.engine.spi.SingleTableStatement - - com.dianping.bee.engine.spi.RowFilter - - - - - com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor - - com.dianping.bee.engine.spi.internal.MultiTableStatementVisitor - - per-lookup - - - com.dianping.bee.engine.spi.internal.TableHelper - - - com.dianping.bee.engine.spi.MultiTableStatement - - - com.dianping.bee.engine.spi.RowFilter - com.dianping.bee.server.SimpleServerQueryHandler - com.dianping.bee.server.SimpleServerQueryHandler - + com.dianping.bee.server.SimpleServerQueryHandler per-lookup - com.dianping.bee.engine.spi.handler.internal.SelectHandler - + com.dianping.bee.engine.spi.handler.internal.SelectHandler - com.dianping.bee.engine.spi.handler.internal.ShowHandler - + com.dianping.bee.engine.spi.handler.internal.ShowHandler - com.dianping.bee.engine.spi.handler.internal.DescHandler - + com.dianping.bee.engine.spi.handler.internal.DescHandler - com.dianping.bee.engine.spi.handler.internal.UseHandler - + com.dianping.bee.engine.spi.handler.internal.UseHandler - com.dianping.bee.engine.spi.handler.internal.PrepareHandler - + com.dianping.bee.engine.spi.handler.internal.PrepareHandler com.dianping.bee.engine.spi.handler.internal.UseHandler - com.dianping.bee.engine.spi.handler.internal.UseHandler - + com.dianping.bee.engine.spi.handler.internal.UseHandler com.dianping.bee.engine.spi.handler.internal.ShowHandler - com.dianping.bee.engine.spi.handler.internal.ShowHandler - + com.dianping.bee.engine.spi.handler.internal.ShowHandler com.dianping.bee.engine.spi.handler.internal.DescHandler - com.dianping.bee.engine.spi.handler.internal.DescHandler - + com.dianping.bee.engine.spi.handler.internal.DescHandler com.dianping.bee.engine.spi.TableProviderManager @@ -153,10 +103,8 @@ - com.dianping.bee.engine.spi.handler.internal.SelectHandler - - com.dianping.bee.engine.spi.handler.internal.SelectHandler - + com.dianping.bee.engine.spi.handler.internal.SelectHandler + com.dianping.bee.engine.spi.handler.internal.SelectHandler com.dianping.bee.engine.spi.StatementManager @@ -164,10 +112,8 @@ - com.dianping.bee.engine.spi.handler.internal.PrepareHandler - - com.dianping.bee.engine.spi.handler.internal.PrepareHandler - + com.dianping.bee.engine.spi.handler.internal.PrepareHandler + com.dianping.bee.engine.spi.handler.internal.PrepareHandler com.dianping.bee.engine.spi.StatementManager diff --git a/bee-engine/src/test/java/com/dianping/bee/db/CatDatabase.java b/bee-engine/src/test/java/com/dianping/bee/db/CatDatabase.java index 32ac941ce..041ec8ec2 100644 --- a/bee-engine/src/test/java/com/dianping/bee/db/CatDatabase.java +++ b/bee-engine/src/test/java/com/dianping/bee/db/CatDatabase.java @@ -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> 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> getIndexClass() { + throw new UnsupportedOperationException("Not implemented yet!"); + } } @Override diff --git a/bee-engine/src/test/java/com/dianping/bee/db/DogDatabase.java b/bee-engine/src/test/java/com/dianping/bee/db/DogDatabase.java index da491f3d7..8590543c5 100644 --- a/bee-engine/src/test/java/com/dianping/bee/db/DogDatabase.java +++ b/bee-engine/src/test/java/com/dianping/bee/db/DogDatabase.java @@ -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> getIndexClass() { + throw new UnsupportedOperationException("Not implemented yet!"); + } } @Override diff --git a/cat-data/pom.xml b/cat-data/pom.xml index 40d664be3..0720aa738 100644 --- a/cat-data/pom.xml +++ b/cat-data/pom.xml @@ -15,6 +15,10 @@ bee-engine 0.0.1-SNAPSHOT + + com.dianping.cat + cat-consumer + com.site.common test-framework diff --git a/cat-data/src/main/java/com/dianping/cat/data/CatTableProvider.java b/cat-data/src/main/java/com/dianping/cat/data/CatTableProvider.java index 8443b618f..b28c6c71b 100644 --- a/cat-data/src/main/java/com/dianping/cat/data/CatTableProvider.java +++ b/cat-data/src/main/java/com/dianping/cat/data/CatTableProvider.java @@ -1,13 +1,19 @@ 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 diff --git a/cat-data/src/main/java/com/dianping/cat/data/build/ComponentsConfigurator.java b/cat-data/src/main/java/com/dianping/cat/data/build/ComponentsConfigurator.java index f619dd392..3fedb5f51 100644 --- a/cat-data/src/main/java/com/dianping/cat/data/build/ComponentsConfigurator.java +++ b/cat-data/src/main/java/com/dianping/cat/data/build/ComponentsConfigurator.java @@ -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; } diff --git a/cat-data/src/main/java/com/dianping/cat/data/event/EventIndex.java b/cat-data/src/main/java/com/dianping/cat/data/event/EventIndex.java index 5867eb171..28e2df005 100644 --- a/cat-data/src/main/java/com/dianping/cat/data/event/EventIndex.java +++ b/cat-data/src/main/java/com/dianping/cat/data/event/EventIndex.java @@ -1,50 +1,17 @@ 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 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 diff --git a/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionExecutor.java b/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionExecutor.java deleted file mode 100644 index efd264e8c..000000000 --- a/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionExecutor.java +++ /dev/null @@ -1,21 +0,0 @@ -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 { - @Override - public RowSet execute(TransactionIndex index, TransactionColumn[] columns, RowFilter filter) { - RowSet rowset = new DefaultRowSet(columns); - - if (index == TransactionIndex.IDX_STARTTIME_DOMAIN) { - - } else { - - } - - return rowset; - } -} diff --git a/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndex.java b/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndex.java index 098d96ac8..ed6ddc6b5 100644 --- a/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndex.java +++ b/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndex.java @@ -1,50 +1,23 @@ 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 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> 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 diff --git a/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndexer.java b/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndexer.java new file mode 100644 index 000000000..5d41d5990 --- /dev/null +++ b/cat-data/src/main/java/com/dianping/cat/data/transaction/TransactionIndexer.java @@ -0,0 +1,83 @@ +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> { + @Override + public void queryById(RowContext ctx, Pair pair) throws Exception { + if (pair == null) { + pair = new Pair("", "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[] pairs) throws Exception { + throw new UnsupportedOperationException("Not implemented yet!"); + } + + @Override + public void queryByRange(RowContext ctx, Pair start, Pair 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(); + } + } +} diff --git a/cat-data/src/main/resources/META-INF/plexus/components.xml b/cat-data/src/main/resources/META-INF/plexus/components.xml index 113c2243e..4750ff5f4 100644 --- a/cat-data/src/main/resources/META-INF/plexus/components.xml +++ b/cat-data/src/main/resources/META-INF/plexus/components.xml @@ -5,5 +5,9 @@ cat com.dianping.cat.data.CatDatabaseProvider + + com.dianping.cat.data.transaction.TransactionIndexer + com.dianping.cat.data.transaction.TransactionIndexer + diff --git a/cat-data/src/test/java/com/dianping/cat/data/BeeTestServer.java b/cat-data/src/test/java/com/dianping/cat/data/BeeTestServer.java new file mode 100644 index 000000000..c0de1ad61 --- /dev/null +++ b/cat-data/src/test/java/com/dianping/cat/data/BeeTestServer.java @@ -0,0 +1,26 @@ +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(); + } + +} diff --git a/cat-data/src/test/java/com/dianping/cat/data/TransactionTest.java b/cat-data/src/test/java/com/dianping/cat/data/TransactionTest.java new file mode 100644 index 000000000..635d811b7 --- /dev/null +++ b/cat-data/src/test/java/com/dianping/cat/data/TransactionTest.java @@ -0,0 +1,67 @@ +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(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java index 3b168ca0f..2ccb17ff4 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Handler.java @@ -57,6 +57,9 @@ public class Handler implements PageHandler { @Inject private JspViewer m_jspViewer; + + @Inject + private XmlViewer m_xmlViewer; @Inject private TransactionMerger m_transactionMerger; @@ -206,10 +209,15 @@ public class Handler implements PageHandler { } 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 { 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 { 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)); } diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Payload.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Payload.java index a324cc68a..fb802c882 100755 --- a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Payload.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/Payload.java @@ -20,6 +20,9 @@ public class Payload extends AbstractReportPayload { @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 { 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 { m_type = type; } + public void setXml(boolean xml) { + m_xml = xml; + } + @Override public void validate(ActionContext ctx) { if (m_action == null) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/transaction/XmlViewer.java b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/XmlViewer.java new file mode 100644 index 000000000..29b63477e --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/page/transaction/XmlViewer.java @@ -0,0 +1,27 @@ +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 { + 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!"); + } + } +} diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index 81937bfc2..2c9a1177e 100755 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -845,6 +845,9 @@ com.dianping.cat.report.page.transaction.JspViewer + + com.dianping.cat.report.page.transaction.XmlViewer + com.dianping.cat.report.task.transaction.TransactionMerger @@ -874,6 +877,10 @@ com.dianping.cat.report.page.transaction.JspViewer com.dianping.cat.report.page.transaction.JspViewer + + com.dianping.cat.report.page.transaction.XmlViewer + com.dianping.cat.report.page.transaction.XmlViewer + com.dianping.cat.report.task.transaction.TransactionMerger com.dianping.cat.report.task.transaction.TransactionMerger diff --git a/pom.xml b/pom.xml index 91ff47299..d231f2055 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ com.site.common lookup - 1.1.3 + 1.1.4 junit diff --git a/src/main/conf/Cat.sql b/src/main/conf/Cat.sql index 8652df76c..f13c2b3a7 100644 --- a/src/main/conf/Cat.sql +++ b/src/main/conf/Cat.sql @@ -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 '结束时间, 这次执行结束时间', -- GitLab