From 0764aeeec3ab05c48ed314a424c5b5e23e182917 Mon Sep 17 00:00:00 2001 From: "mengshi.sunmengshi" Date: Tue, 18 Feb 2014 18:33:37 +0800 Subject: [PATCH] comit --- .../cursor/impl/TempTableSortCursor.java | 27 +- .../cursor/impl/ValueFilterCursor.java | 7 +- .../tddl/executor/function/aggregate/Avg.java | 8 +- .../tddl/executor/function/aggregate/Sum.java | 2 +- .../tddl/executor/function/scalar/Add.java | 2 +- .../tddl/executor/function/scalar/BitAnd.java | 2 +- .../tddl/executor/function/scalar/BitOr.java | 2 +- .../tddl/executor/function/scalar/BitXor.java | 2 +- .../tddl/executor/function/scalar/Div.java | 2 +- .../executor/function/scalar/Division.java | 2 +- .../tddl/executor/function/scalar/Minus.java | 2 +- .../tddl/executor/function/scalar/Mod.java | 2 +- .../executor/function/scalar/Multiply.java | 2 +- .../tddl/executor/function/scalar/Sub.java | 2 +- .../tddl/executor/rowset/AbstractRowSet.java | 6 +- .../core/datatype/AbstractCalculator.java | 122 +++++++++ .../src/main/java/ConfigHolderTest.java | 76 ++++++ .../tddl/AnnotationLookupException.java | 19 ++ .../tddl/AutoDetectedVirtualTableRoot.java | 62 +++++ tddl-sample/src/main/resources/rule.xml | 246 ++++++++++++++++++ 20 files changed, 565 insertions(+), 30 deletions(-) create mode 100644 tddl-optimizer/src/main/java/com/taobao/tddl/optimizer/core/datatype/AbstractCalculator.java create mode 100644 tddl-sample/src/main/java/ConfigHolderTest.java create mode 100644 tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AnnotationLookupException.java create mode 100644 tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AutoDetectedVirtualTableRoot.java create mode 100644 tddl-sample/src/main/resources/rule.xml diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/TempTableSortCursor.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/TempTableSortCursor.java index 49b5868e..1f1b7c3a 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/TempTableSortCursor.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/TempTableSortCursor.java @@ -9,6 +9,8 @@ import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.common.utils.GeneralUtil; import com.taobao.tddl.common.utils.TStringUtil; +import com.taobao.tddl.common.utils.logger.Logger; +import com.taobao.tddl.common.utils.logger.LoggerFactory; import com.taobao.tddl.executor.codec.CodecFactory; import com.taobao.tddl.executor.common.ExecutionContext; import com.taobao.tddl.executor.common.KVPair; @@ -32,9 +34,6 @@ import com.taobao.tddl.optimizer.core.expression.IOrderBy; import com.taobao.tddl.optimizer.core.expression.ISelectable; -import com.taobao.tddl.common.utils.logger.Logger; -import com.taobao.tddl.common.utils.logger.LoggerFactory; - /** * 用于临时表排序,需要依赖bdb * @@ -157,9 +156,13 @@ protected ISchematicCursor prepare(IRepository repo, ISchematicCursor cursor, Li } for (ColumnMeta column : columns) { String colName = column.getName(); - if (colName.contains(".")) { - String[] sp = TStringUtil.split(colName, "."); - colName = sp[sp.length - 1]; + if (colName.contains("_ANDOR_TABLENAME_")) { + + int m = colName.indexOf("_ANDOR_TABLENAME_"); + colName = colName.substring(m + "_ANDOR_TABLENAME_".length(), colName.length()); + // String[] sp = TStringUtil.split(colName, + // "_ANDOR_TABLENAME_"); + // colName = sp[sp.length - 1]; } /** * 在临时表的时候,来自不同2个表的相同的列,比如 a.id和b.id @@ -175,11 +178,11 @@ protected ISchematicCursor prepare(IRepository repo, ISchematicCursor cursor, Li if ("__IDENTITY__".equals(colName)) { continue; } - if (colName.contains(".")) { + if (colName.contains("_ANDOR_TABLENAME_")) { // String[] sp = StringUtil.split(colName, "."); // colName = sp[sp.length-1]; - int m = colName.indexOf("."); - colName = colName.substring(m + 1, colName.length()); + int m = colName.indexOf("_ANDOR_TABLENAME_"); + colName = colName.substring(m + "_ANDOR_TABLENAME_".length(), colName.length()); } /** * 在临时表的时候,来自不同2个表的相同的列,比如 a.id和b.id @@ -249,7 +252,7 @@ private void buildColumnMeta(ISchematicCursor cursor, List orderBys, L } else { // 列名与order by not match ,放到value里 ColumnMeta cm2 = new ColumnMeta(cm.getTableName(), - cm.getTableName() + "." + cm.getName(), + cm.getTableName() + "_ANDOR_TABLENAME_" + cm.getName(), cm.getDataType(), cm.getAlias(), cm.isNullable()); @@ -273,7 +276,7 @@ private void buildColumnMeta(ISchematicCursor cursor, List orderBys, L } else { ISelectable cm = ob.getColumn(); ColumnMeta cm2 = new ColumnMeta(cm.getTableName(), - cm.getTableName() + "." + cm.getColumnName(), + cm.getTableName() + "_ANDOR_TABLENAME_" + cm.getColumnName(), cm.getDataType(), cm.getAlias(), true); @@ -297,7 +300,7 @@ private boolean findOrderByInKey(List orderBys, List colum if (cm != null && TStringUtil.equals(ExecUtils.getLogicTableName(cm.getTableName()), orderByTable)) { if (TStringUtil.equals(cm.getName(), iSelectable.getColumnName())) { ColumnMeta cm2 = new ColumnMeta(cm.getTableName(), - cm.getTableName() + "." + cm.getName(), + cm.getTableName() + "_ANDOR_TABLENAME_" + cm.getName(), cm.getDataType(), cm.getAlias(), cm.isNullable()); diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/ValueFilterCursor.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/ValueFilterCursor.java index b590a9a4..8f40fd02 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/ValueFilterCursor.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/cursor/impl/ValueFilterCursor.java @@ -21,6 +21,7 @@ import com.taobao.tddl.executor.record.CloneableRecord; import com.taobao.tddl.executor.rowset.IRowSet; import com.taobao.tddl.executor.utils.ExecUtils; +import com.taobao.tddl.optimizer.core.datatype.DataTypeUtil; import com.taobao.tddl.optimizer.core.expression.IBooleanFilter; import com.taobao.tddl.optimizer.core.expression.IColumn; import com.taobao.tddl.optimizer.core.expression.IFilter; @@ -113,7 +114,8 @@ boolean allow(IFilter f, IRowSet iRowSet) throws TddlException { if (col instanceof ISelectable) { try { - if (col instanceof IFunction && ((IFunction) col).getFunctionType().equals(FunctionType.Scalar)) { + if (((ISelectable) col).getAlias() == null && col instanceof IFunction + && ((IFunction) col).getFunctionType().equals(FunctionType.Scalar)) { column_value = processFunction(iRowSet, col); } else { @@ -194,7 +196,8 @@ boolean allow(IFilter f, IRowSet iRowSet) throws TddlException { return processIn(column_value, bf.getValues()); } - int n = ((Comparable) v).compareTo(column_value); + int n = DataTypeUtil.getTypeOfObject(v).compare(v, column_value); + // int n = ((Comparable) v).compareTo(column_value); if (n == 0) { if (op == OPERATION.EQ || op == OPERATION.GT_EQ || op == OPERATION.LT_EQ) { diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Avg.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Avg.java index e0178fc5..05b25946 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Avg.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Avg.java @@ -27,7 +27,7 @@ public void serverMap(Object[] args) throws FunctionException { if (total == null) { total = type.convertFrom(o); } else { - total = type.getCalculator().doAdd(total, o); + total = type.getCalculator().add(total, o); } } } @@ -44,7 +44,7 @@ public void serverReduce(Object[] args) throws FunctionException { if (total == null) { total = type.convertFrom(o); } else { - total = type.getCalculator().doAdd(total, o); + total = type.getCalculator().add(total, o); } } @@ -69,9 +69,9 @@ private String bulidAvgSql(IFunction func) { public Object getResult() { DataType type = this.getReturnType(); if (total == null) { - return type.getCalculator().doDivide(0L, count); + return type.getCalculator().divide(0L, count); } else { - return type.getCalculator().doDivide(total, count); + return type.getCalculator().divide(total, count); } } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Sum.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Sum.java index 273d2118..88921488 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Sum.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/aggregate/Sum.java @@ -32,7 +32,7 @@ private void doSum(Object[] args) { o = type.convertFrom(o); result = o; } else { - result = type.getCalculator().doAdd(result, o); + result = type.getCalculator().add(result, o); } } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Add.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Add.java index e99461c3..0370bb18 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Add.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Add.java @@ -12,7 +12,7 @@ public class Add extends ScalarFunction { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doAdd(args[0], args[1]); + return type.getCalculator().add(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitAnd.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitAnd.java index 01e881eb..8a238e61 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitAnd.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitAnd.java @@ -20,7 +20,7 @@ public void compute(Object[] args) { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doBitAnd(args[0], args[1]); + return type.getCalculator().bitAnd(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitOr.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitOr.java index 26567048..7520fd01 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitOr.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitOr.java @@ -20,7 +20,7 @@ public void compute(Object[] args) { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doBitOr(args[0], args[1]); + return type.getCalculator().bitOr(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitXor.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitXor.java index 898a346f..f35e844f 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitXor.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/BitXor.java @@ -20,7 +20,7 @@ public void compute(Object[] args) { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doBitXor(args[0], args[1]); + return type.getCalculator().bitXor(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Div.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Div.java index 1cad8afc..41a082d9 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Div.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Div.java @@ -30,7 +30,7 @@ public void compute(Object[] args) { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doDivide(args[0], args[1]); + return type.getCalculator().divide(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Division.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Division.java index 68e4c4d7..bb9140e5 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Division.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Division.java @@ -17,7 +17,7 @@ public void compute(Object[] args) { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doDivide(args[0], args[1]); + return type.getCalculator().divide(args[0], args[1]); } @Override diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Minus.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Minus.java index 36449a72..1b37a7ed 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Minus.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Minus.java @@ -34,7 +34,7 @@ public DataType getReturnType() { private Object computeInner(Object[] args) { DataType type = getReturnType(); // -min(id) = min(id) * -1 - return type.getCalculator().doMultiply(args[0], -1); + return type.getCalculator().multiply(args[0], -1); } } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Mod.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Mod.java index 622dcb62..e0f98c6d 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Mod.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Mod.java @@ -12,7 +12,7 @@ public class Mod extends ScalarFunction { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doMod(args[0], args[1]); + return type.getCalculator().mod(args[0], args[1]); } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Multiply.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Multiply.java index 959ebbf6..7860dc02 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Multiply.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Multiply.java @@ -31,6 +31,6 @@ public DataType getReturnType() { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doMultiply(args[0], args[1]); + return type.getCalculator().multiply(args[0], args[1]); } } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Sub.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Sub.java index 7597345c..f9661dcd 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Sub.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/function/scalar/Sub.java @@ -31,6 +31,6 @@ public DataType getReturnType() { private Object computeInner(Object[] args) { DataType type = this.getReturnType(); - return type.getCalculator().doSub(args[0], args[1]); + return type.getCalculator().sub(args[0], args[1]); } } diff --git a/tddl-executor/src/main/java/com/taobao/tddl/executor/rowset/AbstractRowSet.java b/tddl-executor/src/main/java/com/taobao/tddl/executor/rowset/AbstractRowSet.java index a188b47c..c2a263f4 100644 --- a/tddl-executor/src/main/java/com/taobao/tddl/executor/rowset/AbstractRowSet.java +++ b/tddl-executor/src/main/java/com/taobao/tddl/executor/rowset/AbstractRowSet.java @@ -171,7 +171,11 @@ public String toString() { for (ColumnMeta cm : this.getParentCursorMeta().getColumns()) { int index = this.getParentCursorMeta().getIndex(cm.getTableName(), cm.getName()); - sb.append(cm.getName() + ":" + this.getValues().get(index) + " "); + + if (index > this.getValues().size()) { + System.out.println("11"); + } + sb.append(cm.getName() + ":" + this.getString(index) + " "); } return sb.toString(); } diff --git a/tddl-optimizer/src/main/java/com/taobao/tddl/optimizer/core/datatype/AbstractCalculator.java b/tddl-optimizer/src/main/java/com/taobao/tddl/optimizer/core/datatype/AbstractCalculator.java new file mode 100644 index 00000000..702d19f3 --- /dev/null +++ b/tddl-optimizer/src/main/java/com/taobao/tddl/optimizer/core/datatype/AbstractCalculator.java @@ -0,0 +1,122 @@ +package com.taobao.tddl.optimizer.core.datatype; + +public abstract class AbstractCalculator implements Calculator { + + public abstract Object doAdd(Object v1, Object v2); + + public abstract Object doSub(Object v1, Object v2); + + public abstract Object doMultiply(Object v1, Object v2); + + public abstract Object doDivide(Object v1, Object v2); + + public abstract Object doMod(Object v1, Object v2); + + public abstract Object doAnd(Object v1, Object v2); + + public abstract Object doOr(Object v1, Object v2); + + public abstract Object doXor(Object v1, Object v2); + + public abstract Object doNot(Object v1); + + public abstract Object doBitAnd(Object v1, Object v2); + + public abstract Object doBitOr(Object v1, Object v2); + + public abstract Object doBitXor(Object v1, Object v2); + + public abstract Object doBitNot(Object v1); + + @Override + public Object add(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doAdd(v1, v2); + } + + @Override + public Object sub(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doSub(v1, v2); + } + + @Override + public Object multiply(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doMultiply(v1, v2); + } + + @Override + public Object divide(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doDivide(v1, v2); + } + + @Override + public Object mod(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doMod(v1, v2); + } + + @Override + public Object and(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doAnd(v1, v2); + } + + @Override + public Object or(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doOr(v1, v2); + } + + @Override + public Object xor(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doXor(v1, v2); + } + + @Override + public Object not(Object v1) { + if (v1 == null) return null; + + return this.doNot(v1); + } + + @Override + public Object bitAnd(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doBitAnd(v1, v2); + } + + @Override + public Object bitOr(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doBitOr(v1, v2); + } + + @Override + public Object bitXor(Object v1, Object v2) { + if (v1 == null || v2 == null) return null; + + return this.doBitXor(v1, v2); + } + + @Override + public Object bitNot(Object v1) { + if (v1 == null) return null; + + return this.doBitNot(v1); + } + +} diff --git a/tddl-sample/src/main/java/ConfigHolderTest.java b/tddl-sample/src/main/java/ConfigHolderTest.java new file mode 100644 index 00000000..1fd65c9a --- /dev/null +++ b/tddl-sample/src/main/java/ConfigHolderTest.java @@ -0,0 +1,76 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executors; + +import com.taobao.tddl.common.exception.TddlException; +import com.taobao.tddl.executor.MatrixExecutor; +import com.taobao.tddl.executor.common.ExecutionContext; +import com.taobao.tddl.executor.cursor.ResultCursor; +import com.taobao.tddl.executor.rowset.IRowSet; +import com.taobao.tddl.matrix.config.MatrixConfigHolder; + +public class ConfigHolderTest { + + public static void main(String[] args) throws TddlException { + + MatrixConfigHolder configHolder = new MatrixConfigHolder(); + Map cp = new HashMap(); + cp.put("ALLOW_TEMPORARY_TABLE", "True"); + configHolder.setConnectionProperties(cp); + configHolder.setAppName("DEV_SUBWAY_MYSQL"); + configHolder.setRuleFilePath("rule.xml"); + // configHolder.setTopologyFilePath("test_matrix.xml"); + // configHolder.setSchemaFilePath("test_schema.xml"); + + try { + configHolder.init(); + } catch (TddlException e) { + e.printStackTrace(); + } + + MatrixExecutor me = new MatrixExecutor(); + + ExecutionContext context = new ExecutionContext(); + context.setExtraCmds(cp); + context.setExecutorService(Executors.newCachedThreadPool()); + // ResultCursor rc = me.execute("select * from bmw_users limit 10", + // context); + + { + ResultCursor rc = me.execute("SELECT SUM(c.cost) / SUM(c.click) AS ppc,c.thedate, c.memberid, c.campaignid, c.productlineid, c.adgroupid, SUM(c.impression), SUM(c.cost), SUM(c.click), SUM(c.click) / SUM(c.impression) AS ctr, b.title, a.onlinestate, a.reason FROM Lunaadgroup a join lunaadgroupinfo b on a.id=b.adgroupid LEFT JOIN rpt_solar_adgroup_ob c ON a.id = c.adgroupid GROUP BY c.thedate, c.memberid, c.campaignid, c.productlineid, c.adgroupid HAVING ppc > 1 ORDER BY ppc DESC", + context); + + // ResultCursor rc = + // me.execute("SELECT * FROM Lunaadgroup a join lunaadgroupinfo b on a.id=b.adgroupid LEFT JOIN rpt_solar_adgroup_ob c ON a.id = c.adgroupid", + // context); + // ResultCursor rc = + // me.execute("SELECT * FROM Lunaadgroup a join lunaadgroupinfo b on a.id=b.adgroupid where a.id in (23310,23311,23333,23334,23335,23336,23337,23338,23339,432234)", + // context); + // ResultCursor rc = + // me.execute("SELECT * FROM Lunaadgroup a where a.id in (23310,23311,23333,23334,23335,23336,23337,23338,23339,432234)", + // context); + IRowSet row = null; + while ((row = rc.next()) != null) { + System.out.println(row); + } + + System.out.println("ok"); + } + // long start = System.currentTimeMillis(); + // { + // ResultCursor rc = + // me.execute("SELECT b.thedate, b. memberid, b.campaignid, b.productlineid, b.adgroupid, sum(b.impression), sum(b.cost), sum(b.click),(sum(b.click)/sum(b.impression)) as ctr,(sum(b.cost) / sum(b.click)) as ppc,a.outsidekey, a.onlinestate, a.reason FROM Lunaadgroup a left join rpt_solar_adgroup_ob b on a.id=b.adgroupid WHERE a.outsidekey like '%taobao%' AND a.onlinestate in (1,2,3) AND b.impression>10 AND b.thedate between '2013-12-12' AND '2013-12-31' GROUP BY b.thedate, b.memberid, b.campaignid, b.productlineid, b.adgroupid HAVING ppc>1 ORDER BY ppc DESC LIMIT 1,100", + // context); + // + // IRowSet row = null; + // while ((row = rc.next()) != null) { + // System.out.println(row); + // } + // + // System.out.println("ok"); + // + // System.out.println(System.currentTimeMillis() - start); + // } + } + +} diff --git a/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AnnotationLookupException.java b/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AnnotationLookupException.java new file mode 100644 index 00000000..adc419b1 --- /dev/null +++ b/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AnnotationLookupException.java @@ -0,0 +1,19 @@ +package com.ali.luna.mortred.tddl; + +/** + * 表名查找路由注解失败. + * @author tongfeng.dhy + * + */ +public class AnnotationLookupException extends Exception{ + + private static final long serialVersionUID = 1L; + + public AnnotationLookupException(String message) { + super(message); + } + + public AnnotationLookupException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AutoDetectedVirtualTableRoot.java b/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AutoDetectedVirtualTableRoot.java new file mode 100644 index 00000000..1a4d2395 --- /dev/null +++ b/tddl-sample/src/main/java/com/ali/luna/mortred/tddl/AutoDetectedVirtualTableRoot.java @@ -0,0 +1,62 @@ +package com.ali.luna.mortred.tddl; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.util.ClassUtils; + +import com.taobao.tddl.common.exception.TddlException; +import com.taobao.tddl.rule.TableRule; +import com.taobao.tddl.rule.VirtualTableRoot; + +/** + * 继承自TDDL VirtualTableRoot的自定义TabelROOT. 功能说明: 自动查找并加载classpath下的所有的TableRule文件 + * + * @author tongfeng.dhy + */ +public class AutoDetectedVirtualTableRoot extends VirtualTableRoot implements ApplicationContextAware { + + public static final String TABLERULE_CLASS = "com.taobao.tddl.interact.rule.TableRule"; + + private ApplicationContext context; + + /** + * 执行初始化. + * + * @throws TddlException + */ + @Override + public void init() throws TddlException { + Map vts = new HashMap(); + String[] tbeanNames = context.getBeanNamesForType(TableRule.class); + for (String name : tbeanNames) { + Object obj = context.getBean(name); + vts.put(name, (TableRule) obj); + } + setTableRules(vts); + super.init(); + } + + /** + * 加载TableRule类Class. + * + * @return + */ + private Class getClz() { + Class c2; + try { + c2 = ClassUtils.forName(TABLERULE_CLASS); + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + return c2; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.context = applicationContext; + } +} diff --git a/tddl-sample/src/main/resources/rule.xml b/tddl-sample/src/main/resources/rule.xml new file mode 100644 index 00000000..c82b32b4 --- /dev/null +++ b/tddl-sample/src/main/resources/rule.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + (#custId,64,2048#.longValue() %2048).intdiv(64) + + + + + + + #custId,64,2048#.longValue() % 32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file