You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2015/03/14 01:00:51 UTC

[16/50] [abbrv] incubator-kylin git commit: KYLIN-625, formalize ICodeSystem

KYLIN-625, formalize ICodeSystem


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

Branch: refs/heads/streaming-localdict
Commit: 6ecd73ea2f55b4cb39ed6ac9c9a1c33a40a19579
Parents: 2be4e32
Author: Li, Yang <ya...@ebay.com>
Authored: Wed Mar 11 10:40:51 2015 +0800
Committer: Li, Yang <ya...@ebay.com>
Committed: Wed Mar 11 10:40:51 2015 +0800

----------------------------------------------------------------------
 .../kylin/metadata/filter/CaseTupleFilter.java  |  9 ++++--
 .../metadata/filter/ColumnTupleFilter.java      |  8 ++++--
 .../metadata/filter/CompareTupleFilter.java     |  6 +++-
 .../metadata/filter/ConstantTupleFilter.java    |  7 +++--
 .../metadata/filter/DynamicTupleFilter.java     |  8 ++++--
 .../metadata/filter/ExtractTupleFilter.java     |  9 ++++--
 .../kylin/metadata/filter/ICodeSystem.java      | 23 ---------------
 .../metadata/filter/IEvaluatableTuple.java      |  9 ------
 .../metadata/filter/LogicalTupleFilter.java     | 15 ++++++----
 .../kylin/metadata/filter/StringCodeSystem.java | 25 +++++++++++-----
 .../kylin/metadata/filter/TupleFilter.java      |  8 ++++--
 .../metadata/filter/TupleFilterSerializer.java  | 11 +++----
 .../kylin/metadata/tuple/ICodeSystem.java       | 30 ++++++++++++++++++++
 .../kylin/metadata/tuple/IEvaluatableTuple.java |  9 ++++++
 .../org/apache/kylin/metadata/tuple/ITuple.java |  3 +-
 .../storage/hbase/DerivedFilterTranslator.java  |  2 +-
 .../hbase/coprocessor/CoprocessorFilter.java    |  2 +-
 .../hbase/coprocessor/DictCodeSystem.java       | 22 ++++++++++----
 .../coprocessor/observer/ObserverTuple.java     |  2 +-
 .../kylin/storage/filter/FilterBaseTest.java    |  1 +
 20 files changed, 130 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/CaseTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/CaseTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/CaseTupleFilter.java
index d3ec3e3..4b85172 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/CaseTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/CaseTupleFilter.java
@@ -23,6 +23,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
+
 
 /**
  * @author xjiang
@@ -62,7 +65,7 @@ public class CaseTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         if (whenFilters.size() != thenFilters.size()) {
             elseFilter = whenFilters.remove(whenFilters.size() - 1);
         }
@@ -100,12 +103,12 @@ public class CaseTupleFilter extends TupleFilter {
     }
 
     @Override
-    public byte[] serialize(ICodeSystem cs) {
+    public byte[] serialize(ICodeSystem<?> cs) {
         return new byte[0];
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/ColumnTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/ColumnTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/ColumnTupleFilter.java
index a294112..75f534d 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/ColumnTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/ColumnTupleFilter.java
@@ -28,6 +28,8 @@ import org.apache.kylin.common.util.BytesUtil;
 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.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 /**
  * 
@@ -66,7 +68,7 @@ public class ColumnTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         this.tupleValue = tuple.getValue(columnRef);
         return true;
     }
@@ -83,7 +85,7 @@ public class ColumnTupleFilter extends TupleFilter {
     }
 
     @Override
-    public byte[] serialize(ICodeSystem cs) {
+    public byte[] serialize(ICodeSystem<?> cs) {
         ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
         String table = columnRef.getTable();
         BytesUtil.writeUTFString(table, buffer);
@@ -103,7 +105,7 @@ public class ColumnTupleFilter extends TupleFilter {
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
         TableDesc table = null;
         ColumnDesc column = new ColumnDesc();
         ByteBuffer buffer = ByteBuffer.wrap(bytes);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/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 48b31ea..71950ff 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
@@ -27,6 +27,8 @@ import java.util.Map;
 
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 /**
  * @author xjiang
@@ -128,6 +130,7 @@ public class CompareTupleFilter extends TupleFilter {
 
     // TODO requires generalize, currently only evaluates COLUMN {op} CONST
     @Override
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
         // extract tuple value
         Object tupleValue = null;
@@ -194,6 +197,7 @@ public class CompareTupleFilter extends TupleFilter {
         return column != null && !conditionValues.isEmpty();
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public byte[] serialize(ICodeSystem cs) {
         ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
@@ -209,7 +213,7 @@ public class CompareTupleFilter extends TupleFilter {
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
         this.dynamicVariables.clear();
         ByteBuffer buffer = ByteBuffer.wrap(bytes);
         int size = BytesUtil.readVInt(buffer);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
index 2280c6a..c92b743 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.HashSet;
 
 import org.apache.kylin.common.util.BytesUtil;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 /**
  * 
@@ -63,7 +65,7 @@ public class ConstantTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         return constantValues.size() > 0;
     }
 
@@ -77,6 +79,7 @@ public class ConstantTupleFilter extends TupleFilter {
         return this.constantValues;
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public byte[] serialize(ICodeSystem cs) {
         ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
@@ -91,7 +94,7 @@ public class ConstantTupleFilter extends TupleFilter {
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
         this.constantValues.clear();
         ByteBuffer buffer = ByteBuffer.wrap(bytes);
         int size = BytesUtil.readVInt(buffer);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/DynamicTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/DynamicTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/DynamicTupleFilter.java
index 64f12b8..3d7f65f 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/DynamicTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/DynamicTupleFilter.java
@@ -23,6 +23,8 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.kylin.common.util.BytesUtil;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 /**
  * 
@@ -53,7 +55,7 @@ public class DynamicTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         return true;
     }
 
@@ -68,7 +70,7 @@ public class DynamicTupleFilter extends TupleFilter {
     }
 
     @Override
-    public byte[] serialize(ICodeSystem cs) {
+    public byte[] serialize(ICodeSystem<?> cs) {
         ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
         BytesUtil.writeUTFString(variableName, buffer);
         byte[] result = new byte[buffer.position()];
@@ -77,7 +79,7 @@ public class DynamicTupleFilter extends TupleFilter {
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
         ByteBuffer buffer = ByteBuffer.wrap(bytes);
         this.variableName = BytesUtil.readUTFString(buffer);
     }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/ExtractTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/ExtractTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/ExtractTupleFilter.java
index 929ab0f..ad1395c 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/ExtractTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/ExtractTupleFilter.java
@@ -22,6 +22,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
+
 
 /**
  * 
@@ -52,7 +55,7 @@ public class ExtractTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         // extract tuple value
         String extractType = null;
         String tupleValue = null;
@@ -112,12 +115,12 @@ public class ExtractTupleFilter extends TupleFilter {
     }
 
     @Override
-    public byte[] serialize(ICodeSystem cs) {
+    public byte[] serialize(ICodeSystem<?> cs) {
         return new byte[0];
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/ICodeSystem.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/ICodeSystem.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/ICodeSystem.java
deleted file mode 100644
index 39dcd16..0000000
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/ICodeSystem.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.apache.kylin.metadata.filter;
-
-import java.nio.ByteBuffer;
-
-/**
- * Decides how constant values in filter are coded and compared.
- * 
- * TupleFilter are involved in both query engine and coprocessor. In query engine, the values are strings.
- * In coprocessor, the values are dictionary IDs.
- * 
- * @author yangli9
- */
-public interface ICodeSystem {
-
-    boolean isNull(Object value);
-
-    int compare(Object tupleValue, Object constValue);
-
-    void serialize(Object value, ByteBuffer buffer);
-
-    Object deserialize(ByteBuffer buffer);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/IEvaluatableTuple.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/IEvaluatableTuple.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/IEvaluatableTuple.java
deleted file mode 100644
index 92f83f1..0000000
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/IEvaluatableTuple.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.kylin.metadata.filter;
-
-import org.apache.kylin.metadata.model.TblColRef;
-
-public interface IEvaluatableTuple {
-
-    public Object getValue(TblColRef col);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
index 6b77cb5..0c8f96b 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/LogicalTupleFilter.java
@@ -24,6 +24,9 @@ import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
+
 
 public class LogicalTupleFilter extends TupleFilter {
 
@@ -69,7 +72,7 @@ public class LogicalTupleFilter extends TupleFilter {
     }
 
     @Override
-    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs) {
+    public boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         switch (this.operator) {
         case AND:
             return evalAnd(tuple, cs);
@@ -82,7 +85,7 @@ public class LogicalTupleFilter extends TupleFilter {
         }
     }
 
-    private boolean evalAnd(IEvaluatableTuple tuple, ICodeSystem cs) {
+    private boolean evalAnd(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         for (TupleFilter filter : this.children) {
             if (!filter.evaluate(tuple, cs)) {
                 return false;
@@ -91,7 +94,7 @@ public class LogicalTupleFilter extends TupleFilter {
         return true;
     }
 
-    private boolean evalOr(IEvaluatableTuple tuple, ICodeSystem cs) {
+    private boolean evalOr(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         for (TupleFilter filter : this.children) {
             if (filter.evaluate(tuple, cs)) {
                 return true;
@@ -100,7 +103,7 @@ public class LogicalTupleFilter extends TupleFilter {
         return false;
     }
 
-    private boolean evalNot(IEvaluatableTuple tuple, ICodeSystem cs) {
+    private boolean evalNot(IEvaluatableTuple tuple, ICodeSystem<?> cs) {
         return !this.children.get(0).evaluate(tuple, cs);
     }
 
@@ -115,12 +118,12 @@ public class LogicalTupleFilter extends TupleFilter {
     }
 
     @Override
-    public byte[] serialize(ICodeSystem cs) {
+    public byte[] serialize(ICodeSystem<?> cs) {
         return new byte[0];
     }
 
     @Override
-    public void deserialize(byte[] bytes, ICodeSystem cs) {
+    public void deserialize(byte[] bytes, ICodeSystem<?> cs) {
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/StringCodeSystem.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/StringCodeSystem.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/StringCodeSystem.java
index b39b398..5240491 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/StringCodeSystem.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/StringCodeSystem.java
@@ -3,13 +3,14 @@ package org.apache.kylin.metadata.filter;
 import java.nio.ByteBuffer;
 
 import org.apache.kylin.common.util.BytesUtil;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
 
 /**
  * A simple code system where all values are strings and conform to string comparison system.
  * 
  * @author yangli9
  */
-public class StringCodeSystem implements ICodeSystem {
+public class StringCodeSystem implements ICodeSystem<String> {
     
     public static final StringCodeSystem INSTANCE = new StringCodeSystem();
     
@@ -18,22 +19,32 @@ public class StringCodeSystem implements ICodeSystem {
     }
 
     @Override
-    public boolean isNull(Object value) {
+    public String encode(Object value) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Object decode(String code) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isNull(String value) {
         return value == null;
     }
 
     @Override
-    public int compare(Object tupleValue, Object constValue) {
-        return ((String) tupleValue).compareTo((String) constValue);
+    public int compare(String tupleValue, String constValue) {
+        return tupleValue.compareTo(constValue);
     }
 
     @Override
-    public void serialize(Object value, ByteBuffer buffer) {
-        BytesUtil.writeUTFString((String) value, buffer);
+    public void serialize(String value, ByteBuffer buffer) {
+        BytesUtil.writeUTFString( value, buffer);
     }
 
     @Override
-    public Object deserialize(ByteBuffer buffer) {
+    public String deserialize(ByteBuffer buffer) {
         return BytesUtil.readUTFString(buffer);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java
index 5293d42..75d55c3 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilter.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 import com.google.common.collect.Maps;
 
@@ -188,13 +190,13 @@ public abstract class TupleFilter {
 
     public abstract boolean isEvaluable();
 
-    public abstract boolean evaluate(IEvaluatableTuple tuple, ICodeSystem cs);
+    public abstract boolean evaluate(IEvaluatableTuple tuple, ICodeSystem<?> cs);
 
     public abstract Collection<?> getValues();
 
-    abstract byte[] serialize(ICodeSystem cs);
+    abstract byte[] serialize(ICodeSystem<?> cs);
 
-    abstract void deserialize(byte[] bytes, ICodeSystem cs);
+    abstract void deserialize(byte[] bytes, ICodeSystem<?> cs);
 
     public static boolean isEvaluableRecursively(TupleFilter filter) {
         if (filter == null)

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
index ba4b5e6..5164c5b 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.Stack;
 
 import org.apache.kylin.common.util.BytesUtil;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
 
 /**
  * http://eli.thegreenplace.net/2011/09/29/an-interesting-tree-serialization-algorithm-from-dwarf
@@ -46,11 +47,11 @@ public class TupleFilterSerializer {
         }
     }
 
-    public static byte[] serialize(TupleFilter rootFilter, ICodeSystem cs) {
+    public static byte[] serialize(TupleFilter rootFilter, ICodeSystem<?> cs) {
         return serialize(rootFilter, null, cs);
     }
 
-    public static byte[] serialize(TupleFilter rootFilter, Decorator decorator, ICodeSystem cs) {
+    public static byte[] serialize(TupleFilter rootFilter, Decorator decorator, ICodeSystem<?> cs) {
         ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
         internalSerialize(rootFilter, decorator, buffer, cs);
         byte[] result = new byte[buffer.position()];
@@ -58,7 +59,7 @@ public class TupleFilterSerializer {
         return result;
     }
 
-    private static void internalSerialize(TupleFilter filter, Decorator decorator, ByteBuffer buffer, ICodeSystem cs) {
+    private static void internalSerialize(TupleFilter filter, Decorator decorator, ByteBuffer buffer, ICodeSystem<?> cs) {
         if (decorator != null) { // give decorator a chance to manipulate the
                                  // output filter
             filter = decorator.onSerialize(filter);
@@ -83,7 +84,7 @@ public class TupleFilterSerializer {
         }
     }
 
-    private static void serializeFilter(int flag, TupleFilter filter, Decorator decorator, ByteBuffer buffer, ICodeSystem cs) {
+    private static void serializeFilter(int flag, TupleFilter filter, Decorator decorator, ByteBuffer buffer, ICodeSystem<?> cs) {
         if (flag < 0) {
             BytesUtil.writeVInt(-1, buffer);
         } else {
@@ -95,7 +96,7 @@ public class TupleFilterSerializer {
         }
     }
 
-    public static TupleFilter deserialize(byte[] bytes, ICodeSystem cs) {
+    public static TupleFilter deserialize(byte[] bytes, ICodeSystem<?> cs) {
         ByteBuffer buffer = ByteBuffer.wrap(bytes);
         TupleFilter rootFilter = null;
         Stack<TupleFilter> parentStack = new Stack<TupleFilter>();

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/tuple/ICodeSystem.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/tuple/ICodeSystem.java b/metadata/src/main/java/org/apache/kylin/metadata/tuple/ICodeSystem.java
new file mode 100644
index 0000000..b5bc025
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/tuple/ICodeSystem.java
@@ -0,0 +1,30 @@
+package org.apache.kylin.metadata.tuple;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Decides how constant values are coded and compared.
+ * 
+ * TupleFilter are involved in both query engine and coprocessor. In query engine, the values are strings.
+ * In coprocessor, the values are dictionary IDs.
+ * 
+ * The type parameter is java type of code, which should be bytes. However some legacy implementation
+ * stores code as String.
+ * 
+ * @author yangli9
+ */
+public interface ICodeSystem<T> {
+    
+    T encode(Object value);
+    
+    Object decode(T code);
+
+    boolean isNull(T code);
+
+    int compare(T code1, T code2);
+
+    void serialize(T code, ByteBuffer buffer);
+
+    T deserialize(ByteBuffer code);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/tuple/IEvaluatableTuple.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/tuple/IEvaluatableTuple.java b/metadata/src/main/java/org/apache/kylin/metadata/tuple/IEvaluatableTuple.java
new file mode 100644
index 0000000..ce957b7
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/tuple/IEvaluatableTuple.java
@@ -0,0 +1,9 @@
+package org.apache.kylin.metadata.tuple;
+
+import org.apache.kylin.metadata.model.TblColRef;
+
+public interface IEvaluatableTuple {
+
+    public Object getValue(TblColRef col);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/metadata/src/main/java/org/apache/kylin/metadata/tuple/ITuple.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/tuple/ITuple.java b/metadata/src/main/java/org/apache/kylin/metadata/tuple/ITuple.java
index e5dbf08..05fe563 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/tuple/ITuple.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/tuple/ITuple.java
@@ -20,7 +20,6 @@ package org.apache.kylin.metadata.tuple;
 
 import java.util.List;
 
-import org.apache.kylin.metadata.filter.IEvaluatableTuple;
 import org.apache.kylin.metadata.model.TblColRef;
 
 /**
@@ -37,7 +36,7 @@ public interface ITuple extends IEvaluatableTuple {
 
     public Object[] getAllValues();
 
-    // declared in IEvaluatableTuple:  public Object getValue(TblColRef col);
+    // declared from IEvaluatableTuple:  public Object getValue(TblColRef col);
 
     public Object getValue(String field);
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/storage/src/main/java/org/apache/kylin/storage/hbase/DerivedFilterTranslator.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/DerivedFilterTranslator.java b/storage/src/main/java/org/apache/kylin/storage/hbase/DerivedFilterTranslator.java
index 7fc0429..36a281f 100644
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/DerivedFilterTranslator.java
+++ b/storage/src/main/java/org/apache/kylin/storage/hbase/DerivedFilterTranslator.java
@@ -30,12 +30,12 @@ import org.apache.kylin.dict.lookup.LookupStringTable;
 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.IEvaluatableTuple;
 import org.apache.kylin.metadata.filter.LogicalTupleFilter;
 import org.apache.kylin.metadata.filter.StringCodeSystem;
 import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.filter.TupleFilter.FilterOperatorEnum;
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
index ea4b2e1..a91999f 100644
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
+++ b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/CoprocessorFilter.java
@@ -22,10 +22,10 @@ import java.util.Set;
 
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.dict.IDictionaryAware;
-import org.apache.kylin.metadata.filter.IEvaluatableTuple;
 import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.filter.TupleFilterSerializer;
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 
 /**
  * @author yangli9

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DictCodeSystem.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DictCodeSystem.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DictCodeSystem.java
index 14497f4..cada02b 100644
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DictCodeSystem.java
+++ b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DictCodeSystem.java
@@ -4,9 +4,9 @@ import java.nio.ByteBuffer;
 
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.dict.Dictionary;
-import org.apache.kylin.metadata.filter.ICodeSystem;
+import org.apache.kylin.metadata.tuple.ICodeSystem;
 
-public class DictCodeSystem implements ICodeSystem {
+public class DictCodeSystem implements ICodeSystem<String> {
 
     public static final DictCodeSystem INSTANCE = new DictCodeSystem();
     
@@ -15,7 +15,17 @@ public class DictCodeSystem implements ICodeSystem {
     }
 
     @Override
-    public boolean isNull(Object value) {
+    public String encode(Object value) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Object decode(String code) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isNull(String value) {
         if (value == null)
             return true;
         
@@ -28,17 +38,17 @@ public class DictCodeSystem implements ICodeSystem {
     }
 
     @Override
-    public int compare(Object tupleValue, Object constValue) {
+    public int compare(String tupleValue, String constValue) {
         return ((String) tupleValue).compareTo((String) constValue);
     }
 
     @Override
-    public void serialize(Object value, ByteBuffer buffer) {
+    public void serialize(String value, ByteBuffer buffer) {
         BytesUtil.writeUTFString((String) value, buffer);
     }
 
     @Override
-    public Object deserialize(ByteBuffer buffer) {
+    public String deserialize(ByteBuffer buffer) {
         return BytesUtil.readUTFString(buffer);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/observer/ObserverTuple.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/observer/ObserverTuple.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/observer/ObserverTuple.java
index 288afa9..cdbe392 100644
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/observer/ObserverTuple.java
+++ b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/observer/ObserverTuple.java
@@ -20,8 +20,8 @@ package org.apache.kylin.storage.hbase.coprocessor.observer;
 
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.kylin.dict.Dictionary;
-import org.apache.kylin.metadata.filter.IEvaluatableTuple;
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
 import org.apache.kylin.storage.hbase.coprocessor.CoprocessorRowType;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/6ecd73ea/storage/src/test/java/org/apache/kylin/storage/filter/FilterBaseTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/FilterBaseTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/FilterBaseTest.java
index 97e0e33..fe9d336 100644
--- a/storage/src/test/java/org/apache/kylin/storage/filter/FilterBaseTest.java
+++ b/storage/src/test/java/org/apache/kylin/storage/filter/FilterBaseTest.java
@@ -27,6 +27,7 @@ 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.metadata.tuple.ICodeSystem;
 import org.apache.kylin.metadata.filter.TupleFilter.FilterOperatorEnum;
 import org.apache.kylin.storage.tuple.Tuple;
 import org.apache.kylin.storage.tuple.TupleInfo;