From f370b7eafc259de929d62f1bc709c0c2be3db2b5 Mon Sep 17 00:00:00 2001 From: fengyu Date: Wed, 29 Jun 2016 10:18:11 +0800 Subject: [PATCH] KYLIN-1833, union query get error result Signed-off-by: fengyu --- .../java/org/apache/kylin/query/relnode/OLAPContext.java | 13 +++++++++++++ .../java/org/apache/kylin/query/relnode/OLAPTableScan.java | 3 ++- .../kylin/query/relnode/OLAPToEnumerableConverter.java | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java index 223e29e..2df86fb 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java @@ -46,6 +46,8 @@ public class OLAPContext { private static final ThreadLocal> _localContexts = new ThreadLocal>(); + private static final ThreadLocal olapImplementor = new ThreadLocal(); + public static void setParameters(Map parameters) { _localPrarameters.set(parameters); } @@ -74,6 +76,17 @@ public class OLAPContext { public static void clearThreadLocalContexts() { _localContexts.remove(); } + + public static OLAPRel.OLAPImplementor getThreadLocalOLAPImplementor() { + if(olapImplementor.get() == null) { + olapImplementor.set(new OLAPRel.OLAPImplementor()); + } + return olapImplementor.get(); + } + + public static void clearThreadLocalOLAPImplementor() { + olapImplementor.remove(); + } public OLAPContext(int seq) { this.id = seq; diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java index 4bf5ec3..f43a3fc 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java @@ -117,6 +117,7 @@ public class OLAPTableScan extends TableScan implements OLAPRel, EnumerableRel { public void register(RelOptPlanner planner) { // force clear the query context before traversal relational operators OLAPContext.clearThreadLocalContexts(); + OLAPContext.clearThreadLocalOLAPImplementor(); // register OLAP rules planner.addRule(OLAPToEnumerableConverterRule.INSTANCE); @@ -182,7 +183,7 @@ public class OLAPTableScan extends TableScan implements OLAPRel, EnumerableRel { @Override public void implementOLAP(OLAPImplementor implementor) { // create context in case of non-join - if (implementor.getContext() == null || !(implementor.getParentNode() instanceof OLAPJoinRel)) { + if (!(implementor.getParentNode() instanceof OLAPJoinRel)) { implementor.allocateContext(); } columnRowType = buildColumnRowType(); diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java index b1ea137..4e7ee8f 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPToEnumerableConverter.java @@ -46,7 +46,7 @@ import org.apache.kylin.query.schema.OLAPTable; /** */ public class OLAPToEnumerableConverter extends ConverterImpl implements EnumerableRel { - + public OLAPToEnumerableConverter(RelOptCluster cluster, RelTraitSet traits, RelNode input) { super(cluster, ConventionTraitDef.INSTANCE, traits, input); } @@ -64,7 +64,7 @@ public class OLAPToEnumerableConverter extends ConverterImpl implements Enumerab @Override public Result implement(EnumerableRelImplementor enumImplementor, Prefer pref) { // post-order travel children - OLAPRel.OLAPImplementor olapImplementor = new OLAPRel.OLAPImplementor(); + OLAPRel.OLAPImplementor olapImplementor = OLAPContext.getThreadLocalOLAPImplementor(); olapImplementor.visitChild(getInput(), this); // find cube from olap context -- 1.9.4.msysgit.2