You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ma...@apache.org on 2015/10/22 08:07:57 UTC

[5/5] incubator-kylin git commit: upgrade EP to use hbaseColumnsToGT

upgrade EP to use hbaseColumnsToGT


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

Branch: refs/heads/KYLIN-942
Commit: cd81a8d1bc594e0c98f861c209d80f4952352bda
Parents: ab2dd7c
Author: honma <ho...@ebay.com>
Authored: Thu Oct 22 14:11:56 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Thu Oct 22 14:11:56 2015 +0800

----------------------------------------------------------------------
 .../hbase/cube/v2/CubeHBaseEndpointRPC.java     |   8 +
 .../coprocessor/endpoint/CubeVisitService.java  |   8 +-
 .../endpoint/generated/CubeVisitProtos.java     | 981 ++++++++++++++++++-
 .../endpoint/protobuf/CubeVisit.proto           |   4 +
 4 files changed, 952 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/cd81a8d1/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
index 7f683be..5a91537 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
@@ -47,6 +47,7 @@ import org.apache.kylin.gridtable.GTRecord;
 import org.apache.kylin.gridtable.GTScanRequest;
 import org.apache.kylin.gridtable.IGTScanner;
 import org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos;
+import org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList;
 import org.apache.kylin.storage.hbase.steps.HBaseConnection;
 
 import com.google.common.base.Function;
@@ -134,6 +135,10 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
 
         List<RawScan> rawScans = preparedHBaseScan(scanRequest.getPkStart(), scanRequest.getPkEnd(), scanRequest.getFuzzyKeys(), selectedColBlocks);
         List<List<Integer>> hbaseColumnsToGT = getHBaseColumnsGTMapping(selectedColBlocks);
+        final List<IntList> hbaseColumnsToGTIntList = Lists.newArrayList();
+        for (List<Integer> list : hbaseColumnsToGT) {
+            hbaseColumnsToGTIntList.add(IntList.newBuilder().addAllInts(list).build());
+        }
 
         byte[] scanRequestBytes = KryoUtils.serialize(scanRequest);
         final ByteString scanRequestBytesString = ByteString.copyFrom(scanRequestBytes);
@@ -153,6 +158,9 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
                     final byte[] rawScanBytes = KryoUtils.serialize(rawScan);
                     CubeVisitProtos.CubeVisitRequest.Builder builder = CubeVisitProtos.CubeVisitRequest.newBuilder();
                     builder.setGtScanRequest(scanRequestBytesString).setHbaseRawScan(ByteString.copyFrom(rawScanBytes));
+                    for (IntList intList : hbaseColumnsToGTIntList) {
+                        builder.addHbaseColumnsToGT(intList);
+                    }
 
                     Collection<CubeVisitProtos.CubeVisitResponse> results;
                     try {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/cd81a8d1/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
index c4927ab..356d6e0 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
@@ -46,6 +46,7 @@ import org.apache.kylin.storage.hbase.cube.v2.CubeHBaseRPC;
 import org.apache.kylin.storage.hbase.cube.v2.HBaseReadonlyStore;
 import org.apache.kylin.storage.hbase.cube.v2.RawScan;
 import org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos;
+import org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -127,6 +128,11 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
 
             GTScanRequest scanReq = KryoUtils.deserialize(request.getGtScanRequest().toByteArray(), GTScanRequest.class);
             RawScan hbaseRawScan = KryoUtils.deserialize(request.getHbaseRawScan().toByteArray(), RawScan.class);
+            List<List<Integer>> hbaseColumnsToGT = Lists.newArrayList();
+            for (IntList intList : request.getHbaseColumnsToGTList()) {
+                hbaseColumnsToGT.add(intList.getIntsList());
+            }
+
             //TODO: rewrite own start/end
             Scan scan = CubeHBaseRPC.buildScan(hbaseRawScan);
 
@@ -136,7 +142,7 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
             innerScanner = region.getScanner(scan);
             InnerScannerAsIterator cellListIterator = new InnerScannerAsIterator(innerScanner);
 
-            IGTStore store = new HBaseReadonlyStore(cellListIterator, scanReq, hbaseRawScan.hbaseColumns,null);
+            IGTStore store = new HBaseReadonlyStore(cellListIterator, scanReq, hbaseRawScan.hbaseColumns, null);
             IGTScanner rawScanner = store.scan(scanReq);
             IGTScanner finalScanner = scanReq.decorateScanner(rawScanner);
 

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/cd81a8d1/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
index 2e6741b..225703d 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/generated/CubeVisitProtos.java
@@ -30,6 +30,31 @@ public final class CubeVisitProtos {
      * <code>required bytes hbaseRawScan = 2;</code>
      */
     com.google.protobuf.ByteString getHbaseRawScan();
+
+    // repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> 
+        getHbaseColumnsToGTList();
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList getHbaseColumnsToGT(int index);
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    int getHbaseColumnsToGTCount();
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    java.util.List<? extends org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder> 
+        getHbaseColumnsToGTOrBuilderList();
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder getHbaseColumnsToGTOrBuilder(
+        int index);
   }
   /**
    * Protobuf type {@code CubeVisitRequest}
@@ -87,48 +112,563 @@ public final class CubeVisitProtos {
               gtScanRequest_ = input.readBytes();
               break;
             }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              hbaseRawScan_ = input.readBytes();
-              break;
+            case 18: {
+              bitField0_ |= 0x00000002;
+              hbaseRawScan_ = input.readBytes();
+              break;
+            }
+            case 26: {
+              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
+                hbaseColumnsToGT_ = new java.util.ArrayList<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList>();
+                mutable_bitField0_ |= 0x00000004;
+              }
+              hbaseColumnsToGT_.add(input.readMessage(org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.PARSER, extensionRegistry));
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
+          hbaseColumnsToGT_ = java.util.Collections.unmodifiableList(hbaseColumnsToGT_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.class, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<CubeVisitRequest> PARSER =
+        new com.google.protobuf.AbstractParser<CubeVisitRequest>() {
+      public CubeVisitRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new CubeVisitRequest(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CubeVisitRequest> getParserForType() {
+      return PARSER;
+    }
+
+    public interface IntListOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+
+      // repeated int32 ints = 1;
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      java.util.List<java.lang.Integer> getIntsList();
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      int getIntsCount();
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      int getInts(int index);
+    }
+    /**
+     * Protobuf type {@code CubeVisitRequest.IntList}
+     */
+    public static final class IntList extends
+        com.google.protobuf.GeneratedMessage
+        implements IntListOrBuilder {
+      // Use IntList.newBuilder() to construct.
+      private IntList(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+        super(builder);
+        this.unknownFields = builder.getUnknownFields();
+      }
+      private IntList(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+      private static final IntList defaultInstance;
+      public static IntList getDefaultInstance() {
+        return defaultInstance;
+      }
+
+      public IntList getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+
+      private final com.google.protobuf.UnknownFieldSet unknownFields;
+      @java.lang.Override
+      public final com.google.protobuf.UnknownFieldSet
+          getUnknownFields() {
+        return this.unknownFields;
+      }
+      private IntList(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        initFields();
+        int mutable_bitField0_ = 0;
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder();
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  done = true;
+                }
+                break;
+              }
+              case 8: {
+                if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+                  ints_ = new java.util.ArrayList<java.lang.Integer>();
+                  mutable_bitField0_ |= 0x00000001;
+                }
+                ints_.add(input.readInt32());
+                break;
+              }
+              case 10: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                if (!((mutable_bitField0_ & 0x00000001) == 0x00000001) && input.getBytesUntilLimit() > 0) {
+                  ints_ = new java.util.ArrayList<java.lang.Integer>();
+                  mutable_bitField0_ |= 0x00000001;
+                }
+                while (input.getBytesUntilLimit() > 0) {
+                  ints_.add(input.readInt32());
+                }
+                input.popLimit(limit);
+                break;
+              }
+            }
+          }
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(this);
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(
+              e.getMessage()).setUnfinishedMessage(this);
+        } finally {
+          if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
+            ints_ = java.util.Collections.unmodifiableList(ints_);
+          }
+          this.unknownFields = unknownFields.build();
+          makeExtensionsImmutable();
+        }
+      }
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_IntList_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_IntList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.class, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder.class);
+      }
+
+      public static com.google.protobuf.Parser<IntList> PARSER =
+          new com.google.protobuf.AbstractParser<IntList>() {
+        public IntList parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return new IntList(input, extensionRegistry);
+        }
+      };
+
+      @java.lang.Override
+      public com.google.protobuf.Parser<IntList> getParserForType() {
+        return PARSER;
+      }
+
+      // repeated int32 ints = 1;
+      public static final int INTS_FIELD_NUMBER = 1;
+      private java.util.List<java.lang.Integer> ints_;
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      public java.util.List<java.lang.Integer>
+          getIntsList() {
+        return ints_;
+      }
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      public int getIntsCount() {
+        return ints_.size();
+      }
+      /**
+       * <code>repeated int32 ints = 1;</code>
+       */
+      public int getInts(int index) {
+        return ints_.get(index);
+      }
+
+      private void initFields() {
+        ints_ = java.util.Collections.emptyList();
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+
+        memoizedIsInitialized = 1;
+        return true;
+      }
+
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        for (int i = 0; i < ints_.size(); i++) {
+          output.writeInt32(1, ints_.get(i));
+        }
+        getUnknownFields().writeTo(output);
+      }
+
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+
+        size = 0;
+        {
+          int dataSize = 0;
+          for (int i = 0; i < ints_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(ints_.get(i));
+          }
+          size += dataSize;
+          size += 1 * getIntsList().size();
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+
+      @java.lang.Override
+      public boolean equals(final java.lang.Object obj) {
+        if (obj == this) {
+         return true;
+        }
+        if (!(obj instanceof org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList)) {
+          return super.equals(obj);
+        }
+        org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList other = (org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList) obj;
+
+        boolean result = true;
+        result = result && getIntsList()
+            .equals(other.getIntsList());
+        result = result &&
+            getUnknownFields().equals(other.getUnknownFields());
+        return result;
+      }
+
+      private int memoizedHashCode = 0;
+      @java.lang.Override
+      public int hashCode() {
+        if (memoizedHashCode != 0) {
+          return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptorForType().hashCode();
+        if (getIntsCount() > 0) {
+          hash = (37 * hash) + INTS_FIELD_NUMBER;
+          hash = (53 * hash) + getIntsList().hashCode();
+        }
+        hash = (29 * hash) + getUnknownFields().hashCode();
+        memoizedHashCode = hash;
+        return hash;
+      }
+
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return PARSER.parseFrom(input);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return PARSER.parseFrom(input, extensionRegistry);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return PARSER.parseDelimitedFrom(input);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return PARSER.parseFrom(input);
+      }
+      public static org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return PARSER.parseFrom(input, extensionRegistry);
+      }
+
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      /**
+       * Protobuf type {@code CubeVisitRequest.IntList}
+       */
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_IntList_descriptor;
+        }
+
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_IntList_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.class, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder.class);
+        }
+
+        // Construct using org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+
+        public Builder clear() {
+          super.clear();
+          ints_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          return this;
+        }
+
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_IntList_descriptor;
+        }
+
+        public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList getDefaultInstanceForType() {
+          return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.getDefaultInstance();
+        }
+
+        public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList build() {
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+
+        public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList buildPartial() {
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList result = new org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList(this);
+          int from_bitField0_ = bitField0_;
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            ints_ = java.util.Collections.unmodifiableList(ints_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.ints_ = ints_;
+          onBuilt();
+          return result;
+        }
+
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList) {
+            return mergeFrom((org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+
+        public Builder mergeFrom(org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList other) {
+          if (other == org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.getDefaultInstance()) return this;
+          if (!other.ints_.isEmpty()) {
+            if (ints_.isEmpty()) {
+              ints_ = other.ints_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureIntsIsMutable();
+              ints_.addAll(other.ints_);
+            }
+            onChanged();
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+
+        public final boolean isInitialized() {
+          return true;
+        }
+
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList parsedMessage = null;
+          try {
+            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            parsedMessage = (org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList) e.getUnfinishedMessage();
+            throw e;
+          } finally {
+            if (parsedMessage != null) {
+              mergeFrom(parsedMessage);
             }
           }
+          return this;
         }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e.getMessage()).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_descriptor;
-    }
+        private int bitField0_;
 
-    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.internal_static_CubeVisitRequest_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.class, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.Builder.class);
-    }
+        // repeated int32 ints = 1;
+        private java.util.List<java.lang.Integer> ints_ = java.util.Collections.emptyList();
+        private void ensureIntsIsMutable() {
+          if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+            ints_ = new java.util.ArrayList<java.lang.Integer>(ints_);
+            bitField0_ |= 0x00000001;
+           }
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public java.util.List<java.lang.Integer>
+            getIntsList() {
+          return java.util.Collections.unmodifiableList(ints_);
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public int getIntsCount() {
+          return ints_.size();
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public int getInts(int index) {
+          return ints_.get(index);
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public Builder setInts(
+            int index, int value) {
+          ensureIntsIsMutable();
+          ints_.set(index, value);
+          onChanged();
+          return this;
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public Builder addInts(int value) {
+          ensureIntsIsMutable();
+          ints_.add(value);
+          onChanged();
+          return this;
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public Builder addAllInts(
+            java.lang.Iterable<? extends java.lang.Integer> values) {
+          ensureIntsIsMutable();
+          super.addAll(values, ints_);
+          onChanged();
+          return this;
+        }
+        /**
+         * <code>repeated int32 ints = 1;</code>
+         */
+        public Builder clearInts() {
+          ints_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+          return this;
+        }
 
-    public static com.google.protobuf.Parser<CubeVisitRequest> PARSER =
-        new com.google.protobuf.AbstractParser<CubeVisitRequest>() {
-      public CubeVisitRequest parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new CubeVisitRequest(input, extensionRegistry);
+        // @@protoc_insertion_point(builder_scope:CubeVisitRequest.IntList)
       }
-    };
 
-    @java.lang.Override
-    public com.google.protobuf.Parser<CubeVisitRequest> getParserForType() {
-      return PARSER;
+      static {
+        defaultInstance = new IntList(true);
+        defaultInstance.initFields();
+      }
+
+      // @@protoc_insertion_point(class_scope:CubeVisitRequest.IntList)
     }
 
     private int bitField0_;
@@ -164,9 +704,46 @@ public final class CubeVisitProtos {
       return hbaseRawScan_;
     }
 
+    // repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;
+    public static final int HBASECOLUMNSTOGT_FIELD_NUMBER = 3;
+    private java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> hbaseColumnsToGT_;
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    public java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> getHbaseColumnsToGTList() {
+      return hbaseColumnsToGT_;
+    }
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    public java.util.List<? extends org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder> 
+        getHbaseColumnsToGTOrBuilderList() {
+      return hbaseColumnsToGT_;
+    }
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    public int getHbaseColumnsToGTCount() {
+      return hbaseColumnsToGT_.size();
+    }
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList getHbaseColumnsToGT(int index) {
+      return hbaseColumnsToGT_.get(index);
+    }
+    /**
+     * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+     */
+    public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder getHbaseColumnsToGTOrBuilder(
+        int index) {
+      return hbaseColumnsToGT_.get(index);
+    }
+
     private void initFields() {
       gtScanRequest_ = com.google.protobuf.ByteString.EMPTY;
       hbaseRawScan_ = com.google.protobuf.ByteString.EMPTY;
+      hbaseColumnsToGT_ = java.util.Collections.emptyList();
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -194,6 +771,9 @@ public final class CubeVisitProtos {
       if (((bitField0_ & 0x00000002) == 0x00000002)) {
         output.writeBytes(2, hbaseRawScan_);
       }
+      for (int i = 0; i < hbaseColumnsToGT_.size(); i++) {
+        output.writeMessage(3, hbaseColumnsToGT_.get(i));
+      }
       getUnknownFields().writeTo(output);
     }
 
@@ -211,6 +791,10 @@ public final class CubeVisitProtos {
         size += com.google.protobuf.CodedOutputStream
           .computeBytesSize(2, hbaseRawScan_);
       }
+      for (int i = 0; i < hbaseColumnsToGT_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, hbaseColumnsToGT_.get(i));
+      }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
       return size;
@@ -244,6 +828,8 @@ public final class CubeVisitProtos {
         result = result && getHbaseRawScan()
             .equals(other.getHbaseRawScan());
       }
+      result = result && getHbaseColumnsToGTList()
+          .equals(other.getHbaseColumnsToGTList());
       result = result &&
           getUnknownFields().equals(other.getUnknownFields());
       return result;
@@ -265,6 +851,10 @@ public final class CubeVisitProtos {
         hash = (37 * hash) + HBASERAWSCAN_FIELD_NUMBER;
         hash = (53 * hash) + getHbaseRawScan().hashCode();
       }
+      if (getHbaseColumnsToGTCount() > 0) {
+        hash = (37 * hash) + HBASECOLUMNSTOGT_FIELD_NUMBER;
+        hash = (53 * hash) + getHbaseColumnsToGTList().hashCode();
+      }
       hash = (29 * hash) + getUnknownFields().hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -366,6 +956,7 @@ public final class CubeVisitProtos {
       }
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getHbaseColumnsToGTFieldBuilder();
         }
       }
       private static Builder create() {
@@ -378,6 +969,12 @@ public final class CubeVisitProtos {
         bitField0_ = (bitField0_ & ~0x00000001);
         hbaseRawScan_ = com.google.protobuf.ByteString.EMPTY;
         bitField0_ = (bitField0_ & ~0x00000002);
+        if (hbaseColumnsToGTBuilder_ == null) {
+          hbaseColumnsToGT_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          hbaseColumnsToGTBuilder_.clear();
+        }
         return this;
       }
 
@@ -414,6 +1011,15 @@ public final class CubeVisitProtos {
           to_bitField0_ |= 0x00000002;
         }
         result.hbaseRawScan_ = hbaseRawScan_;
+        if (hbaseColumnsToGTBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004)) {
+            hbaseColumnsToGT_ = java.util.Collections.unmodifiableList(hbaseColumnsToGT_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.hbaseColumnsToGT_ = hbaseColumnsToGT_;
+        } else {
+          result.hbaseColumnsToGT_ = hbaseColumnsToGTBuilder_.build();
+        }
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -436,6 +1042,32 @@ public final class CubeVisitProtos {
         if (other.hasHbaseRawScan()) {
           setHbaseRawScan(other.getHbaseRawScan());
         }
+        if (hbaseColumnsToGTBuilder_ == null) {
+          if (!other.hbaseColumnsToGT_.isEmpty()) {
+            if (hbaseColumnsToGT_.isEmpty()) {
+              hbaseColumnsToGT_ = other.hbaseColumnsToGT_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureHbaseColumnsToGTIsMutable();
+              hbaseColumnsToGT_.addAll(other.hbaseColumnsToGT_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.hbaseColumnsToGT_.isEmpty()) {
+            if (hbaseColumnsToGTBuilder_.isEmpty()) {
+              hbaseColumnsToGTBuilder_.dispose();
+              hbaseColumnsToGTBuilder_ = null;
+              hbaseColumnsToGT_ = other.hbaseColumnsToGT_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              hbaseColumnsToGTBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getHbaseColumnsToGTFieldBuilder() : null;
+            } else {
+              hbaseColumnsToGTBuilder_.addAllMessages(other.hbaseColumnsToGT_);
+            }
+          }
+        }
         this.mergeUnknownFields(other.getUnknownFields());
         return this;
       }
@@ -543,6 +1175,246 @@ public final class CubeVisitProtos {
         return this;
       }
 
+      // repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;
+      private java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> hbaseColumnsToGT_ =
+        java.util.Collections.emptyList();
+      private void ensureHbaseColumnsToGTIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          hbaseColumnsToGT_ = new java.util.ArrayList<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList>(hbaseColumnsToGT_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder> hbaseColumnsToGTBuilder_;
+
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> getHbaseColumnsToGTList() {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(hbaseColumnsToGT_);
+        } else {
+          return hbaseColumnsToGTBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public int getHbaseColumnsToGTCount() {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          return hbaseColumnsToGT_.size();
+        } else {
+          return hbaseColumnsToGTBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList getHbaseColumnsToGT(int index) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          return hbaseColumnsToGT_.get(index);
+        } else {
+          return hbaseColumnsToGTBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder setHbaseColumnsToGT(
+          int index, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList value) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.set(index, value);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder setHbaseColumnsToGT(
+          int index, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder builderForValue) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder addHbaseColumnsToGT(org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList value) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.add(value);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder addHbaseColumnsToGT(
+          int index, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList value) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.add(index, value);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder addHbaseColumnsToGT(
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder builderForValue) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.add(builderForValue.build());
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder addHbaseColumnsToGT(
+          int index, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder builderForValue) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder addAllHbaseColumnsToGT(
+          java.lang.Iterable<? extends org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList> values) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          ensureHbaseColumnsToGTIsMutable();
+          super.addAll(values, hbaseColumnsToGT_);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder clearHbaseColumnsToGT() {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          hbaseColumnsToGT_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public Builder removeHbaseColumnsToGT(int index) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          ensureHbaseColumnsToGTIsMutable();
+          hbaseColumnsToGT_.remove(index);
+          onChanged();
+        } else {
+          hbaseColumnsToGTBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder getHbaseColumnsToGTBuilder(
+          int index) {
+        return getHbaseColumnsToGTFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder getHbaseColumnsToGTOrBuilder(
+          int index) {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          return hbaseColumnsToGT_.get(index);  } else {
+          return hbaseColumnsToGTBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public java.util.List<? extends org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder> 
+           getHbaseColumnsToGTOrBuilderList() {
+        if (hbaseColumnsToGTBuilder_ != null) {
+          return hbaseColumnsToGTBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(hbaseColumnsToGT_);
+        }
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder addHbaseColumnsToGTBuilder() {
+        return getHbaseColumnsToGTFieldBuilder().addBuilder(
+            org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder addHbaseColumnsToGTBuilder(
+          int index) {
+        return getHbaseColumnsToGTFieldBuilder().addBuilder(
+            index, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .CubeVisitRequest.IntList hbaseColumnsToGT = 3;</code>
+       */
+      public java.util.List<org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder> 
+           getHbaseColumnsToGTBuilderList() {
+        return getHbaseColumnsToGTFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder> 
+          getHbaseColumnsToGTFieldBuilder() {
+        if (hbaseColumnsToGTBuilder_ == null) {
+          hbaseColumnsToGTBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntList.Builder, org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos.CubeVisitRequest.IntListOrBuilder>(
+                  hbaseColumnsToGT_,
+                  ((bitField0_ & 0x00000004) == 0x00000004),
+                  getParentForChildren(),
+                  isClean());
+          hbaseColumnsToGT_ = null;
+        }
+        return hbaseColumnsToGTBuilder_;
+      }
+
       // @@protoc_insertion_point(builder_scope:CubeVisitRequest)
     }
 
@@ -2158,6 +3030,11 @@ public final class CubeVisitProtos {
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_CubeVisitRequest_fieldAccessorTable;
   private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_CubeVisitRequest_IntList_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_CubeVisitRequest_IntList_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
     internal_static_CubeVisitResponse_descriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
@@ -2178,18 +3055,20 @@ public final class CubeVisitProtos {
     java.lang.String[] descriptorData = {
       "\npstorage-hbase/src/main/java/org/apache" +
       "/kylin/storage/hbase/cube/v2/coprocessor" +
-      "/endpoint/protobuf/CubeVisit.proto\"?\n\020Cu" +
-      "beVisitRequest\022\025\n\rgtScanRequest\030\001 \002(\014\022\024\n" +
-      "\014hbaseRawScan\030\002 \002(\014\"\304\001\n\021CubeVisitRespons" +
-      "e\022\026\n\016compressedRows\030\001 \002(\014\022\'\n\005stats\030\002 \002(\013" +
-      "2\030.CubeVisitResponse.Stats\032n\n\005Stats\022\030\n\020s" +
-      "erviceStartTime\030\001 \001(\003\022\026\n\016serviceEndTime\030" +
-      "\002 \001(\003\022\027\n\017scannedRowCount\030\003 \001(\005\022\032\n\022aggreg" +
-      "atedRowCount\030\004 \001(\0052F\n\020CubeVisitService\0222",
-      "\n\tvisitCube\022\021.CubeVisitRequest\032\022.CubeVis" +
-      "itResponseB`\nEorg.apache.kylin.storage.h" +
-      "base.cube.v2.coprocessor.endpoint.genera" +
-      "tedB\017CubeVisitProtosH\001\210\001\001\240\001\001"
+      "/endpoint/protobuf/CubeVisit.proto\"\215\001\n\020C" +
+      "ubeVisitRequest\022\025\n\rgtScanRequest\030\001 \002(\014\022\024" +
+      "\n\014hbaseRawScan\030\002 \002(\014\0223\n\020hbaseColumnsToGT" +
+      "\030\003 \003(\0132\031.CubeVisitRequest.IntList\032\027\n\007Int" +
+      "List\022\014\n\004ints\030\001 \003(\005\"\304\001\n\021CubeVisitResponse" +
+      "\022\026\n\016compressedRows\030\001 \002(\014\022\'\n\005stats\030\002 \002(\0132" +
+      "\030.CubeVisitResponse.Stats\032n\n\005Stats\022\030\n\020se" +
+      "rviceStartTime\030\001 \001(\003\022\026\n\016serviceEndTime\030\002",
+      " \001(\003\022\027\n\017scannedRowCount\030\003 \001(\005\022\032\n\022aggrega" +
+      "tedRowCount\030\004 \001(\0052F\n\020CubeVisitService\0222\n" +
+      "\tvisitCube\022\021.CubeVisitRequest\032\022.CubeVisi" +
+      "tResponseB`\nEorg.apache.kylin.storage.hb" +
+      "ase.cube.v2.coprocessor.endpoint.generat" +
+      "edB\017CubeVisitProtosH\001\210\001\001\240\001\001"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
       new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -2201,7 +3080,13 @@ public final class CubeVisitProtos {
           internal_static_CubeVisitRequest_fieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
               internal_static_CubeVisitRequest_descriptor,
-              new java.lang.String[] { "GtScanRequest", "HbaseRawScan", });
+              new java.lang.String[] { "GtScanRequest", "HbaseRawScan", "HbaseColumnsToGT", });
+          internal_static_CubeVisitRequest_IntList_descriptor =
+            internal_static_CubeVisitRequest_descriptor.getNestedTypes().get(0);
+          internal_static_CubeVisitRequest_IntList_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_CubeVisitRequest_IntList_descriptor,
+              new java.lang.String[] { "Ints", });
           internal_static_CubeVisitResponse_descriptor =
             getDescriptor().getMessageTypes().get(1);
           internal_static_CubeVisitResponse_fieldAccessorTable = new

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/cd81a8d1/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
index e6c20a4..a4cd39d 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
@@ -14,6 +14,10 @@ option optimize_for = SPEED;
 message CubeVisitRequest {
     required bytes gtScanRequest = 1;
     required bytes hbaseRawScan = 2;
+    repeated IntList hbaseColumnsToGT = 3;
+    message IntList {
+        repeated int32 ints = 1;
+    }
 }
 
 message CubeVisitResponse {