You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2015/05/15 05:06:47 UTC

[35/50] [abbrv] incubator-kylin git commit: KYLIN-749 fix ci

KYLIN-749 fix ci


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/033f2aee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/033f2aee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/033f2aee

Branch: refs/heads/streaming-localdict
Commit: 033f2aeec991289147106c27a3b57a511bed0024
Parents: 33f8fee
Author: honma <ho...@ebay.com>
Authored: Tue May 12 15:19:03 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Tue May 12 15:20:57 2015 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/common/util/BasicTest.java |   2 +-
 .../kylin/job/hadoop/invertedindex/IITest.java  |  33 +++--
 .../metadata/filter/CompareTupleFilter.java     |  11 +-
 .../metadata/filter/DateConditionModifier.java  |  62 +++++++++
 .../metadata/filter/IgnoreTsCondition.java      |  65 ---------
 .../metadata/filter/TsConditionEraser.java      |  64 +++++++++
 .../metadata/realization/StreamSQLDigest.java   |   4 +-
 .../kylin/query/enumerator/OLAPEnumerator.java  |  20 ++-
 .../apache/kylin/query/relnode/OLAPContext.java |  25 ++--
 .../kylin/query/relnode/OLAPFilterRel.java      |   4 +-
 .../apache/kylin/query/test/IIQueryTest.java    |   7 +-
 .../apache/kylin/query/test/KylinQueryTest.java |   2 +-
 .../apache/kylin/query/test/KylinTestBase.java  |  33 +----
 .../kylin/storage/cache/StorageLayerCache.java  |   8 ++
 .../DateConditionInplaceModifier.java           |  63 ---------
 .../DateConditionInplaceModifierTest.java       |  34 -----
 .../filter/DateConditionModifierTest.java       |  33 +++++
 .../storage/filter/IgnoreTsConditionTest.java   | 133 -------------------
 .../storage/filter/TsConditionEraserTest.java   | 133 +++++++++++++++++++
 19 files changed, 370 insertions(+), 366 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/kylin/common/util/BasicTest.java b/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
index efa1459..c259507 100644
--- a/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
+++ b/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
@@ -63,7 +63,7 @@ public class BasicTest {
     @Test
     @Ignore("convenient trial tool for dev")
     public void test1() throws Exception {
-        System.out.println(time(946684800000L));
+        System.out.println(time(1367798400000L));
 
         System.out.println(org.apache.kylin.common.util.DateFormat.formatToTimeStr(1000L * Integer.MAX_VALUE));
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
----------------------------------------------------------------------
diff --git a/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java b/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
index c3bd556..ecc3c23 100644
--- a/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
+++ b/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
@@ -1,10 +1,9 @@
 package org.apache.kylin.job.hadoop.invertedindex;
 
-import java.io.IOException;
-import java.util.*;
-
-import javax.annotation.Nullable;
-
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -27,9 +26,13 @@ import org.apache.kylin.invertedindex.index.TableRecordInfoDigest;
 import org.apache.kylin.invertedindex.model.*;
 import org.apache.kylin.job.constant.BatchConstants;
 import org.apache.kylin.job.hadoop.cube.FactDistinctIIColumnsMapper;
+import org.apache.kylin.metadata.filter.ColumnTupleFilter;
+import org.apache.kylin.metadata.filter.CompareTupleFilter;
 import org.apache.kylin.metadata.filter.ConstantTupleFilter;
+import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.model.FunctionDesc;
 import org.apache.kylin.metadata.model.ParameterDesc;
+import org.apache.kylin.metadata.model.TblColRef;
 import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
 import org.apache.kylin.storage.hbase.coprocessor.CoprocessorProjector;
 import org.apache.kylin.storage.hbase.coprocessor.CoprocessorRowType;
@@ -46,10 +49,9 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.*;
 
 /**
  * Created by Hongbin Ma(Binmahone) on 3/26/15.
@@ -82,7 +84,6 @@ public class IITest extends LocalFileMetadataTestCase {
             }
         });
 
-
         iiRows = Lists.newArrayList();
         final Slice slice = new SliceBuilder(iiDesc, (short) 0, true).buildSlice(streamMessages, StringStreamParser.instance);
         IIKeyValueCodec codec = new IIKeyValueCodec(slice.getInfo());
@@ -140,8 +141,16 @@ public class IITest extends LocalFileMetadataTestCase {
         f1.setParameter(p1);
         f1.setReturnType("decimal(19,4)");
 
+        TblColRef column = ii.getDescriptor().findColumnRef("default.test_kylin_fact", "cal_dt");
+        CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GTE);
+        ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
+        compareFilter.addChild(columnFilter);
+        ConstantTupleFilter constantFilter = null;
+        constantFilter = new ConstantTupleFilter(("2012-08-16"));
+        compareFilter.addChild(constantFilter);
+
         EndpointAggregators aggregators = EndpointAggregators.fromFunctions(info, Collections.singletonList(f1));
-        CoprocessorFilter filter = CoprocessorFilter.fromFilter(new ClearTextDictionary(info), ConstantTupleFilter.TRUE, FilterDecorator.FilterConstantsTreatment.AS_IT_IS);
+        CoprocessorFilter filter = CoprocessorFilter.fromFilter(new ClearTextDictionary(info), compareFilter, FilterDecorator.FilterConstantsTreatment.AS_IT_IS);
 
         final Iterator<IIRow> iiRowIterator = iiRows.iterator();
 
@@ -205,8 +214,8 @@ public class IITest extends LocalFileMetadataTestCase {
             }
         }, type, projector, aggregators, filter);
 
+        Assert.assertEquals(2, response.getRowsList().size());
         System.out.println(response.getRowsList().size());
-
         Set<String> answers = Sets.newHashSet("120.4747", "26.8551");
         for (org.apache.kylin.storage.hbase.coprocessor.endpoint.generated.IIProtos.IIResponseInternal.IIRow responseRow : response.getRowsList()) {
             byte[] measuresBytes = responseRow.getMeasures().toByteArray();

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
index fc7fd2c..3fa6962 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
@@ -69,6 +69,8 @@ public class CompareTupleFilter extends TupleFilter {
             // if value is before column, we need to reverse the operator. e.g. "1 >= c1" => "c1 <= 1"
             if (!this.conditionValues.isEmpty() && needSwapOperator()) {
                 this.operator = SWAP_OP_MAP.get(this.operator);
+                TupleFilter last = this.children.remove(this.children.size() - 1);
+                this.children.add(0, last);
             }
         } else if (child instanceof ConstantTupleFilter) {
             this.conditionValues.addAll(child.getValues());
@@ -90,15 +92,6 @@ public class CompareTupleFilter extends TupleFilter {
         return conditionValues;
     }
 
-    public void updateValues(Collection<?> values, boolean clear) {
-        if (clear) {
-            this.conditionValues.clear();
-        }
-
-        this.conditionValues.addAll(values);
-        this.firstCondValue = this.conditionValues.iterator().next();
-    }
-
     public Object getFirstValue() {
         return firstCondValue;
     }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
new file mode 100644
index 0000000..74e2d71
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
@@ -0,0 +1,62 @@
+package org.apache.kylin.metadata.filter;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.kylin.common.util.DateFormat;
+import org.apache.kylin.metadata.model.TblColRef;
+
+import java.util.Collection;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class DateConditionModifier implements TupleFilterSerializer.Decorator {
+
+    private IdentityHashMap<TupleFilter, Boolean> dateCompareTupleChildren;
+
+    public DateConditionModifier(TupleFilter root) {
+        this.dateCompareTupleChildren = Maps.newIdentityHashMap();
+    }
+
+    /**
+     * replace filter on timestamp column to null, so that two tuple filter trees can
+     * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
+     * @param filter
+     * @return
+     */
+    @Override
+    public TupleFilter onSerialize(TupleFilter filter) {
+
+        if (filter instanceof CompareTupleFilter) {
+            CompareTupleFilter cfilter = (CompareTupleFilter) filter;
+            List<? extends TupleFilter> children = cfilter.getChildren();
+
+            if (children == null || children.size() < 1) {
+                throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
+            }
+
+            TblColRef col = cfilter.getColumn();
+            if (col == null || (!"date".equals(col.getDatatype()))) {
+                return cfilter;
+            }
+
+            for (TupleFilter child : filter.getChildren()) {
+                dateCompareTupleChildren.put(child, true);
+            }
+        }
+
+        if (filter instanceof ConstantTupleFilter && dateCompareTupleChildren.containsKey(filter)) {
+            ConstantTupleFilter constantTupleFilter = (ConstantTupleFilter) filter;
+            Set<String> newValues = Sets.newHashSet();
+
+            for (String value : (Collection<String>) constantTupleFilter.getValues()) {
+                newValues.add(DateFormat.formatToDateStr(Long.valueOf(value)));
+            }
+            return new ConstantTupleFilter(newValues);
+        }
+        return filter;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
deleted file mode 100644
index 3ed5d07..0000000
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.apache.kylin.metadata.filter;
-
-import java.util.IdentityHashMap;
-
-import org.apache.kylin.metadata.model.TblColRef;
-
-import com.google.common.collect.Maps;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 4/13/15.
- */
-public class IgnoreTsCondition implements TupleFilterSerializer.Decorator {
-
-    private final TblColRef tsColumn;
-    private final TupleFilter root;
-
-    private IdentityHashMap<TupleFilter, Boolean> isInTopLevelANDs;
-
-    public IgnoreTsCondition(TblColRef tsColumn, TupleFilter root) {
-        this.tsColumn = tsColumn;
-        this.root = root;
-        this.isInTopLevelANDs = Maps.newIdentityHashMap();
-    }
-
-    /**
-     * replace filter on timestamp column to null, so that two tuple filter trees can
-     * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
-     * @param filter
-     * @return
-     */
-    @Override
-    public TupleFilter onSerialize(TupleFilter filter) {
-
-        if (filter == null)
-            return null;
-
-        //we just need reference equal
-        if (root == filter) {
-            isInTopLevelANDs.put(filter, true);
-        }
-
-        if (isInTopLevelANDs.containsKey(filter)) {
-            classifyChildrenByMarking(filter);
-
-            if (filter instanceof CompareTupleFilter) {
-                TblColRef c = ((CompareTupleFilter) filter).getColumn();
-                if (c != null && c.equals(tsColumn)) {
-                    return null;
-                }
-            }
-        }
-
-        return filter;
-    }
-
-    private void classifyChildrenByMarking(TupleFilter filter) {
-        if (filter instanceof LogicalTupleFilter) {
-            if (filter.getOperator() == TupleFilter.FilterOperatorEnum.AND) {
-                for (TupleFilter child : filter.getChildren()) {
-                    isInTopLevelANDs.put(child, true);
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
new file mode 100644
index 0000000..5a7ee40
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
@@ -0,0 +1,64 @@
+package org.apache.kylin.metadata.filter;
+
+import com.google.common.collect.Maps;
+import org.apache.kylin.metadata.model.TblColRef;
+
+import java.util.IdentityHashMap;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class TsConditionEraser implements TupleFilterSerializer.Decorator {
+
+    private final TblColRef tsColumn;
+    private final TupleFilter root;
+
+    private IdentityHashMap<TupleFilter, Boolean> isInTopLevelANDs;
+
+    public TsConditionEraser(TblColRef tsColumn, TupleFilter root) {
+        this.tsColumn = tsColumn;
+        this.root = root;
+        this.isInTopLevelANDs = Maps.newIdentityHashMap();
+    }
+
+    /**
+     * replace filter on timestamp column to null, so that two tuple filter trees can
+     * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
+     * @param filter
+     * @return
+     */
+    @Override
+    public TupleFilter onSerialize(TupleFilter filter) {
+
+        if (filter == null)
+            return null;
+
+        //we just need reference equal
+        if (root == filter) {
+            isInTopLevelANDs.put(filter, true);
+        }
+
+        if (isInTopLevelANDs.containsKey(filter)) {
+            classifyChildrenByMarking(filter);
+
+            if (filter instanceof CompareTupleFilter) {
+                TblColRef c = ((CompareTupleFilter) filter).getColumn();
+                if (c != null && c.equals(tsColumn)) {
+                    return null;
+                }
+            }
+        }
+
+        return filter;
+    }
+
+    private void classifyChildrenByMarking(TupleFilter filter) {
+        if (filter instanceof LogicalTupleFilter) {
+            if (filter.getOperator() == TupleFilter.FilterOperatorEnum.AND) {
+                for (TupleFilter child : filter.getChildren()) {
+                    isInTopLevelANDs.put(child, true);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java b/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
index fd3bba9..3a1d41a 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
@@ -2,7 +2,7 @@ package org.apache.kylin.metadata.realization;
 
 import java.util.Arrays;
 
-import org.apache.kylin.metadata.filter.IgnoreTsCondition;
+import org.apache.kylin.metadata.filter.TsConditionEraser;
 import org.apache.kylin.metadata.filter.StringCodeSystem;
 import org.apache.kylin.metadata.filter.TupleFilterSerializer;
 import org.apache.kylin.metadata.model.TblColRef;
@@ -25,7 +25,7 @@ public class StreamSQLDigest {
         this.sqlDigest = sqlDigest;
 
         //must use new instance of IgnoreTsCondition
-        IgnoreTsCondition decorator = new IgnoreTsCondition(tsCol, sqlDigest.filter);
+        TsConditionEraser decorator = new TsConditionEraser(tsCol, sqlDigest.filter);
         filterSerialized = TupleFilterSerializer.serialize(sqlDigest.filter, decorator, StringCodeSystem.INSTANCE);
 
         int nonFilterHashCode = calculateNonFilterHashCode();

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java b/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
index b7c2748..a5019ab 100644
--- a/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
+++ b/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
@@ -18,23 +18,25 @@
 
 package org.apache.kylin.query.enumerator;
 
-import java.util.Map;
-import java.util.Properties;
-
 import net.hydromatic.linq4j.Enumerator;
 import net.hydromatic.optiq.DataContext;
 import net.hydromatic.optiq.jdbc.OptiqConnection;
-
 import org.apache.kylin.metadata.filter.CompareTupleFilter;
+import org.apache.kylin.metadata.filter.DateConditionModifier;
 import org.apache.kylin.metadata.filter.TupleFilter;
+import org.apache.kylin.metadata.filter.TupleFilterSerializer;
 import org.apache.kylin.metadata.tuple.ITuple;
 import org.apache.kylin.metadata.tuple.ITupleIterator;
 import org.apache.kylin.query.relnode.OLAPContext;
 import org.apache.kylin.storage.IStorageEngine;
 import org.apache.kylin.storage.StorageEngineFactory;
+import org.apache.kylin.storage.hbase.coprocessor.DictCodeSystem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
+import java.util.Properties;
+
 /**
  * @author xjiang
  */
@@ -105,6 +107,10 @@ public class OLAPEnumerator implements Enumerator<Object[]> {
         // bind dynamic variables
         bindVariable(olapContext.filter);
 
+        //modify date condition
+        olapContext.filter = modifyDateCondition(olapContext.filter);
+        olapContext.resetSQLDigest();
+
         // query storage engine
         IStorageEngine storageEngine = StorageEngineFactory.getStorageEngine(olapContext.realization, true);
         ITupleIterator iterator = storageEngine.search(olapContext.storageContext, olapContext.getSQLDigest(), olapContext.returnTupleInfo);
@@ -115,6 +121,12 @@ public class OLAPEnumerator implements Enumerator<Object[]> {
         return iterator;
     }
 
+    private TupleFilter modifyDateCondition(TupleFilter filter) {
+        DateConditionModifier filterDecorator = new DateConditionModifier(filter);
+        byte[] bytes = TupleFilterSerializer.serialize(filter, filterDecorator, DictCodeSystem.INSTANCE);
+        return TupleFilterSerializer.deserialize(bytes, DictCodeSystem.INSTANCE);
+    }
+
     private void bindVariable(TupleFilter filter) {
         if (filter == null) {
             return;

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
----------------------------------------------------------------------
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 2d89975..6121c80 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
@@ -18,25 +18,19 @@
 
 package org.apache.kylin.query.relnode;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.kylin.metadata.realization.SQLDigest;
-import org.apache.kylin.query.schema.OLAPSchema;
-import org.eigenbase.reltype.RelDataType;
-import org.eigenbase.reltype.RelDataTypeField;
+import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.model.FunctionDesc;
 import org.apache.kylin.metadata.model.JoinDesc;
 import org.apache.kylin.metadata.model.TblColRef;
 import org.apache.kylin.metadata.realization.IRealization;
+import org.apache.kylin.metadata.realization.SQLDigest;
+import org.apache.kylin.query.schema.OLAPSchema;
 import org.apache.kylin.storage.StorageContext;
 import org.apache.kylin.storage.tuple.TupleInfo;
-import org.apache.kylin.metadata.filter.TupleFilter;
+import org.eigenbase.reltype.RelDataType;
+import org.eigenbase.reltype.RelDataTypeField;
+
+import java.util.*;
 
 /**
  * @author xjiang
@@ -132,6 +126,11 @@ public class OLAPContext {
         return sqlDigest;
     }
 
+    public void resetSQLDigest()
+    {
+        this.sqlDigest = null;
+    }
+
     public void setReturnTupleInfo(RelDataType rowType, ColumnRowType columnRowType) {
         TupleInfo info = new TupleInfo();
         List<RelDataTypeField> fieldList = rowType.getFieldList();

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
index 6f8f0f7..71cb2fa 100644
--- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
+++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
@@ -29,7 +29,6 @@ import net.hydromatic.optiq.runtime.SqlFunctions;
 import org.apache.kylin.metadata.filter.*;
 import org.apache.kylin.metadata.filter.TupleFilter.FilterOperatorEnum;
 import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.DateConditionInplaceModifier;
 import org.eigenbase.rel.FilterRelBase;
 import org.eigenbase.rel.RelCollation;
 import org.eigenbase.rel.RelNode;
@@ -260,10 +259,11 @@ public class OLAPFilterRel extends FilterRelBase implements OLAPRel, EnumerableR
 
         TupleFilterVisitor visitor = new TupleFilterVisitor(this.columnRowType, context);
         context.filter = this.condition.accept(visitor);
-        DateConditionInplaceModifier.modify(context.filter);
+
         context.filterColumns = collectColumns(context.filter);
     }
 
+
     private Set<TblColRef> collectColumns(TupleFilter filter) {
         Set<TblColRef> ret = Sets.newHashSet();
         collectColumnsRecursively(filter, ret);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java b/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
index 7a13607..37fc4f3 100644
--- a/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
+++ b/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
@@ -61,7 +61,7 @@ public class IIQueryTest extends KylinQueryTest {
 
     @Parameterized.Parameters
     public static Collection<Object[]> configs() {
-        return Arrays.asList(new Object[][]{{"inner"}, {"left"}});
+        return Arrays.asList(new Object[][] { { "inner" }, { "left" } });
     }
 
     public IIQueryTest(String joinType) throws Exception {
@@ -74,6 +74,11 @@ public class IIQueryTest extends KylinQueryTest {
     }
 
     @Test
+    public void testSingleRunQuery() throws Exception {
+        super.testSingleRunQuery();
+    }
+
+    @Test
     public void testDetailedQuery() throws Exception {
         execAndCompQuery("src/test/resources/query/sql_ii", null, true);
     }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java b/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
index e95da2c..40372ff 100644
--- a/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
+++ b/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
@@ -95,7 +95,7 @@ public class KylinQueryTest extends KylinTestBase {
     @Test
     public void testSingleRunQuery() throws Exception {
 
-        String queryFileName = "src/test/resources/query/sql_orderby/query01.sql";
+        String queryFileName = "src/test/resources/query/sql_derived/query07.sql";
 
         File sqlFile = new File(queryFileName);
         if (sqlFile.exists()) {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java b/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
index c1da586..89fb01d 100644
--- a/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
+++ b/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
@@ -18,31 +18,9 @@
 
 package org.apache.kylin.query.test;
 
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.LogManager;
-
+import com.google.common.io.Files;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.kylin.common.KylinConfig;
 import org.dbunit.Assertion;
 import org.dbunit.database.DatabaseConfig;
 import org.dbunit.database.DatabaseConnection;
@@ -56,8 +34,11 @@ import org.dbunit.ext.h2.H2Connection;
 import org.dbunit.ext.h2.H2DataTypeFactory;
 import org.junit.Assert;
 
-import com.google.common.io.Files;
-import org.apache.kylin.common.KylinConfig;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.sql.*;
+import java.util.*;
+import java.util.logging.LogManager;
 
 /**
  * Created by hongbin on 2/18/14.

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java b/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
new file mode 100644
index 0000000..18a0e02
--- /dev/null
+++ b/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
@@ -0,0 +1,8 @@
+package org.apache.kylin.storage.cache;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 5/11/15.
+ */
+public interface StorageLayerCache {
+    boolean isCacheEnabled();
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
deleted file mode 100644
index 8569058..0000000
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.apache.kylin.storage.hbase.coprocessor;
-
-import com.google.common.collect.Lists;
-import org.apache.kylin.common.util.DateFormat;
-import org.apache.kylin.metadata.filter.CompareTupleFilter;
-import org.apache.kylin.metadata.filter.ConstantTupleFilter;
-import org.apache.kylin.metadata.filter.TupleFilter;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 5/7/15.
- *
- * For historical reasons, date types are encoded with DateStrDcitionary
- * rather than TimeStrDictionary, so the constant in CompareTupleFilter should
- * be corrected to "yyyy-MM-dd" format for date types
- */
-public class DateConditionInplaceModifier {
-
-    public static void modify(TupleFilter filter) {
-
-        if (filter instanceof CompareTupleFilter) {
-            CompareTupleFilter cfilter = (CompareTupleFilter) filter;
-            List<? extends TupleFilter> children = cfilter.getChildren();
-
-            if (children == null || children.size() < 1) {
-                throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
-            }
-
-            if (cfilter.getColumn() == null || (!"date".equals(cfilter.getColumn().getColumnDesc().getTypeName()))) {
-                return;
-            }
-
-            int nonConstantChild = 0;
-            boolean firstUpdate = true;
-            for (int i = 0; i < children.size(); ++i) {
-                if (children.get(i) instanceof ConstantTupleFilter) {
-                    ConstantTupleFilter constantAsFilter = (ConstantTupleFilter) children.get(i);
-                    Collection<?> values = constantAsFilter.getValues();
-                    Collection<Object> newValues = Lists.newArrayList();
-                    for (Object x : values) {
-                        newValues.add(x == null ? null : DateFormat.formatToDateStr(Long.parseLong((String) x)));
-                    }
-                    cfilter.updateValues(newValues, firstUpdate);
-                    firstUpdate=false;
-                } else {
-                    nonConstantChild++;
-                }
-            }
-            if (nonConstantChild != 1) {
-                throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
-            }
-
-            return;
-
-        } else {
-            for (TupleFilter child : filter.getChildren()) {
-                modify(child);
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
deleted file mode 100644
index 204e8c6..0000000
--- a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.kylin.storage.filter;
-
-import org.apache.kylin.metadata.filter.ColumnTupleFilter;
-import org.apache.kylin.metadata.filter.CompareTupleFilter;
-import org.apache.kylin.metadata.filter.ConstantTupleFilter;
-import org.apache.kylin.metadata.filter.TupleFilter;
-import org.apache.kylin.metadata.model.ColumnDesc;
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.DateConditionInplaceModifier;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 5/7/15.
- */
-public class DateConditionInplaceModifierTest extends FilterBaseTest {
-    @Test
-    public void basicTest() {
-        TableDesc t1 = TableDesc.mockup("DEFAULT.TEST_KYLIN_FACT");
-        ColumnDesc c1 = ColumnDesc.mockup(t1, 2, "CAL_DT", "date");
-        TblColRef column = new TblColRef(c1);
-
-        CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
-        ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
-        compareFilter.addChild(columnFilter);
-        ConstantTupleFilter constantFilter = null;
-        constantFilter = new ConstantTupleFilter("946684800000");
-        compareFilter.addChild(constantFilter);
-
-        DateConditionInplaceModifier.modify(compareFilter);
-        Assert.assertEquals("2000-01-01",compareFilter.getFirstValue());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
new file mode 100644
index 0000000..29cf7b1
--- /dev/null
+++ b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
@@ -0,0 +1,33 @@
+package org.apache.kylin.storage.filter;
+
+import org.apache.kylin.metadata.filter.*;
+import org.apache.kylin.metadata.model.ColumnDesc;
+import org.apache.kylin.metadata.model.TableDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.storage.hbase.coprocessor.DictCodeSystem;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 5/7/15.
+ */
+public class DateConditionModifierTest extends FilterBaseTest {
+    @Test
+    public void basicTest() {
+        TableDesc t1 = TableDesc.mockup("DEFAULT.TEST_KYLIN_FACT");
+        ColumnDesc c1 = ColumnDesc.mockup(t1, 2, "CAL_DT", "date");
+        TblColRef column = new TblColRef(c1);
+
+        CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+        ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
+        compareFilter.addChild(columnFilter);
+        ConstantTupleFilter constantFilter = null;
+        constantFilter = new ConstantTupleFilter("946684800000");
+        compareFilter.addChild(constantFilter);
+
+        DateConditionModifier filterDecorator = new DateConditionModifier(compareFilter);
+        byte[] bytes = TupleFilterSerializer.serialize(compareFilter, filterDecorator, DictCodeSystem.INSTANCE);
+        CompareTupleFilter compareTupleFilter = (CompareTupleFilter) TupleFilterSerializer.deserialize(bytes, DictCodeSystem.INSTANCE);
+        Assert.assertEquals("2000-01-01", compareTupleFilter.getFirstValue());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
deleted file mode 100644
index 52fc5cd..0000000
--- a/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.kylin.storage.filter;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.kylin.common.util.LocalFileMetadataTestCase;
-import org.apache.kylin.invertedindex.IIInstance;
-import org.apache.kylin.invertedindex.IIManager;
-import org.apache.kylin.invertedindex.index.TableRecordInfo;
-import org.apache.kylin.metadata.MetadataManager;
-import org.apache.kylin.metadata.filter.*;
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.Lists;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 4/13/15.
- */
-public class IgnoreTsConditionTest extends LocalFileMetadataTestCase {
-    IIInstance ii;
-    TableRecordInfo tableRecordInfo;
-    CoprocessorFilter filter;
-    TableDesc factTableDesc;
-
-    TblColRef caldt;
-    TblColRef siteId;
-
-    @Before
-    public void setup() throws IOException {
-        this.createTestMetadata();
-        this.ii = IIManager.getInstance(getTestConfig()).getII("test_kylin_ii_left_join");
-        this.tableRecordInfo = new TableRecordInfo(ii.getFirstSegment());
-        this.factTableDesc = MetadataManager.getInstance(getTestConfig()).getTableDesc("DEFAULT.TEST_KYLIN_FACT");
-        this.caldt = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "CAL_DT");
-        this.siteId = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "LSTG_SITE_ID");
-    }
-
-    @After
-    public void cleanUp() {
-        cleanupTestMetadata();
-    }
-
-    private TupleFilter mockFilter1(int year) {
-        CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
-        aFilter.addChild(new ColumnTupleFilter(caldt));
-        aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
-
-        CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        bFilter.addChild(new ColumnTupleFilter(caldt));
-        bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
-
-        CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        cFilter.addChild(new ColumnTupleFilter(caldt));
-        cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
-
-        CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
-        dFilter.addChild(new ColumnTupleFilter(siteId));
-        dFilter.addChild(new ConstantTupleFilter("0"));
-
-        LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
-        subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
-
-        CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        outFilter.addChild(new ColumnTupleFilter(caldt));
-        outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
-
-        LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
-        root.addChildren(Lists.newArrayList(subRoot, outFilter));
-        return root;
-    }
-
-    private TupleFilter mockFilter2(int year) {
-        CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
-        aFilter.addChild(new ColumnTupleFilter(caldt));
-        aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
-
-        CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        bFilter.addChild(new ColumnTupleFilter(caldt));
-        bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
-
-        CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        cFilter.addChild(new ColumnTupleFilter(caldt));
-        cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
-
-        CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
-        dFilter.addChild(new ColumnTupleFilter(siteId));
-        dFilter.addChild(new ConstantTupleFilter("0"));
-
-        LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR);
-        subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
-
-        CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
-        outFilter.addChild(new ColumnTupleFilter(caldt));
-        outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
-
-        LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
-        root.addChildren(Lists.newArrayList(subRoot, outFilter));
-        return root;
-    }
-
-    @Test
-    public void positiveTest() {
-
-        TupleFilter a = mockFilter1(2000);
-        TupleFilter b = mockFilter1(2001);
-
-        IgnoreTsCondition decoratorA = new IgnoreTsCondition(caldt, a);
-        byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
-        IgnoreTsCondition decoratorB = new IgnoreTsCondition(caldt, b);
-        byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
-        Assert.assertArrayEquals(aBytes, bBytes);
-
-    }
-
-    @Test
-    public void negativeTest()
-    {
-        TupleFilter a = mockFilter2(2000);
-        TupleFilter b = mockFilter2(2001);
-
-        IgnoreTsCondition decoratorA = new IgnoreTsCondition(caldt, a);
-        byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
-        IgnoreTsCondition decoratorB = new IgnoreTsCondition(caldt, b);
-        byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
-        Assert.assertFalse(Arrays.equals(aBytes,bBytes));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
new file mode 100644
index 0000000..c1fff70
--- /dev/null
+++ b/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
@@ -0,0 +1,133 @@
+package org.apache.kylin.storage.filter;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.invertedindex.IIInstance;
+import org.apache.kylin.invertedindex.IIManager;
+import org.apache.kylin.invertedindex.index.TableRecordInfo;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.filter.*;
+import org.apache.kylin.metadata.model.TableDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class TsConditionEraserTest extends LocalFileMetadataTestCase {
+    IIInstance ii;
+    TableRecordInfo tableRecordInfo;
+    CoprocessorFilter filter;
+    TableDesc factTableDesc;
+
+    TblColRef caldt;
+    TblColRef siteId;
+
+    @Before
+    public void setup() throws IOException {
+        this.createTestMetadata();
+        this.ii = IIManager.getInstance(getTestConfig()).getII("test_kylin_ii_left_join");
+        this.tableRecordInfo = new TableRecordInfo(ii.getFirstSegment());
+        this.factTableDesc = MetadataManager.getInstance(getTestConfig()).getTableDesc("DEFAULT.TEST_KYLIN_FACT");
+        this.caldt = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "CAL_DT");
+        this.siteId = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "LSTG_SITE_ID");
+    }
+
+    @After
+    public void cleanUp() {
+        cleanupTestMetadata();
+    }
+
+    private TupleFilter mockFilter1(int year) {
+        CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
+        aFilter.addChild(new ColumnTupleFilter(caldt));
+        aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
+
+        CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        bFilter.addChild(new ColumnTupleFilter(caldt));
+        bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
+
+        CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        cFilter.addChild(new ColumnTupleFilter(caldt));
+        cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
+
+        CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+        dFilter.addChild(new ColumnTupleFilter(siteId));
+        dFilter.addChild(new ConstantTupleFilter("0"));
+
+        LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+        subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
+
+        CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        outFilter.addChild(new ColumnTupleFilter(caldt));
+        outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
+
+        LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+        root.addChildren(Lists.newArrayList(subRoot, outFilter));
+        return root;
+    }
+
+    private TupleFilter mockFilter2(int year) {
+        CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
+        aFilter.addChild(new ColumnTupleFilter(caldt));
+        aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
+
+        CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        bFilter.addChild(new ColumnTupleFilter(caldt));
+        bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
+
+        CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        cFilter.addChild(new ColumnTupleFilter(caldt));
+        cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
+
+        CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+        dFilter.addChild(new ColumnTupleFilter(siteId));
+        dFilter.addChild(new ConstantTupleFilter("0"));
+
+        LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR);
+        subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
+
+        CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+        outFilter.addChild(new ColumnTupleFilter(caldt));
+        outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
+
+        LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+        root.addChildren(Lists.newArrayList(subRoot, outFilter));
+        return root;
+    }
+
+    @Test
+    public void positiveTest() {
+
+        TupleFilter a = mockFilter1(2000);
+        TupleFilter b = mockFilter1(2001);
+
+        TsConditionEraser decoratorA = new TsConditionEraser(caldt, a);
+        byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
+        TsConditionEraser decoratorB = new TsConditionEraser(caldt, b);
+        byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
+        Assert.assertArrayEquals(aBytes, bBytes);
+
+    }
+
+    @Test
+    public void negativeTest()
+    {
+        TupleFilter a = mockFilter2(2000);
+        TupleFilter b = mockFilter2(2001);
+
+        TsConditionEraser decoratorA = new TsConditionEraser(caldt, a);
+        byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
+        TsConditionEraser decoratorB = new TsConditionEraser(caldt, b);
+        byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
+        Assert.assertFalse(Arrays.equals(aBytes,bBytes));
+    }
+}