Browse Source

feature refactor

丁云鹏 1 year ago
parent
commit
4bee404868
14 changed files with 3500 additions and 15 deletions
  1. 93 14
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java
  2. 142 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java
  3. 148 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java
  4. 557 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapRequest.java
  5. 21 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapRequestOrBuilder.java
  6. 893 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapResponse.java
  7. 58 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapResponseOrBuilder.java
  8. 557 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapRequest.java
  9. 21 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapRequestOrBuilder.java
  10. 893 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapResponse.java
  11. 58 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapResponseOrBuilder.java
  12. 21 1
      recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto
  13. 20 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/grpcservice/FeatureGrpcService.java
  14. 18 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserFeatureService.java

+ 93 - 14
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java

@@ -104,6 +104,36 @@ public final class Feature {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureMapRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureMapRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureMapResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureMapResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureMapResponse_DataEntry_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureMapResponse_DataEntry_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureMapRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureMapRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureMapResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureMapResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureMapResponse_DataEntry_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureMapResponse_DataEntry_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -189,20 +219,33 @@ public final class Feature {
       "est\022\r\n\005ad_id\030\001 \003(\t\"d\n\033GetAllAdItemFeatur" +
       "eResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n\017ad" +
       "_item_feature\030\002 \003(\0132\023.AdItemFeatureProto" +
-      "2\314\003\n\016FeatureService\022G\n\020GetUserAdFeature\022" +
-      "\030.GetUserAdFeatureRequest\032\031.GetUserAdFea" +
-      "tureResponse\022G\n\020GetAdItemFeature\022\030.GetAd" +
-      "ItemFeatureRequest\032\031.GetAdItemFeatureRes" +
-      "ponse\022P\n\023GetAllAdItemFeature\022\033.GetAllAdI" +
-      "temFeatureRequest\032\034.GetAllAdItemFeatureR" +
-      "esponse\022A\n\016GetUserFeature\022\026.GetUserFeatu" +
-      "reRequest\032\027.GetUserFeatureResponse\022D\n\017Ge" +
-      "tVideoFeature\022\027.GetVideoFeatureRequest\032\030" +
-      ".GetVideoFeatureResponse\022M\n\022GetAllVideoF" +
-      "eature\022\032.GetAllVideoFeatureRequest\032\033.Get" +
-      "AllVideoFeatureResponseB8\n1com.tzld.piao" +
-      "quan.recommend.feature.model.featureP\001\210\001" +
-      "\001b\006proto3"
+      "\"\'\n\030GetUserFeatureMapRequest\022\013\n\003mid\030\001 \001(" +
+      "\t\"\225\001\n\031GetUserFeatureMapResponse\022\027\n\006resul" +
+      "t\030\001 \001(\0132\007.Result\0222\n\004data\030\002 \003(\0132$.GetUser" +
+      "FeatureMapResponse.DataEntry\032+\n\tDataEntr" +
+      "y\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"-\n\031Get" +
+      "VideoFeatureMapRequest\022\020\n\010video_id\030\001 \001(\t" +
+      "\"\227\001\n\032GetVideoFeatureMapResponse\022\027\n\006resul" +
+      "t\030\001 \001(\0132\007.Result\0223\n\004data\030\002 \003(\0132%.GetVide" +
+      "oFeatureMapResponse.DataEntry\032+\n\tDataEnt" +
+      "ry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\0012\347\004\n\016F" +
+      "eatureService\022G\n\020GetUserAdFeature\022\030.GetU" +
+      "serAdFeatureRequest\032\031.GetUserAdFeatureRe" +
+      "sponse\022G\n\020GetAdItemFeature\022\030.GetAdItemFe" +
+      "atureRequest\032\031.GetAdItemFeatureResponse\022" +
+      "P\n\023GetAllAdItemFeature\022\033.GetAllAdItemFea" +
+      "tureRequest\032\034.GetAllAdItemFeatureRespons" +
+      "e\022A\n\016GetUserFeature\022\026.GetUserFeatureRequ" +
+      "est\032\027.GetUserFeatureResponse\022D\n\017GetVideo" +
+      "Feature\022\027.GetVideoFeatureRequest\032\030.GetVi" +
+      "deoFeatureResponse\022M\n\022GetAllVideoFeature" +
+      "\022\032.GetAllVideoFeatureRequest\032\033.GetAllVid" +
+      "eoFeatureResponse\022J\n\021GetUserFeatureMap\022\031" +
+      ".GetUserFeatureMapRequest\032\032.GetUserFeatu" +
+      "reMapResponse\022M\n\022GetVideoFeatureMap\022\032.Ge" +
+      "tVideoFeatureMapRequest\032\033.GetVideoFeatur" +
+      "eMapResponseB8\n1com.tzld.piaoquan.recomm" +
+      "end.feature.model.featureP\001\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -318,6 +361,42 @@ public final class Feature {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetAllAdItemFeatureResponse_descriptor,
         new java.lang.String[] { "Result", "AdItemFeature", });
+    internal_static_GetUserFeatureMapRequest_descriptor =
+      getDescriptor().getMessageTypes().get(18);
+    internal_static_GetUserFeatureMapRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureMapRequest_descriptor,
+        new java.lang.String[] { "Mid", });
+    internal_static_GetUserFeatureMapResponse_descriptor =
+      getDescriptor().getMessageTypes().get(19);
+    internal_static_GetUserFeatureMapResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureMapResponse_descriptor,
+        new java.lang.String[] { "Result", "Data", });
+    internal_static_GetUserFeatureMapResponse_DataEntry_descriptor =
+      internal_static_GetUserFeatureMapResponse_descriptor.getNestedTypes().get(0);
+    internal_static_GetUserFeatureMapResponse_DataEntry_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureMapResponse_DataEntry_descriptor,
+        new java.lang.String[] { "Key", "Value", });
+    internal_static_GetVideoFeatureMapRequest_descriptor =
+      getDescriptor().getMessageTypes().get(20);
+    internal_static_GetVideoFeatureMapRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureMapRequest_descriptor,
+        new java.lang.String[] { "VideoId", });
+    internal_static_GetVideoFeatureMapResponse_descriptor =
+      getDescriptor().getMessageTypes().get(21);
+    internal_static_GetVideoFeatureMapResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureMapResponse_descriptor,
+        new java.lang.String[] { "Result", "Data", });
+    internal_static_GetVideoFeatureMapResponse_DataEntry_descriptor =
+      internal_static_GetVideoFeatureMapResponse_descriptor.getNestedTypes().get(0);
+    internal_static_GetVideoFeatureMapResponse_DataEntry_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureMapResponse_DataEntry_descriptor,
+        new java.lang.String[] { "Key", "Value", });
     com.google.protobuf.AnyProto.getDescriptor();
     com.tzld.piaoquan.recommend.feature.model.common.Common.getDescriptor();
   }

+ 142 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java

@@ -59,6 +59,22 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
         com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
 
+    /**
+     * <code>rpc GetUserFeatureMap(.GetUserFeatureMapRequest) returns (.GetUserFeatureMapResponse);</code>
+     */
+    public abstract void getUserFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> done);
+
+    /**
+     * <code>rpc GetVideoFeatureMap(.GetVideoFeatureMapRequest) returns (.GetVideoFeatureMapResponse);</code>
+     */
+    public abstract void getVideoFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> done);
+
   }
 
   public static com.google.protobuf.Service newReflectiveService(
@@ -112,6 +128,22 @@ public  abstract class FeatureService
         impl.getAllVideoFeature(controller, request, done);
       }
 
+      @java.lang.Override
+      public  void getUserFeatureMap(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> done) {
+        impl.getUserFeatureMap(controller, request, done);
+      }
+
+      @java.lang.Override
+      public  void getVideoFeatureMap(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> done) {
+        impl.getVideoFeatureMap(controller, request, done);
+      }
+
     };
   }
 
@@ -146,6 +178,10 @@ public  abstract class FeatureService
             return impl.getVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest)request);
           case 5:
             return impl.getAllVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)request);
+          case 6:
+            return impl.getUserFeatureMap(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest)request);
+          case 7:
+            return impl.getVideoFeatureMap(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest)request);
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -172,6 +208,10 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
           case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
+          case 6:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.getDefaultInstance();
+          case 7:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -198,6 +238,10 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
           case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
+          case 6:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance();
+          case 7:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -254,6 +298,22 @@ public  abstract class FeatureService
       com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
       com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
 
+  /**
+   * <code>rpc GetUserFeatureMap(.GetUserFeatureMapRequest) returns (.GetUserFeatureMapResponse);</code>
+   */
+  public abstract void getUserFeatureMap(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> done);
+
+  /**
+   * <code>rpc GetVideoFeatureMap(.GetVideoFeatureMapRequest) returns (.GetVideoFeatureMapResponse);</code>
+   */
+  public abstract void getVideoFeatureMap(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> done);
+
   public static final
       com.google.protobuf.Descriptors.ServiceDescriptor
       getDescriptor() {
@@ -306,6 +366,16 @@ public  abstract class FeatureService
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>specializeCallback(
             done));
         return;
+      case 6:
+        this.getUserFeatureMap(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse>specializeCallback(
+            done));
+        return;
+      case 7:
+        this.getVideoFeatureMap(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse>specializeCallback(
+            done));
+        return;
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -332,6 +402,10 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
       case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
+      case 6:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.getDefaultInstance();
+      case 7:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -358,6 +432,10 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
       case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
+      case 6:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance();
+      case 7:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -468,6 +546,36 @@ public  abstract class FeatureService
           com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class,
           com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance()));
     }
+
+    public  void getUserFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(6),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance()));
+    }
+
+    public  void getVideoFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(7),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance()));
+    }
   }
 
   public static BlockingInterface newBlockingStub(
@@ -505,6 +613,16 @@ public  abstract class FeatureService
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request)
         throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getUserFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request)
+        throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getVideoFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request)
+        throws com.google.protobuf.ServiceException;
   }
 
   private static final class BlockingStub implements BlockingInterface {
@@ -585,6 +703,30 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance());
     }
 
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getUserFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(6),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance());
+    }
+
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getVideoFeatureMap(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(7),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance());
+    }
+
   }
 
   // @@protoc_insertion_point(class_scope:FeatureService)

+ 148 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java

@@ -213,6 +213,68 @@ public final class FeatureServiceGrpc {
     return getGetAllVideoFeatureMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> getGetUserFeatureMapMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetUserFeatureMap",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> getGetUserFeatureMapMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> getGetUserFeatureMapMethod;
+    if ((getGetUserFeatureMapMethod = FeatureServiceGrpc.getGetUserFeatureMapMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetUserFeatureMapMethod = FeatureServiceGrpc.getGetUserFeatureMapMethod) == null) {
+          FeatureServiceGrpc.getGetUserFeatureMapMethod = getGetUserFeatureMapMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetUserFeatureMap"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetUserFeatureMap"))
+              .build();
+        }
+      }
+    }
+    return getGetUserFeatureMapMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> getGetVideoFeatureMapMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetVideoFeatureMap",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> getGetVideoFeatureMapMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> getGetVideoFeatureMapMethod;
+    if ((getGetVideoFeatureMapMethod = FeatureServiceGrpc.getGetVideoFeatureMapMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetVideoFeatureMapMethod = FeatureServiceGrpc.getGetVideoFeatureMapMethod) == null) {
+          FeatureServiceGrpc.getGetVideoFeatureMapMethod = getGetVideoFeatureMapMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetVideoFeatureMap"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetVideoFeatureMap"))
+              .build();
+        }
+      }
+    }
+    return getGetVideoFeatureMapMethod;
+  }
+
   /**
    * Creates a new async stub that supports all call types for the service
    */
@@ -303,6 +365,20 @@ public final class FeatureServiceGrpc {
       asyncUnimplementedUnaryCall(getGetAllVideoFeatureMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void getUserFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetUserFeatureMapMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getVideoFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetVideoFeatureMapMethod(), responseObserver);
+    }
+
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
@@ -347,6 +423,20 @@ public final class FeatureServiceGrpc {
                 com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest,
                 com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>(
                   this, METHODID_GET_ALL_VIDEO_FEATURE)))
+          .addMethod(
+            getGetUserFeatureMapMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse>(
+                  this, METHODID_GET_USER_FEATURE_MAP)))
+          .addMethod(
+            getGetVideoFeatureMapMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse>(
+                  this, METHODID_GET_VIDEO_FEATURE_MAP)))
           .build();
     }
   }
@@ -412,6 +502,22 @@ public final class FeatureServiceGrpc {
       asyncUnaryCall(
           getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request, responseObserver);
     }
+
+    /**
+     */
+    public void getUserFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetUserFeatureMapMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getVideoFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetVideoFeatureMapMethod(), getCallOptions()), request, responseObserver);
+    }
   }
 
   /**
@@ -469,6 +575,20 @@ public final class FeatureServiceGrpc {
       return blockingUnaryCall(
           getChannel(), getGetAllVideoFeatureMethod(), getCallOptions(), request);
     }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getUserFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetUserFeatureMapMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getVideoFeatureMap(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetVideoFeatureMapMethod(), getCallOptions(), request);
+    }
   }
 
   /**
@@ -532,6 +652,22 @@ public final class FeatureServiceGrpc {
       return futureUnaryCall(
           getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request);
     }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse> getUserFeatureMap(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetUserFeatureMapMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse> getVideoFeatureMap(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetVideoFeatureMapMethod(), getCallOptions()), request);
+    }
   }
 
   private static final int METHODID_GET_USER_AD_FEATURE = 0;
@@ -540,6 +676,8 @@ public final class FeatureServiceGrpc {
   private static final int METHODID_GET_USER_FEATURE = 3;
   private static final int METHODID_GET_VIDEO_FEATURE = 4;
   private static final int METHODID_GET_ALL_VIDEO_FEATURE = 5;
+  private static final int METHODID_GET_USER_FEATURE_MAP = 6;
+  private static final int METHODID_GET_VIDEO_FEATURE_MAP = 7;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -582,6 +720,14 @@ public final class FeatureServiceGrpc {
           serviceImpl.getAllVideoFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) request,
               (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>) responseObserver);
           break;
+        case METHODID_GET_USER_FEATURE_MAP:
+          serviceImpl.getUserFeatureMap((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse>) responseObserver);
+          break;
+        case METHODID_GET_VIDEO_FEATURE_MAP:
+          serviceImpl.getVideoFeatureMap((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse>) responseObserver);
+          break;
         default:
           throw new AssertionError();
       }
@@ -649,6 +795,8 @@ public final class FeatureServiceGrpc {
               .addMethod(getGetUserFeatureMethod())
               .addMethod(getGetVideoFeatureMethod())
               .addMethod(getGetAllVideoFeatureMethod())
+              .addMethod(getGetUserFeatureMapMethod())
+              .addMethod(getGetVideoFeatureMapMethod())
               .build();
         }
       }

+ 557 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapRequest.java

@@ -0,0 +1,557 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetUserFeatureMapRequest}
+ */
+public final class GetUserFeatureMapRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserFeatureMapRequest)
+    GetUserFeatureMapRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserFeatureMapRequest.newBuilder() to construct.
+  private GetUserFeatureMapRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserFeatureMapRequest() {
+    mid_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserFeatureMapRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserFeatureMapRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    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;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            mid_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.Builder.class);
+  }
+
+  public static final int MID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object mid_;
+  /**
+   * <code>string mid = 1;</code>
+   * @return The mid.
+   */
+  @java.lang.Override
+  public java.lang.String getMid() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      mid_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string mid = 1;</code>
+   * @return The bytes for mid.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMidBytes() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      mid_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getMidBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mid_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getMidBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, mid_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest) obj;
+
+    if (!getMid()
+        .equals(other.getMid())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + MID_FIELD_NUMBER;
+    hash = (53 * hash) + getMid().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetUserFeatureMapRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserFeatureMapRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      mid_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest(this);
+      result.mid_ = mid_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest.getDefaultInstance()) return this;
+      if (!other.getMid().isEmpty()) {
+        mid_ = other.mid_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object mid_ = "";
+    /**
+     * <code>string mid = 1;</code>
+     * @return The mid.
+     */
+    public java.lang.String getMid() {
+      java.lang.Object ref = mid_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        mid_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string mid = 1;</code>
+     * @return The bytes for mid.
+     */
+    public com.google.protobuf.ByteString
+        getMidBytes() {
+      java.lang.Object ref = mid_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        mid_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string mid = 1;</code>
+     * @param value The mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMid(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMid() {
+      
+      mid_ = getDefaultInstance().getMid();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 1;</code>
+     * @param value The bytes for mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMidBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetUserFeatureMapRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserFeatureMapRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserFeatureMapRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserFeatureMapRequest>() {
+    @java.lang.Override
+    public GetUserFeatureMapRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserFeatureMapRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserFeatureMapRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserFeatureMapRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 21 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapRequestOrBuilder.java

@@ -0,0 +1,21 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetUserFeatureMapRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserFeatureMapRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string mid = 1;</code>
+   * @return The mid.
+   */
+  java.lang.String getMid();
+  /**
+   * <code>string mid = 1;</code>
+   * @return The bytes for mid.
+   */
+  com.google.protobuf.ByteString
+      getMidBytes();
+}

+ 893 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapResponse.java

@@ -0,0 +1,893 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetUserFeatureMapResponse}
+ */
+public final class GetUserFeatureMapResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserFeatureMapResponse)
+    GetUserFeatureMapResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserFeatureMapResponse.newBuilder() to construct.
+  private GetUserFeatureMapResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserFeatureMapResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserFeatureMapResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserFeatureMapResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    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;
+          case 10: {
+            com.tzld.piaoquan.recommend.feature.model.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              data_ = com.google.protobuf.MapField.newMapField(
+                  DataDefaultEntryHolder.defaultEntry);
+              mutable_bitField0_ |= 0x00000001;
+            }
+            com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+            data__ = input.readMessage(
+                DataDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+            data_.getMutableMap().put(
+                data__.getKey(), data__.getValue());
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_descriptor;
+  }
+
+  @SuppressWarnings({"rawtypes"})
+  @java.lang.Override
+  protected com.google.protobuf.MapField internalGetMapField(
+      int number) {
+    switch (number) {
+      case 2:
+        return internalGetData();
+      default:
+        throw new RuntimeException(
+            "Invalid map field number: " + number);
+    }
+  }
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int DATA_FIELD_NUMBER = 2;
+  private static final class DataDefaultEntryHolder {
+    static final com.google.protobuf.MapEntry<
+        java.lang.String, java.lang.String> defaultEntry =
+            com.google.protobuf.MapEntry
+            .<java.lang.String, java.lang.String>newDefaultInstance(
+                com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_DataEntry_descriptor, 
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "",
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "");
+  }
+  private com.google.protobuf.MapField<
+      java.lang.String, java.lang.String> data_;
+  private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+  internalGetData() {
+    if (data_ == null) {
+      return com.google.protobuf.MapField.emptyMapField(
+          DataDefaultEntryHolder.defaultEntry);
+    }
+    return data_;
+  }
+
+  public int getDataCount() {
+    return internalGetData().getMap().size();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  @java.lang.Override
+  public boolean containsData(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    return internalGetData().getMap().containsKey(key);
+  }
+  /**
+   * Use {@link #getDataMap()} instead.
+   */
+  @java.lang.Override
+  @java.lang.Deprecated
+  public java.util.Map<java.lang.String, java.lang.String> getData() {
+    return getDataMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
+    return internalGetData().getMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getDataOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetData().getMap();
+    return map.containsKey(key) ? map.get(key) : defaultValue;
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getDataOrThrow(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetData().getMap();
+    if (!map.containsKey(key)) {
+      throw new java.lang.IllegalArgumentException();
+    }
+    return map.get(key);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    com.google.protobuf.GeneratedMessageV3
+      .serializeStringMapTo(
+        output,
+        internalGetData(),
+        DataDefaultEntryHolder.defaultEntry,
+        2);
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
+         : internalGetData().getMap().entrySet()) {
+      com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+      data__ = DataDefaultEntryHolder.defaultEntry.newBuilderForType()
+          .setKey(entry.getKey())
+          .setValue(entry.getValue())
+          .build();
+      size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, data__);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!internalGetData().equals(
+        other.internalGetData())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (!internalGetData().getMap().isEmpty()) {
+      hash = (37 * hash) + DATA_FIELD_NUMBER;
+      hash = (53 * hash) + internalGetData().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetUserFeatureMapResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserFeatureMapResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetData();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMutableMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetMutableData();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      internalGetMutableData().clear();
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureMapResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      result.data_ = internalGetData();
+      result.data_.makeImmutable();
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      internalGetMutableData().mergeFrom(
+          other.internalGetData());
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.feature.model.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.feature.model.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private com.google.protobuf.MapField<
+        java.lang.String, java.lang.String> data_;
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetData() {
+      if (data_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            DataDefaultEntryHolder.defaultEntry);
+      }
+      return data_;
+    }
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetMutableData() {
+      onChanged();;
+      if (data_ == null) {
+        data_ = com.google.protobuf.MapField.newMapField(
+            DataDefaultEntryHolder.defaultEntry);
+      }
+      if (!data_.isMutable()) {
+        data_ = data_.copy();
+      }
+      return data_;
+    }
+
+    public int getDataCount() {
+      return internalGetData().getMap().size();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    @java.lang.Override
+    public boolean containsData(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      return internalGetData().getMap().containsKey(key);
+    }
+    /**
+     * Use {@link #getDataMap()} instead.
+     */
+    @java.lang.Override
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String> getData() {
+      return getDataMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
+      return internalGetData().getMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getDataOrDefault(
+        java.lang.String key,
+        java.lang.String defaultValue) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetData().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getDataOrThrow(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetData().getMap();
+      if (!map.containsKey(key)) {
+        throw new java.lang.IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public Builder clearData() {
+      internalGetMutableData().getMutableMap()
+          .clear();
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    public Builder removeData(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableData().getMutableMap()
+          .remove(key);
+      return this;
+    }
+    /**
+     * Use alternate mutation accessors instead.
+     */
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String>
+    getMutableData() {
+      return internalGetMutableData().getMutableMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    public Builder putData(
+        java.lang.String key,
+        java.lang.String value) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      if (value == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableData().getMutableMap()
+          .put(key, value);
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    public Builder putAllData(
+        java.util.Map<java.lang.String, java.lang.String> values) {
+      internalGetMutableData().getMutableMap()
+          .putAll(values);
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetUserFeatureMapResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserFeatureMapResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserFeatureMapResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserFeatureMapResponse>() {
+    @java.lang.Override
+    public GetUserFeatureMapResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserFeatureMapResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserFeatureMapResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserFeatureMapResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 58 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureMapResponseOrBuilder.java

@@ -0,0 +1,58 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetUserFeatureMapResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserFeatureMapResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  int getDataCount();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  boolean containsData(
+      java.lang.String key);
+  /**
+   * Use {@link #getDataMap()} instead.
+   */
+  @java.lang.Deprecated
+  java.util.Map<java.lang.String, java.lang.String>
+  getData();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  java.util.Map<java.lang.String, java.lang.String>
+  getDataMap();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  java.lang.String getDataOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue);
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  java.lang.String getDataOrThrow(
+      java.lang.String key);
+}

+ 557 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapRequest.java

@@ -0,0 +1,557 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetVideoFeatureMapRequest}
+ */
+public final class GetVideoFeatureMapRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetVideoFeatureMapRequest)
+    GetVideoFeatureMapRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetVideoFeatureMapRequest.newBuilder() to construct.
+  private GetVideoFeatureMapRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetVideoFeatureMapRequest() {
+    videoId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetVideoFeatureMapRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetVideoFeatureMapRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    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;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            videoId_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.Builder.class);
+  }
+
+  public static final int VIDEO_ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object videoId_;
+  /**
+   * <code>string video_id = 1;</code>
+   * @return The videoId.
+   */
+  @java.lang.Override
+  public java.lang.String getVideoId() {
+    java.lang.Object ref = videoId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      videoId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string video_id = 1;</code>
+   * @return The bytes for videoId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getVideoIdBytes() {
+    java.lang.Object ref = videoId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      videoId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getVideoIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, videoId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getVideoIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, videoId_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest) obj;
+
+    if (!getVideoId()
+        .equals(other.getVideoId())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + VIDEO_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getVideoId().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetVideoFeatureMapRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetVideoFeatureMapRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      videoId_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest(this);
+      result.videoId_ = videoId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest.getDefaultInstance()) return this;
+      if (!other.getVideoId().isEmpty()) {
+        videoId_ = other.videoId_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object videoId_ = "";
+    /**
+     * <code>string video_id = 1;</code>
+     * @return The videoId.
+     */
+    public java.lang.String getVideoId() {
+      java.lang.Object ref = videoId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        videoId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string video_id = 1;</code>
+     * @return The bytes for videoId.
+     */
+    public com.google.protobuf.ByteString
+        getVideoIdBytes() {
+      java.lang.Object ref = videoId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        videoId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string video_id = 1;</code>
+     * @param value The videoId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      videoId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string video_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideoId() {
+      
+      videoId_ = getDefaultInstance().getVideoId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string video_id = 1;</code>
+     * @param value The bytes for videoId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      videoId_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetVideoFeatureMapRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetVideoFeatureMapRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetVideoFeatureMapRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetVideoFeatureMapRequest>() {
+    @java.lang.Override
+    public GetVideoFeatureMapRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetVideoFeatureMapRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetVideoFeatureMapRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetVideoFeatureMapRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 21 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapRequestOrBuilder.java

@@ -0,0 +1,21 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetVideoFeatureMapRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetVideoFeatureMapRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string video_id = 1;</code>
+   * @return The videoId.
+   */
+  java.lang.String getVideoId();
+  /**
+   * <code>string video_id = 1;</code>
+   * @return The bytes for videoId.
+   */
+  com.google.protobuf.ByteString
+      getVideoIdBytes();
+}

+ 893 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapResponse.java

@@ -0,0 +1,893 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetVideoFeatureMapResponse}
+ */
+public final class GetVideoFeatureMapResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetVideoFeatureMapResponse)
+    GetVideoFeatureMapResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetVideoFeatureMapResponse.newBuilder() to construct.
+  private GetVideoFeatureMapResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetVideoFeatureMapResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetVideoFeatureMapResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetVideoFeatureMapResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    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;
+          case 10: {
+            com.tzld.piaoquan.recommend.feature.model.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              data_ = com.google.protobuf.MapField.newMapField(
+                  DataDefaultEntryHolder.defaultEntry);
+              mutable_bitField0_ |= 0x00000001;
+            }
+            com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+            data__ = input.readMessage(
+                DataDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+            data_.getMutableMap().put(
+                data__.getKey(), data__.getValue());
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_descriptor;
+  }
+
+  @SuppressWarnings({"rawtypes"})
+  @java.lang.Override
+  protected com.google.protobuf.MapField internalGetMapField(
+      int number) {
+    switch (number) {
+      case 2:
+        return internalGetData();
+      default:
+        throw new RuntimeException(
+            "Invalid map field number: " + number);
+    }
+  }
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int DATA_FIELD_NUMBER = 2;
+  private static final class DataDefaultEntryHolder {
+    static final com.google.protobuf.MapEntry<
+        java.lang.String, java.lang.String> defaultEntry =
+            com.google.protobuf.MapEntry
+            .<java.lang.String, java.lang.String>newDefaultInstance(
+                com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_DataEntry_descriptor, 
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "",
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "");
+  }
+  private com.google.protobuf.MapField<
+      java.lang.String, java.lang.String> data_;
+  private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+  internalGetData() {
+    if (data_ == null) {
+      return com.google.protobuf.MapField.emptyMapField(
+          DataDefaultEntryHolder.defaultEntry);
+    }
+    return data_;
+  }
+
+  public int getDataCount() {
+    return internalGetData().getMap().size();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  @java.lang.Override
+  public boolean containsData(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    return internalGetData().getMap().containsKey(key);
+  }
+  /**
+   * Use {@link #getDataMap()} instead.
+   */
+  @java.lang.Override
+  @java.lang.Deprecated
+  public java.util.Map<java.lang.String, java.lang.String> getData() {
+    return getDataMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
+    return internalGetData().getMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getDataOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetData().getMap();
+    return map.containsKey(key) ? map.get(key) : defaultValue;
+  }
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getDataOrThrow(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetData().getMap();
+    if (!map.containsKey(key)) {
+      throw new java.lang.IllegalArgumentException();
+    }
+    return map.get(key);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    com.google.protobuf.GeneratedMessageV3
+      .serializeStringMapTo(
+        output,
+        internalGetData(),
+        DataDefaultEntryHolder.defaultEntry,
+        2);
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
+         : internalGetData().getMap().entrySet()) {
+      com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+      data__ = DataDefaultEntryHolder.defaultEntry.newBuilderForType()
+          .setKey(entry.getKey())
+          .setValue(entry.getValue())
+          .build();
+      size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, data__);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!internalGetData().equals(
+        other.internalGetData())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (!internalGetData().getMap().isEmpty()) {
+      hash = (37 * hash) + DATA_FIELD_NUMBER;
+      hash = (53 * hash) + internalGetData().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetVideoFeatureMapResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetVideoFeatureMapResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetData();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMutableMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetMutableData();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      internalGetMutableData().clear();
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureMapResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      result.data_ = internalGetData();
+      result.data_.makeImmutable();
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      internalGetMutableData().mergeFrom(
+          other.internalGetData());
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.feature.model.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.feature.model.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private com.google.protobuf.MapField<
+        java.lang.String, java.lang.String> data_;
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetData() {
+      if (data_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            DataDefaultEntryHolder.defaultEntry);
+      }
+      return data_;
+    }
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetMutableData() {
+      onChanged();;
+      if (data_ == null) {
+        data_ = com.google.protobuf.MapField.newMapField(
+            DataDefaultEntryHolder.defaultEntry);
+      }
+      if (!data_.isMutable()) {
+        data_ = data_.copy();
+      }
+      return data_;
+    }
+
+    public int getDataCount() {
+      return internalGetData().getMap().size();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    @java.lang.Override
+    public boolean containsData(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      return internalGetData().getMap().containsKey(key);
+    }
+    /**
+     * Use {@link #getDataMap()} instead.
+     */
+    @java.lang.Override
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String> getData() {
+      return getDataMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
+      return internalGetData().getMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getDataOrDefault(
+        java.lang.String key,
+        java.lang.String defaultValue) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetData().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getDataOrThrow(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetData().getMap();
+      if (!map.containsKey(key)) {
+        throw new java.lang.IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public Builder clearData() {
+      internalGetMutableData().getMutableMap()
+          .clear();
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    public Builder removeData(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableData().getMutableMap()
+          .remove(key);
+      return this;
+    }
+    /**
+     * Use alternate mutation accessors instead.
+     */
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String>
+    getMutableData() {
+      return internalGetMutableData().getMutableMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+    public Builder putData(
+        java.lang.String key,
+        java.lang.String value) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      if (value == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableData().getMutableMap()
+          .put(key, value);
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; data = 2;</code>
+     */
+
+    public Builder putAllData(
+        java.util.Map<java.lang.String, java.lang.String> values) {
+      internalGetMutableData().getMutableMap()
+          .putAll(values);
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetVideoFeatureMapResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetVideoFeatureMapResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetVideoFeatureMapResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetVideoFeatureMapResponse>() {
+    @java.lang.Override
+    public GetVideoFeatureMapResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetVideoFeatureMapResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetVideoFeatureMapResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetVideoFeatureMapResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureMapResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 58 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureMapResponseOrBuilder.java

@@ -0,0 +1,58 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetVideoFeatureMapResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetVideoFeatureMapResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  int getDataCount();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  boolean containsData(
+      java.lang.String key);
+  /**
+   * Use {@link #getDataMap()} instead.
+   */
+  @java.lang.Deprecated
+  java.util.Map<java.lang.String, java.lang.String>
+  getData();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+  java.util.Map<java.lang.String, java.lang.String>
+  getDataMap();
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  java.lang.String getDataOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue);
+  /**
+   * <code>map&lt;string, string&gt; data = 2;</code>
+   */
+
+  java.lang.String getDataOrThrow(
+      java.lang.String key);
+}

+ 21 - 1
recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto

@@ -142,6 +142,25 @@ message GetAllAdItemFeatureResponse {
   repeated AdItemFeatureProto ad_item_feature = 2;
 }
 
+message GetUserFeatureMapRequest {
+  string mid = 1;
+}
+
+message GetUserFeatureMapResponse {
+  Result result = 1;
+  map<string, string> data = 2;
+}
+
+message GetVideoFeatureMapRequest {
+  string video_id = 1;
+}
+
+message GetVideoFeatureMapResponse {
+  Result result = 1;
+  map<string, string> data = 2;
+}
+
+
 service FeatureService {
   rpc GetUserAdFeature (GetUserAdFeatureRequest) returns (GetUserAdFeatureResponse);
   rpc GetAdItemFeature (GetAdItemFeatureRequest) returns (GetAdItemFeatureResponse);
@@ -149,5 +168,6 @@ service FeatureService {
   rpc GetUserFeature (GetUserFeatureRequest) returns (GetUserFeatureResponse);
   rpc GetVideoFeature (GetVideoFeatureRequest) returns (GetVideoFeatureResponse);
   rpc GetAllVideoFeature (GetAllVideoFeatureRequest) returns (GetAllVideoFeatureResponse);
-
+  rpc GetUserFeatureMap (GetUserFeatureMapRequest) returns (GetUserFeatureMapResponse);
+  rpc GetVideoFeatureMap (GetVideoFeatureMapRequest) returns (GetVideoFeatureMapResponse);
 }

+ 20 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/grpcservice/FeatureGrpcService.java

@@ -87,4 +87,24 @@ public class FeatureGrpcService extends FeatureServiceGrpc.FeatureServiceImplBas
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }
+
+    @Override
+    public void getUserFeatureMap(GetUserFeatureMapRequest request,
+                                StreamObserver<GetUserFeatureMapResponse> responseObserver) {
+        log.info("FeatureGrpcService getUserFeatureMap request={}", ProtobufUtils.toJson(request));
+        GetUserFeatureResponse response = userFeatureService.getUserFeature(request);
+        log.info("FeatureGrpcService getUserFeatureMap response={}", ProtobufUtils.toJson(response));
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void getVideoFeatureMap(GetVideoFeatureMapRequest request,
+                                StreamObserver<GetVideoFeatureMapResponse> responseObserver) {
+        log.info("FeatureGrpcService getVideoFeatureMap request={}", ProtobufUtils.toJson(request));
+        GetVideoFeatureResponse response = videoFeatureService.getVideoFeature(request);
+        log.info("FeatureGrpcService getVideoFeatureMap response={}", ProtobufUtils.toJson(response));
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
 }

+ 18 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserFeatureService.java

@@ -3,6 +3,8 @@ package com.tzld.piaoquan.recommend.feature.service;
 import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.UserFeature;
 import com.tzld.piaoquan.recommend.feature.model.common.Result;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapRequest;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureMapResponse;
 import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest;
 import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -49,6 +51,22 @@ public class UserFeatureService extends AbstractFeatureService<String, UserFeatu
         return builder.build();
     }
 
+    public GetUserFeatureMapResponse getUserFeatureMap(GetUserFeatureMapRequest request) {
+        String mid = request.getMid();
+        if (StringUtils.isBlank(mid)) {
+            return GetUserFeatureMapResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1))
+                    .build();
+        }
+        UserFeature userFeature = super.get(mid);
+        GetUserFeatureResponse.Builder builder = GetUserFeatureResponse.newBuilder();
+        builder.setResult(Result.newBuilder().setCode(1));
+        if (userFeature != null) {
+            builder.setUserFeature(FeatureConverter.convert(userFeature));
+        }
+        return builder.build();
+    }
+
 //    public void saveUserFeature(String jsonValue) {
 //
 //