浏览代码

add ad_feature objs and api

gufengshou1 1 年之前
父节点
当前提交
634962ea47
共有 29 个文件被更改,包括 15527 次插入36 次删除
  1. 749 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdActionFeatureProto.java
  2. 39 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdActionFeatureProtoOrBuilder.java
  3. 2275 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdItemFeatureProto.java
  4. 165 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdItemFeatureProtoOrBuilder.java
  5. 161 8
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java
  6. 231 18
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java
  7. 225 3
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java
  8. 557 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureRequest.java
  9. 21 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureRequestOrBuilder.java
  10. 795 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureResponse.java
  11. 39 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureResponseOrBuilder.java
  12. 614 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureRequest.java
  13. 34 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureRequestOrBuilder.java
  14. 958 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureResponse.java
  15. 48 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureResponseOrBuilder.java
  16. 557 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureRequest.java
  17. 21 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureRequestOrBuilder.java
  18. 795 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureResponse.java
  19. 39 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureResponseOrBuilder.java
  20. 6139 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProto.java
  21. 501 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProtoOrBuilder.java
  22. 98 0
      recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto
  23. 72 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdActionFeature.java
  24. 86 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdItemFeature.java
  25. 113 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/UserAdFeature.java
  26. 71 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/AdItemFeatureService.java
  27. 76 6
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/FeatureConverter.java
  28. 47 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAdFeatureService.java
  29. 1 1
      recommend-feature-service/src/main/resources/application-dev.yml

+ 749 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdActionFeatureProto.java

@@ -0,0 +1,749 @@
+// 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 AdActionFeatureProto}
+ */
+public final class AdActionFeatureProto extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:AdActionFeatureProto)
+    AdActionFeatureProtoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use AdActionFeatureProto.newBuilder() to construct.
+  private AdActionFeatureProto(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private AdActionFeatureProto() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new AdActionFeatureProto();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private AdActionFeatureProto(
+      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 9: {
+
+            adView_ = input.readDouble();
+            break;
+          }
+          case 17: {
+
+            adClick_ = input.readDouble();
+            break;
+          }
+          case 25: {
+
+            adConversion_ = input.readDouble();
+            break;
+          }
+          case 33: {
+
+            ctr_ = input.readDouble();
+            break;
+          }
+          case 41: {
+
+            cvr_ = input.readDouble();
+            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_AdActionFeatureProto_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdActionFeatureProto_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder.class);
+  }
+
+  public static final int ADVIEW_FIELD_NUMBER = 1;
+  private double adView_;
+  /**
+   * <code>double adView = 1;</code>
+   * @return The adView.
+   */
+  @java.lang.Override
+  public double getAdView() {
+    return adView_;
+  }
+
+  public static final int ADCLICK_FIELD_NUMBER = 2;
+  private double adClick_;
+  /**
+   * <code>double adClick = 2;</code>
+   * @return The adClick.
+   */
+  @java.lang.Override
+  public double getAdClick() {
+    return adClick_;
+  }
+
+  public static final int ADCONVERSION_FIELD_NUMBER = 3;
+  private double adConversion_;
+  /**
+   * <code>double adConversion = 3;</code>
+   * @return The adConversion.
+   */
+  @java.lang.Override
+  public double getAdConversion() {
+    return adConversion_;
+  }
+
+  public static final int CTR_FIELD_NUMBER = 4;
+  private double ctr_;
+  /**
+   * <code>double ctr = 4;</code>
+   * @return The ctr.
+   */
+  @java.lang.Override
+  public double getCtr() {
+    return ctr_;
+  }
+
+  public static final int CVR_FIELD_NUMBER = 5;
+  private double cvr_;
+  /**
+   * <code>double cvr = 5;</code>
+   * @return The cvr.
+   */
+  @java.lang.Override
+  public double getCvr() {
+    return cvr_;
+  }
+
+  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 (adView_ != 0D) {
+      output.writeDouble(1, adView_);
+    }
+    if (adClick_ != 0D) {
+      output.writeDouble(2, adClick_);
+    }
+    if (adConversion_ != 0D) {
+      output.writeDouble(3, adConversion_);
+    }
+    if (ctr_ != 0D) {
+      output.writeDouble(4, ctr_);
+    }
+    if (cvr_ != 0D) {
+      output.writeDouble(5, cvr_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (adView_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(1, adView_);
+    }
+    if (adClick_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(2, adClick_);
+    }
+    if (adConversion_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(3, adConversion_);
+    }
+    if (ctr_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(4, ctr_);
+    }
+    if (cvr_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(5, cvr_);
+    }
+    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.AdActionFeatureProto)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto other = (com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto) obj;
+
+    if (java.lang.Double.doubleToLongBits(getAdView())
+        != java.lang.Double.doubleToLongBits(
+            other.getAdView())) return false;
+    if (java.lang.Double.doubleToLongBits(getAdClick())
+        != java.lang.Double.doubleToLongBits(
+            other.getAdClick())) return false;
+    if (java.lang.Double.doubleToLongBits(getAdConversion())
+        != java.lang.Double.doubleToLongBits(
+            other.getAdConversion())) return false;
+    if (java.lang.Double.doubleToLongBits(getCtr())
+        != java.lang.Double.doubleToLongBits(
+            other.getCtr())) return false;
+    if (java.lang.Double.doubleToLongBits(getCvr())
+        != java.lang.Double.doubleToLongBits(
+            other.getCvr())) 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) + ADVIEW_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getAdView()));
+    hash = (37 * hash) + ADCLICK_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getAdClick()));
+    hash = (37 * hash) + ADCONVERSION_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getAdConversion()));
+    hash = (37 * hash) + CTR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getCtr()));
+    hash = (37 * hash) + CVR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getCvr()));
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto 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.AdActionFeatureProto parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto 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.AdActionFeatureProto parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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.AdActionFeatureProto 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 AdActionFeatureProto}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:AdActionFeatureProto)
+      com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdActionFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdActionFeatureProto_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.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();
+      adView_ = 0D;
+
+      adClick_ = 0D;
+
+      adConversion_ = 0D;
+
+      ctr_ = 0D;
+
+      cvr_ = 0D;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdActionFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto result = new com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto(this);
+      result.adView_ = adView_;
+      result.adClick_ = adClick_;
+      result.adConversion_ = adConversion_;
+      result.ctr_ = ctr_;
+      result.cvr_ = cvr_;
+      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.AdActionFeatureProto) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance()) return this;
+      if (other.getAdView() != 0D) {
+        setAdView(other.getAdView());
+      }
+      if (other.getAdClick() != 0D) {
+        setAdClick(other.getAdClick());
+      }
+      if (other.getAdConversion() != 0D) {
+        setAdConversion(other.getAdConversion());
+      }
+      if (other.getCtr() != 0D) {
+        setCtr(other.getCtr());
+      }
+      if (other.getCvr() != 0D) {
+        setCvr(other.getCvr());
+      }
+      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.AdActionFeatureProto parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private double adView_ ;
+    /**
+     * <code>double adView = 1;</code>
+     * @return The adView.
+     */
+    @java.lang.Override
+    public double getAdView() {
+      return adView_;
+    }
+    /**
+     * <code>double adView = 1;</code>
+     * @param value The adView to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdView(double value) {
+      
+      adView_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double adView = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdView() {
+      
+      adView_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double adClick_ ;
+    /**
+     * <code>double adClick = 2;</code>
+     * @return The adClick.
+     */
+    @java.lang.Override
+    public double getAdClick() {
+      return adClick_;
+    }
+    /**
+     * <code>double adClick = 2;</code>
+     * @param value The adClick to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdClick(double value) {
+      
+      adClick_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double adClick = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdClick() {
+      
+      adClick_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double adConversion_ ;
+    /**
+     * <code>double adConversion = 3;</code>
+     * @return The adConversion.
+     */
+    @java.lang.Override
+    public double getAdConversion() {
+      return adConversion_;
+    }
+    /**
+     * <code>double adConversion = 3;</code>
+     * @param value The adConversion to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdConversion(double value) {
+      
+      adConversion_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double adConversion = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdConversion() {
+      
+      adConversion_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double ctr_ ;
+    /**
+     * <code>double ctr = 4;</code>
+     * @return The ctr.
+     */
+    @java.lang.Override
+    public double getCtr() {
+      return ctr_;
+    }
+    /**
+     * <code>double ctr = 4;</code>
+     * @param value The ctr to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCtr(double value) {
+      
+      ctr_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double ctr = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCtr() {
+      
+      ctr_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double cvr_ ;
+    /**
+     * <code>double cvr = 5;</code>
+     * @return The cvr.
+     */
+    @java.lang.Override
+    public double getCvr() {
+      return cvr_;
+    }
+    /**
+     * <code>double cvr = 5;</code>
+     * @param value The cvr to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCvr(double value) {
+      
+      cvr_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double cvr = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCvr() {
+      
+      cvr_ = 0D;
+      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:AdActionFeatureProto)
+  }
+
+  // @@protoc_insertion_point(class_scope:AdActionFeatureProto)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<AdActionFeatureProto>
+      PARSER = new com.google.protobuf.AbstractParser<AdActionFeatureProto>() {
+    @java.lang.Override
+    public AdActionFeatureProto parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new AdActionFeatureProto(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<AdActionFeatureProto> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<AdActionFeatureProto> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 39 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdActionFeatureProtoOrBuilder.java

@@ -0,0 +1,39 @@
+// 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 AdActionFeatureProtoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:AdActionFeatureProto)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>double adView = 1;</code>
+   * @return The adView.
+   */
+  double getAdView();
+
+  /**
+   * <code>double adClick = 2;</code>
+   * @return The adClick.
+   */
+  double getAdClick();
+
+  /**
+   * <code>double adConversion = 3;</code>
+   * @return The adConversion.
+   */
+  double getAdConversion();
+
+  /**
+   * <code>double ctr = 4;</code>
+   * @return The ctr.
+   */
+  double getCtr();
+
+  /**
+   * <code>double cvr = 5;</code>
+   * @return The cvr.
+   */
+  double getCvr();
+}

+ 2275 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdItemFeatureProto.java

@@ -0,0 +1,2275 @@
+// 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 AdItemFeatureProto}
+ */
+public final class AdItemFeatureProto extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:AdItemFeatureProto)
+    AdItemFeatureProtoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use AdItemFeatureProto.newBuilder() to construct.
+  private AdItemFeatureProto(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private AdItemFeatureProto() {
+    adId_ = "";
+    adCode_ = "";
+    advertiserId_ = "";
+    advertiserCode_ = "";
+    campaignId_ = "";
+    campaignCode_ = "";
+    creativeId_ = "";
+    creativeCode_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new AdItemFeatureProto();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private AdItemFeatureProto(
+      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();
+
+            adId_ = s;
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            adCode_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            advertiserId_ = s;
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            advertiserCode_ = s;
+            break;
+          }
+          case 42: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            campaignId_ = s;
+            break;
+          }
+          case 50: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            campaignCode_ = s;
+            break;
+          }
+          case 58: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            creativeId_ = s;
+            break;
+          }
+          case 66: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            creativeCode_ = s;
+            break;
+          }
+          case 74: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day1CntFeatures_ != null) {
+              subBuilder = day1CntFeatures_.toBuilder();
+            }
+            day1CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day1CntFeatures_);
+              day1CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 82: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day3CntFeatures_ != null) {
+              subBuilder = day3CntFeatures_.toBuilder();
+            }
+            day3CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day3CntFeatures_);
+              day3CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 90: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day7CntFeatures_ != null) {
+              subBuilder = day7CntFeatures_.toBuilder();
+            }
+            day7CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day7CntFeatures_);
+              day7CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 98: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (month3CntFeatures_ != null) {
+              subBuilder = month3CntFeatures_.toBuilder();
+            }
+            month3CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(month3CntFeatures_);
+              month3CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            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_AdItemFeatureProto_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdItemFeatureProto_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder.class);
+  }
+
+  public static final int ADID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object adId_;
+  /**
+   * <code>string adId = 1;</code>
+   * @return The adId.
+   */
+  @java.lang.Override
+  public java.lang.String getAdId() {
+    java.lang.Object ref = adId_;
+    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();
+      adId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string adId = 1;</code>
+   * @return The bytes for adId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAdIdBytes() {
+    java.lang.Object ref = adId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      adId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ADCODE_FIELD_NUMBER = 2;
+  private volatile java.lang.Object adCode_;
+  /**
+   * <code>string adCode = 2;</code>
+   * @return The adCode.
+   */
+  @java.lang.Override
+  public java.lang.String getAdCode() {
+    java.lang.Object ref = adCode_;
+    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();
+      adCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string adCode = 2;</code>
+   * @return The bytes for adCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAdCodeBytes() {
+    java.lang.Object ref = adCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      adCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ADVERTISERID_FIELD_NUMBER = 3;
+  private volatile java.lang.Object advertiserId_;
+  /**
+   * <code>string advertiserId = 3;</code>
+   * @return The advertiserId.
+   */
+  @java.lang.Override
+  public java.lang.String getAdvertiserId() {
+    java.lang.Object ref = advertiserId_;
+    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();
+      advertiserId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string advertiserId = 3;</code>
+   * @return The bytes for advertiserId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAdvertiserIdBytes() {
+    java.lang.Object ref = advertiserId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      advertiserId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ADVERTISERCODE_FIELD_NUMBER = 4;
+  private volatile java.lang.Object advertiserCode_;
+  /**
+   * <code>string advertiserCode = 4;</code>
+   * @return The advertiserCode.
+   */
+  @java.lang.Override
+  public java.lang.String getAdvertiserCode() {
+    java.lang.Object ref = advertiserCode_;
+    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();
+      advertiserCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string advertiserCode = 4;</code>
+   * @return The bytes for advertiserCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAdvertiserCodeBytes() {
+    java.lang.Object ref = advertiserCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      advertiserCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CAMPAIGNID_FIELD_NUMBER = 5;
+  private volatile java.lang.Object campaignId_;
+  /**
+   * <code>string campaignId = 5;</code>
+   * @return The campaignId.
+   */
+  @java.lang.Override
+  public java.lang.String getCampaignId() {
+    java.lang.Object ref = campaignId_;
+    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();
+      campaignId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string campaignId = 5;</code>
+   * @return The bytes for campaignId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCampaignIdBytes() {
+    java.lang.Object ref = campaignId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      campaignId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CAMPAIGNCODE_FIELD_NUMBER = 6;
+  private volatile java.lang.Object campaignCode_;
+  /**
+   * <code>string campaignCode = 6;</code>
+   * @return The campaignCode.
+   */
+  @java.lang.Override
+  public java.lang.String getCampaignCode() {
+    java.lang.Object ref = campaignCode_;
+    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();
+      campaignCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string campaignCode = 6;</code>
+   * @return The bytes for campaignCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCampaignCodeBytes() {
+    java.lang.Object ref = campaignCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      campaignCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CREATIVEID_FIELD_NUMBER = 7;
+  private volatile java.lang.Object creativeId_;
+  /**
+   * <code>string creativeId = 7;</code>
+   * @return The creativeId.
+   */
+  @java.lang.Override
+  public java.lang.String getCreativeId() {
+    java.lang.Object ref = creativeId_;
+    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();
+      creativeId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string creativeId = 7;</code>
+   * @return The bytes for creativeId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCreativeIdBytes() {
+    java.lang.Object ref = creativeId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      creativeId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CREATIVECODE_FIELD_NUMBER = 8;
+  private volatile java.lang.Object creativeCode_;
+  /**
+   * <code>string creativeCode = 8;</code>
+   * @return The creativeCode.
+   */
+  @java.lang.Override
+  public java.lang.String getCreativeCode() {
+    java.lang.Object ref = creativeCode_;
+    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();
+      creativeCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string creativeCode = 8;</code>
+   * @return The bytes for creativeCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCreativeCodeBytes() {
+    java.lang.Object ref = creativeCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      creativeCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int DAY1_CNT_FEATURES_FIELD_NUMBER = 9;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day1CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   * @return Whether the day1CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay1CntFeatures() {
+    return day1CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   * @return The day1CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures() {
+    return day1CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder() {
+    return getDay1CntFeatures();
+  }
+
+  public static final int DAY3_CNT_FEATURES_FIELD_NUMBER = 10;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day3CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   * @return Whether the day3CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay3CntFeatures() {
+    return day3CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   * @return The day3CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures() {
+    return day3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder() {
+    return getDay3CntFeatures();
+  }
+
+  public static final int DAY7_CNT_FEATURES_FIELD_NUMBER = 11;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day7CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   * @return Whether the day7CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay7CntFeatures() {
+    return day7CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   * @return The day7CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures() {
+    return day7CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder() {
+    return getDay7CntFeatures();
+  }
+
+  public static final int MONTH3_CNT_FEATURES_FIELD_NUMBER = 12;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto month3CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   * @return Whether the month3CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasMonth3CntFeatures() {
+    return month3CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   * @return The month3CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures() {
+    return month3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder() {
+    return getMonth3CntFeatures();
+  }
+
+  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 (!getAdIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, adId_);
+    }
+    if (!getAdCodeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, adCode_);
+    }
+    if (!getAdvertiserIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, advertiserId_);
+    }
+    if (!getAdvertiserCodeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, advertiserCode_);
+    }
+    if (!getCampaignIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, campaignId_);
+    }
+    if (!getCampaignCodeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 6, campaignCode_);
+    }
+    if (!getCreativeIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 7, creativeId_);
+    }
+    if (!getCreativeCodeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 8, creativeCode_);
+    }
+    if (day1CntFeatures_ != null) {
+      output.writeMessage(9, getDay1CntFeatures());
+    }
+    if (day3CntFeatures_ != null) {
+      output.writeMessage(10, getDay3CntFeatures());
+    }
+    if (day7CntFeatures_ != null) {
+      output.writeMessage(11, getDay7CntFeatures());
+    }
+    if (month3CntFeatures_ != null) {
+      output.writeMessage(12, getMonth3CntFeatures());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getAdIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, adId_);
+    }
+    if (!getAdCodeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, adCode_);
+    }
+    if (!getAdvertiserIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, advertiserId_);
+    }
+    if (!getAdvertiserCodeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, advertiserCode_);
+    }
+    if (!getCampaignIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, campaignId_);
+    }
+    if (!getCampaignCodeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, campaignCode_);
+    }
+    if (!getCreativeIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, creativeId_);
+    }
+    if (!getCreativeCodeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, creativeCode_);
+    }
+    if (day1CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(9, getDay1CntFeatures());
+    }
+    if (day3CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(10, getDay3CntFeatures());
+    }
+    if (day7CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(11, getDay7CntFeatures());
+    }
+    if (month3CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(12, getMonth3CntFeatures());
+    }
+    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.AdItemFeatureProto)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto other = (com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto) obj;
+
+    if (!getAdId()
+        .equals(other.getAdId())) return false;
+    if (!getAdCode()
+        .equals(other.getAdCode())) return false;
+    if (!getAdvertiserId()
+        .equals(other.getAdvertiserId())) return false;
+    if (!getAdvertiserCode()
+        .equals(other.getAdvertiserCode())) return false;
+    if (!getCampaignId()
+        .equals(other.getCampaignId())) return false;
+    if (!getCampaignCode()
+        .equals(other.getCampaignCode())) return false;
+    if (!getCreativeId()
+        .equals(other.getCreativeId())) return false;
+    if (!getCreativeCode()
+        .equals(other.getCreativeCode())) return false;
+    if (hasDay1CntFeatures() != other.hasDay1CntFeatures()) return false;
+    if (hasDay1CntFeatures()) {
+      if (!getDay1CntFeatures()
+          .equals(other.getDay1CntFeatures())) return false;
+    }
+    if (hasDay3CntFeatures() != other.hasDay3CntFeatures()) return false;
+    if (hasDay3CntFeatures()) {
+      if (!getDay3CntFeatures()
+          .equals(other.getDay3CntFeatures())) return false;
+    }
+    if (hasDay7CntFeatures() != other.hasDay7CntFeatures()) return false;
+    if (hasDay7CntFeatures()) {
+      if (!getDay7CntFeatures()
+          .equals(other.getDay7CntFeatures())) return false;
+    }
+    if (hasMonth3CntFeatures() != other.hasMonth3CntFeatures()) return false;
+    if (hasMonth3CntFeatures()) {
+      if (!getMonth3CntFeatures()
+          .equals(other.getMonth3CntFeatures())) 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) + ADID_FIELD_NUMBER;
+    hash = (53 * hash) + getAdId().hashCode();
+    hash = (37 * hash) + ADCODE_FIELD_NUMBER;
+    hash = (53 * hash) + getAdCode().hashCode();
+    hash = (37 * hash) + ADVERTISERID_FIELD_NUMBER;
+    hash = (53 * hash) + getAdvertiserId().hashCode();
+    hash = (37 * hash) + ADVERTISERCODE_FIELD_NUMBER;
+    hash = (53 * hash) + getAdvertiserCode().hashCode();
+    hash = (37 * hash) + CAMPAIGNID_FIELD_NUMBER;
+    hash = (53 * hash) + getCampaignId().hashCode();
+    hash = (37 * hash) + CAMPAIGNCODE_FIELD_NUMBER;
+    hash = (53 * hash) + getCampaignCode().hashCode();
+    hash = (37 * hash) + CREATIVEID_FIELD_NUMBER;
+    hash = (53 * hash) + getCreativeId().hashCode();
+    hash = (37 * hash) + CREATIVECODE_FIELD_NUMBER;
+    hash = (53 * hash) + getCreativeCode().hashCode();
+    if (hasDay1CntFeatures()) {
+      hash = (37 * hash) + DAY1_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay1CntFeatures().hashCode();
+    }
+    if (hasDay3CntFeatures()) {
+      hash = (37 * hash) + DAY3_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay3CntFeatures().hashCode();
+    }
+    if (hasDay7CntFeatures()) {
+      hash = (37 * hash) + DAY7_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay7CntFeatures().hashCode();
+    }
+    if (hasMonth3CntFeatures()) {
+      hash = (37 * hash) + MONTH3_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getMonth3CntFeatures().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto 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.AdItemFeatureProto parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto 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.AdItemFeatureProto parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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.AdItemFeatureProto 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 AdItemFeatureProto}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:AdItemFeatureProto)
+      com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdItemFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdItemFeatureProto_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.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();
+      adId_ = "";
+
+      adCode_ = "";
+
+      advertiserId_ = "";
+
+      advertiserCode_ = "";
+
+      campaignId_ = "";
+
+      campaignCode_ = "";
+
+      creativeId_ = "";
+
+      creativeCode_ = "";
+
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = null;
+      } else {
+        day1CntFeatures_ = null;
+        day1CntFeaturesBuilder_ = null;
+      }
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = null;
+      } else {
+        day3CntFeatures_ = null;
+        day3CntFeaturesBuilder_ = null;
+      }
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = null;
+      } else {
+        day7CntFeatures_ = null;
+        day7CntFeaturesBuilder_ = null;
+      }
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = null;
+      } else {
+        month3CntFeatures_ = null;
+        month3CntFeaturesBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_AdItemFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto result = new com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto(this);
+      result.adId_ = adId_;
+      result.adCode_ = adCode_;
+      result.advertiserId_ = advertiserId_;
+      result.advertiserCode_ = advertiserCode_;
+      result.campaignId_ = campaignId_;
+      result.campaignCode_ = campaignCode_;
+      result.creativeId_ = creativeId_;
+      result.creativeCode_ = creativeCode_;
+      if (day1CntFeaturesBuilder_ == null) {
+        result.day1CntFeatures_ = day1CntFeatures_;
+      } else {
+        result.day1CntFeatures_ = day1CntFeaturesBuilder_.build();
+      }
+      if (day3CntFeaturesBuilder_ == null) {
+        result.day3CntFeatures_ = day3CntFeatures_;
+      } else {
+        result.day3CntFeatures_ = day3CntFeaturesBuilder_.build();
+      }
+      if (day7CntFeaturesBuilder_ == null) {
+        result.day7CntFeatures_ = day7CntFeatures_;
+      } else {
+        result.day7CntFeatures_ = day7CntFeaturesBuilder_.build();
+      }
+      if (month3CntFeaturesBuilder_ == null) {
+        result.month3CntFeatures_ = month3CntFeatures_;
+      } else {
+        result.month3CntFeatures_ = month3CntFeaturesBuilder_.build();
+      }
+      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.AdItemFeatureProto) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance()) return this;
+      if (!other.getAdId().isEmpty()) {
+        adId_ = other.adId_;
+        onChanged();
+      }
+      if (!other.getAdCode().isEmpty()) {
+        adCode_ = other.adCode_;
+        onChanged();
+      }
+      if (!other.getAdvertiserId().isEmpty()) {
+        advertiserId_ = other.advertiserId_;
+        onChanged();
+      }
+      if (!other.getAdvertiserCode().isEmpty()) {
+        advertiserCode_ = other.advertiserCode_;
+        onChanged();
+      }
+      if (!other.getCampaignId().isEmpty()) {
+        campaignId_ = other.campaignId_;
+        onChanged();
+      }
+      if (!other.getCampaignCode().isEmpty()) {
+        campaignCode_ = other.campaignCode_;
+        onChanged();
+      }
+      if (!other.getCreativeId().isEmpty()) {
+        creativeId_ = other.creativeId_;
+        onChanged();
+      }
+      if (!other.getCreativeCode().isEmpty()) {
+        creativeCode_ = other.creativeCode_;
+        onChanged();
+      }
+      if (other.hasDay1CntFeatures()) {
+        mergeDay1CntFeatures(other.getDay1CntFeatures());
+      }
+      if (other.hasDay3CntFeatures()) {
+        mergeDay3CntFeatures(other.getDay3CntFeatures());
+      }
+      if (other.hasDay7CntFeatures()) {
+        mergeDay7CntFeatures(other.getDay7CntFeatures());
+      }
+      if (other.hasMonth3CntFeatures()) {
+        mergeMonth3CntFeatures(other.getMonth3CntFeatures());
+      }
+      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.AdItemFeatureProto parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object adId_ = "";
+    /**
+     * <code>string adId = 1;</code>
+     * @return The adId.
+     */
+    public java.lang.String getAdId() {
+      java.lang.Object ref = adId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        adId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string adId = 1;</code>
+     * @return The bytes for adId.
+     */
+    public com.google.protobuf.ByteString
+        getAdIdBytes() {
+      java.lang.Object ref = adId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        adId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string adId = 1;</code>
+     * @param value The adId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      adId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string adId = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdId() {
+      
+      adId_ = getDefaultInstance().getAdId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string adId = 1;</code>
+     * @param value The bytes for adId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      adId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object adCode_ = "";
+    /**
+     * <code>string adCode = 2;</code>
+     * @return The adCode.
+     */
+    public java.lang.String getAdCode() {
+      java.lang.Object ref = adCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        adCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string adCode = 2;</code>
+     * @return The bytes for adCode.
+     */
+    public com.google.protobuf.ByteString
+        getAdCodeBytes() {
+      java.lang.Object ref = adCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        adCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string adCode = 2;</code>
+     * @param value The adCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdCode(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      adCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string adCode = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdCode() {
+      
+      adCode_ = getDefaultInstance().getAdCode();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string adCode = 2;</code>
+     * @param value The bytes for adCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      adCode_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object advertiserId_ = "";
+    /**
+     * <code>string advertiserId = 3;</code>
+     * @return The advertiserId.
+     */
+    public java.lang.String getAdvertiserId() {
+      java.lang.Object ref = advertiserId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        advertiserId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string advertiserId = 3;</code>
+     * @return The bytes for advertiserId.
+     */
+    public com.google.protobuf.ByteString
+        getAdvertiserIdBytes() {
+      java.lang.Object ref = advertiserId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        advertiserId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string advertiserId = 3;</code>
+     * @param value The advertiserId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdvertiserId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      advertiserId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string advertiserId = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdvertiserId() {
+      
+      advertiserId_ = getDefaultInstance().getAdvertiserId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string advertiserId = 3;</code>
+     * @param value The bytes for advertiserId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdvertiserIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      advertiserId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object advertiserCode_ = "";
+    /**
+     * <code>string advertiserCode = 4;</code>
+     * @return The advertiserCode.
+     */
+    public java.lang.String getAdvertiserCode() {
+      java.lang.Object ref = advertiserCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        advertiserCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string advertiserCode = 4;</code>
+     * @return The bytes for advertiserCode.
+     */
+    public com.google.protobuf.ByteString
+        getAdvertiserCodeBytes() {
+      java.lang.Object ref = advertiserCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        advertiserCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string advertiserCode = 4;</code>
+     * @param value The advertiserCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdvertiserCode(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      advertiserCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string advertiserCode = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdvertiserCode() {
+      
+      advertiserCode_ = getDefaultInstance().getAdvertiserCode();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string advertiserCode = 4;</code>
+     * @param value The bytes for advertiserCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdvertiserCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      advertiserCode_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object campaignId_ = "";
+    /**
+     * <code>string campaignId = 5;</code>
+     * @return The campaignId.
+     */
+    public java.lang.String getCampaignId() {
+      java.lang.Object ref = campaignId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        campaignId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string campaignId = 5;</code>
+     * @return The bytes for campaignId.
+     */
+    public com.google.protobuf.ByteString
+        getCampaignIdBytes() {
+      java.lang.Object ref = campaignId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        campaignId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string campaignId = 5;</code>
+     * @param value The campaignId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCampaignId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      campaignId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string campaignId = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCampaignId() {
+      
+      campaignId_ = getDefaultInstance().getCampaignId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string campaignId = 5;</code>
+     * @param value The bytes for campaignId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCampaignIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      campaignId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object campaignCode_ = "";
+    /**
+     * <code>string campaignCode = 6;</code>
+     * @return The campaignCode.
+     */
+    public java.lang.String getCampaignCode() {
+      java.lang.Object ref = campaignCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        campaignCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string campaignCode = 6;</code>
+     * @return The bytes for campaignCode.
+     */
+    public com.google.protobuf.ByteString
+        getCampaignCodeBytes() {
+      java.lang.Object ref = campaignCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        campaignCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string campaignCode = 6;</code>
+     * @param value The campaignCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCampaignCode(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      campaignCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string campaignCode = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCampaignCode() {
+      
+      campaignCode_ = getDefaultInstance().getCampaignCode();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string campaignCode = 6;</code>
+     * @param value The bytes for campaignCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCampaignCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      campaignCode_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object creativeId_ = "";
+    /**
+     * <code>string creativeId = 7;</code>
+     * @return The creativeId.
+     */
+    public java.lang.String getCreativeId() {
+      java.lang.Object ref = creativeId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        creativeId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string creativeId = 7;</code>
+     * @return The bytes for creativeId.
+     */
+    public com.google.protobuf.ByteString
+        getCreativeIdBytes() {
+      java.lang.Object ref = creativeId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        creativeId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string creativeId = 7;</code>
+     * @param value The creativeId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCreativeId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      creativeId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string creativeId = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCreativeId() {
+      
+      creativeId_ = getDefaultInstance().getCreativeId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string creativeId = 7;</code>
+     * @param value The bytes for creativeId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCreativeIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      creativeId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object creativeCode_ = "";
+    /**
+     * <code>string creativeCode = 8;</code>
+     * @return The creativeCode.
+     */
+    public java.lang.String getCreativeCode() {
+      java.lang.Object ref = creativeCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        creativeCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string creativeCode = 8;</code>
+     * @return The bytes for creativeCode.
+     */
+    public com.google.protobuf.ByteString
+        getCreativeCodeBytes() {
+      java.lang.Object ref = creativeCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        creativeCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string creativeCode = 8;</code>
+     * @param value The creativeCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCreativeCode(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      creativeCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string creativeCode = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCreativeCode() {
+      
+      creativeCode_ = getDefaultInstance().getCreativeCode();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string creativeCode = 8;</code>
+     * @param value The bytes for creativeCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCreativeCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      creativeCode_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day1CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day1CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     * @return Whether the day1CntFeatures field is set.
+     */
+    public boolean hasDay1CntFeatures() {
+      return day1CntFeaturesBuilder_ != null || day1CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     * @return The day1CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures() {
+      if (day1CntFeaturesBuilder_ == null) {
+        return day1CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+      } else {
+        return day1CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public Builder setDay1CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day1CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day1CntFeatures_ = value;
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public Builder setDay1CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public Builder mergeDay1CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day1CntFeaturesBuilder_ == null) {
+        if (day1CntFeatures_ != null) {
+          day1CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day1CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day1CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public Builder clearDay1CntFeatures() {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = null;
+        onChanged();
+      } else {
+        day1CntFeatures_ = null;
+        day1CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay1CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay1CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder() {
+      if (day1CntFeaturesBuilder_ != null) {
+        return day1CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day1CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay1CntFeaturesFieldBuilder() {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay1CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day1CntFeatures_ = null;
+      }
+      return day1CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day3CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day3CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     * @return Whether the day3CntFeatures field is set.
+     */
+    public boolean hasDay3CntFeatures() {
+      return day3CntFeaturesBuilder_ != null || day3CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     * @return The day3CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures() {
+      if (day3CntFeaturesBuilder_ == null) {
+        return day3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+      } else {
+        return day3CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public Builder setDay3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day3CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day3CntFeatures_ = value;
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public Builder setDay3CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public Builder mergeDay3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day3CntFeaturesBuilder_ == null) {
+        if (day3CntFeatures_ != null) {
+          day3CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day3CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day3CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public Builder clearDay3CntFeatures() {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = null;
+        onChanged();
+      } else {
+        day3CntFeatures_ = null;
+        day3CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay3CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay3CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder() {
+      if (day3CntFeaturesBuilder_ != null) {
+        return day3CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day3CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay3CntFeaturesFieldBuilder() {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay3CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day3CntFeatures_ = null;
+      }
+      return day3CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day7CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day7CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     * @return Whether the day7CntFeatures field is set.
+     */
+    public boolean hasDay7CntFeatures() {
+      return day7CntFeaturesBuilder_ != null || day7CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     * @return The day7CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures() {
+      if (day7CntFeaturesBuilder_ == null) {
+        return day7CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+      } else {
+        return day7CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public Builder setDay7CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day7CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day7CntFeatures_ = value;
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public Builder setDay7CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public Builder mergeDay7CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day7CntFeaturesBuilder_ == null) {
+        if (day7CntFeatures_ != null) {
+          day7CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day7CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day7CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public Builder clearDay7CntFeatures() {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = null;
+        onChanged();
+      } else {
+        day7CntFeatures_ = null;
+        day7CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay7CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay7CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder() {
+      if (day7CntFeaturesBuilder_ != null) {
+        return day7CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day7CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay7CntFeaturesFieldBuilder() {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay7CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day7CntFeatures_ = null;
+      }
+      return day7CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto month3CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> month3CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     * @return Whether the month3CntFeatures field is set.
+     */
+    public boolean hasMonth3CntFeatures() {
+      return month3CntFeaturesBuilder_ != null || month3CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     * @return The month3CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures() {
+      if (month3CntFeaturesBuilder_ == null) {
+        return month3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+      } else {
+        return month3CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public Builder setMonth3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (month3CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        month3CntFeatures_ = value;
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public Builder setMonth3CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public Builder mergeMonth3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (month3CntFeaturesBuilder_ == null) {
+        if (month3CntFeatures_ != null) {
+          month3CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(month3CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          month3CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public Builder clearMonth3CntFeatures() {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = null;
+        onChanged();
+      } else {
+        month3CntFeatures_ = null;
+        month3CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getMonth3CntFeaturesBuilder() {
+      
+      onChanged();
+      return getMonth3CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder() {
+      if (month3CntFeaturesBuilder_ != null) {
+        return month3CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return month3CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getMonth3CntFeaturesFieldBuilder() {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getMonth3CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        month3CntFeatures_ = null;
+      }
+      return month3CntFeaturesBuilder_;
+    }
+    @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:AdItemFeatureProto)
+  }
+
+  // @@protoc_insertion_point(class_scope:AdItemFeatureProto)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<AdItemFeatureProto>
+      PARSER = new com.google.protobuf.AbstractParser<AdItemFeatureProto>() {
+    @java.lang.Override
+    public AdItemFeatureProto parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new AdItemFeatureProto(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<AdItemFeatureProto> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<AdItemFeatureProto> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 165 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/AdItemFeatureProtoOrBuilder.java

@@ -0,0 +1,165 @@
+// 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 AdItemFeatureProtoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:AdItemFeatureProto)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string adId = 1;</code>
+   * @return The adId.
+   */
+  java.lang.String getAdId();
+  /**
+   * <code>string adId = 1;</code>
+   * @return The bytes for adId.
+   */
+  com.google.protobuf.ByteString
+      getAdIdBytes();
+
+  /**
+   * <code>string adCode = 2;</code>
+   * @return The adCode.
+   */
+  java.lang.String getAdCode();
+  /**
+   * <code>string adCode = 2;</code>
+   * @return The bytes for adCode.
+   */
+  com.google.protobuf.ByteString
+      getAdCodeBytes();
+
+  /**
+   * <code>string advertiserId = 3;</code>
+   * @return The advertiserId.
+   */
+  java.lang.String getAdvertiserId();
+  /**
+   * <code>string advertiserId = 3;</code>
+   * @return The bytes for advertiserId.
+   */
+  com.google.protobuf.ByteString
+      getAdvertiserIdBytes();
+
+  /**
+   * <code>string advertiserCode = 4;</code>
+   * @return The advertiserCode.
+   */
+  java.lang.String getAdvertiserCode();
+  /**
+   * <code>string advertiserCode = 4;</code>
+   * @return The bytes for advertiserCode.
+   */
+  com.google.protobuf.ByteString
+      getAdvertiserCodeBytes();
+
+  /**
+   * <code>string campaignId = 5;</code>
+   * @return The campaignId.
+   */
+  java.lang.String getCampaignId();
+  /**
+   * <code>string campaignId = 5;</code>
+   * @return The bytes for campaignId.
+   */
+  com.google.protobuf.ByteString
+      getCampaignIdBytes();
+
+  /**
+   * <code>string campaignCode = 6;</code>
+   * @return The campaignCode.
+   */
+  java.lang.String getCampaignCode();
+  /**
+   * <code>string campaignCode = 6;</code>
+   * @return The bytes for campaignCode.
+   */
+  com.google.protobuf.ByteString
+      getCampaignCodeBytes();
+
+  /**
+   * <code>string creativeId = 7;</code>
+   * @return The creativeId.
+   */
+  java.lang.String getCreativeId();
+  /**
+   * <code>string creativeId = 7;</code>
+   * @return The bytes for creativeId.
+   */
+  com.google.protobuf.ByteString
+      getCreativeIdBytes();
+
+  /**
+   * <code>string creativeCode = 8;</code>
+   * @return The creativeCode.
+   */
+  java.lang.String getCreativeCode();
+  /**
+   * <code>string creativeCode = 8;</code>
+   * @return The bytes for creativeCode.
+   */
+  com.google.protobuf.ByteString
+      getCreativeCodeBytes();
+
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   * @return Whether the day1CntFeatures field is set.
+   */
+  boolean hasDay1CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   * @return The day1CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 9;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   * @return Whether the day3CntFeatures field is set.
+   */
+  boolean hasDay3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   * @return The day3CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 10;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   * @return Whether the day7CntFeatures field is set.
+   */
+  boolean hasDay7CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   * @return The day7CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 11;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   * @return Whether the month3CntFeatures field is set.
+   */
+  boolean hasMonth3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   * @return The month3CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 12;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder();
+}

+ 161 - 8
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java

@@ -59,6 +59,51 @@ public final class Feature {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_UserActionFeatureProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_UserAdFeatureProto_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_UserAdFeatureProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_AdActionFeatureProto_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_AdActionFeatureProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserAdFeatureRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserAdFeatureRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserAdFeatureResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserAdFeatureResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_AdItemFeatureProto_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_AdItemFeatureProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAdItemFeatureRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAdItemFeatureRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAdItemFeatureResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAdItemFeatureResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAllAdItemFeatureRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAllAdItemFeatureRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAllAdItemFeatureResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -103,14 +148,68 @@ public final class Feature {
       "reProto\022\017\n\007exp_cnt\030\001 \001(\003\022\021\n\tclick_cnt\030\002 " +
       "\001(\003\022\021\n\tshare_cnt\030\003 \001(\003\022\022\n\nreturn_cnt\030\004 \001" +
       "(\003\022\013\n\003ctr\030\005 \001(\001\022\013\n\003str\030\006 \001(\001\022\013\n\003rov\030\007 \001(" +
-      "\0012\350\001\n\016FeatureService\022A\n\016GetUserFeature\022\026" +
-      ".GetUserFeatureRequest\032\027.GetUserFeatureR" +
-      "esponse\022D\n\017GetVideoFeature\022\027.GetVideoFea" +
-      "tureRequest\032\030.GetVideoFeatureResponse\022M\n" +
-      "\022GetAllVideoFeature\022\032.GetAllVideoFeature" +
-      "Request\032\033.GetAllVideoFeatureResponseB8\n1" +
-      "com.tzld.piaoquan.recommend.feature.mode" +
-      "l.featureP\001\210\001\001b\006proto3"
+      "\001\"\351\007\n\022UserAdFeatureProto\022\013\n\003mid\030\001 \001(\t\022\016\n" +
+      "\006gender\030\002 \001(\t\022\021\n\tuser_type\030\003 \001(\t\022\022\n\ngmt_" +
+      "create\030\004 \001(\t\022\014\n\004tags\030\005 \001(\t\022\025\n\rcategory_n" +
+      "ame\030\006 \001(\t\022\r\n\005isvip\030\007 \001(\t\022\020\n\010isreward\030\010 \001" +
+      "(\t\022\014\n\004isad\030\t \001(\t\022\016\n\006isgood\030\n \001(\t\022\031\n\021firs" +
+      "t_up_datetime\030\013 \001(\t\022\030\n\020last_up_datetime\030" +
+      "\014 \001(\t\022 \n\030next_to_last_up_datetime\030\r \001(\t\022" +
+      "\016\n\006videos\030\016 \001(\t\022\r\n\005idols\030\017 \001(\t\022\014\n\004fans\030\020" +
+      " \001(\t\022\022\n\nplay_count\030\021 \001(\t\022\030\n\020play_count_t" +
+      "otal\030\022 \001(\t\022\024\n\014total_reward\030\023 \001(\t\022\031\n\021curr" +
+      "entday_reward\030\024 \001(\t\022\025\n\rreward_person\030\025 \001" +
+      "(\t\022\032\n\022total_reward_times\030\026 \001(\t\022\025\n\rreward" +
+      "_videos\030\027 \001(\t\022\023\n\013total_price\030\030 \001(\t\022\030\n\020cu" +
+      "rrentday_price\030\031 \001(\t\022\031\n\021total_price_time" +
+      "s\030\032 \001(\t\022\032\n\022total_price_person\030\033 \001(\t\022\032\n\022t" +
+      "otal_price_videos\030\034 \001(\t\022\030\n\020cgrain_user_t" +
+      "ype\030\035 \001(\t\022\030\n\020identity_tagname\030\036 \001(\t\022\026\n\016o" +
+      "peration_tags\030\037 \001(\t\022\027\n\017identity_tag_id\030 " +
+      " \001(\t\022\034\n\024identity_create_time\030! \001(\t\022\017\n\007co" +
+      "untry\030\" \001(\t\022\020\n\010province\030# \001(\t\022\014\n\004city\030$ " +
+      "\001(\t\0220\n\021day1_cnt_features\030% \001(\0132\025.AdActio" +
+      "nFeatureProto\0220\n\021day3_cnt_features\030& \001(\013" +
+      "2\025.AdActionFeatureProto\0220\n\021day7_cnt_feat" +
+      "ures\030\' \001(\0132\025.AdActionFeatureProto\0222\n\023mon" +
+      "th3_cnt_features\030( \001(\0132\025.AdActionFeature" +
+      "Proto\"g\n\024AdActionFeatureProto\022\016\n\006adView\030" +
+      "\001 \001(\001\022\017\n\007adClick\030\002 \001(\001\022\024\n\014adConversion\030\003" +
+      " \001(\001\022\013\n\003ctr\030\004 \001(\001\022\013\n\003cvr\030\005 \001(\001\"&\n\027GetUse" +
+      "rAdFeatureRequest\022\013\n\003mid\030\001 \001(\t\"a\n\030GetUse" +
+      "rAdFeatureResponse\022\027\n\006result\030\001 \001(\0132\007.Res" +
+      "ult\022,\n\017user_ad_feature\030\002 \001(\0132\023.UserAdFea" +
+      "tureProto\"\376\002\n\022AdItemFeatureProto\022\014\n\004adId" +
+      "\030\001 \001(\t\022\016\n\006adCode\030\002 \001(\t\022\024\n\014advertiserId\030\003" +
+      " \001(\t\022\026\n\016advertiserCode\030\004 \001(\t\022\022\n\ncampaign" +
+      "Id\030\005 \001(\t\022\024\n\014campaignCode\030\006 \001(\t\022\022\n\ncreati" +
+      "veId\030\007 \001(\t\022\024\n\014creativeCode\030\010 \001(\t\0220\n\021day1" +
+      "_cnt_features\030\t \001(\0132\025.AdActionFeaturePro" +
+      "to\0220\n\021day3_cnt_features\030\n \001(\0132\025.AdAction" +
+      "FeatureProto\0220\n\021day7_cnt_features\030\013 \001(\0132" +
+      "\025.AdActionFeatureProto\0222\n\023month3_cnt_fea" +
+      "tures\030\014 \001(\0132\025.AdActionFeatureProto\"(\n\027Ge" +
+      "tAdItemFeatureRequest\022\r\n\005ad_id\030\001 \001(\t\"a\n\030" +
+      "GetAdItemFeatureResponse\022\027\n\006result\030\001 \001(\013" +
+      "2\007.Result\022,\n\017ad_item_feature\030\002 \001(\0132\023.AdI" +
+      "temFeatureProto\"+\n\032GetAllAdItemFeatureRe" +
+      "quest\022\r\n\005ad_id\030\001 \003(\t\"d\n\033GetAllAdItemFeat" +
+      "ureResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n\017" +
+      "ad_item_feature\030\002 \003(\0132\023.AdItemFeaturePro" +
+      "to2\314\003\n\016FeatureService\022G\n\020GetUserAdFeatur" +
+      "e\022\030.GetUserAdFeatureRequest\032\031.GetUserAdF" +
+      "eatureResponse\022G\n\020GetAdItemFeature\022\030.Get" +
+      "AdItemFeatureRequest\032\031.GetAdItemFeatureR" +
+      "esponse\022P\n\023GETAllAdItemFeature\022\033.GetAllA" +
+      "dItemFeatureRequest\032\034.GetAllAdItemFeatur" +
+      "eResponse\022A\n\016GetUserFeature\022\026.GetUserFea" +
+      "tureRequest\032\027.GetUserFeatureResponse\022D\n\017" +
+      "GetVideoFeature\022\027.GetVideoFeatureRequest" +
+      "\032\030.GetVideoFeatureResponse\022M\n\022GetAllVide" +
+      "oFeature\022\032.GetAllVideoFeatureRequest\032\033.G" +
+      "etAllVideoFeatureResponseB8\n1com.tzld.pi" +
+      "aoquan.recommend.feature.model.featureP\001" +
+      "\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -172,6 +271,60 @@ public final class Feature {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_UserActionFeatureProto_descriptor,
         new java.lang.String[] { "ExpCnt", "ClickCnt", "ShareCnt", "ReturnCnt", "Ctr", "Str", "Rov", });
+    internal_static_UserAdFeatureProto_descriptor =
+      getDescriptor().getMessageTypes().get(9);
+    internal_static_UserAdFeatureProto_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_UserAdFeatureProto_descriptor,
+        new java.lang.String[] { "Mid", "Gender", "UserType", "GmtCreate", "Tags", "CategoryName", "Isvip", "Isreward", "Isad", "Isgood", "FirstUpDatetime", "LastUpDatetime", "NextToLastUpDatetime", "Videos", "Idols", "Fans", "PlayCount", "PlayCountTotal", "TotalReward", "CurrentdayReward", "RewardPerson", "TotalRewardTimes", "RewardVideos", "TotalPrice", "CurrentdayPrice", "TotalPriceTimes", "TotalPricePerson", "TotalPriceVideos", "CgrainUserType", "IdentityTagname", "OperationTags", "IdentityTagId", "IdentityCreateTime", "Country", "Province", "City", "Day1CntFeatures", "Day3CntFeatures", "Day7CntFeatures", "Month3CntFeatures", });
+    internal_static_AdActionFeatureProto_descriptor =
+      getDescriptor().getMessageTypes().get(10);
+    internal_static_AdActionFeatureProto_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_AdActionFeatureProto_descriptor,
+        new java.lang.String[] { "AdView", "AdClick", "AdConversion", "Ctr", "Cvr", });
+    internal_static_GetUserAdFeatureRequest_descriptor =
+      getDescriptor().getMessageTypes().get(11);
+    internal_static_GetUserAdFeatureRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserAdFeatureRequest_descriptor,
+        new java.lang.String[] { "Mid", });
+    internal_static_GetUserAdFeatureResponse_descriptor =
+      getDescriptor().getMessageTypes().get(12);
+    internal_static_GetUserAdFeatureResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserAdFeatureResponse_descriptor,
+        new java.lang.String[] { "Result", "UserAdFeature", });
+    internal_static_AdItemFeatureProto_descriptor =
+      getDescriptor().getMessageTypes().get(13);
+    internal_static_AdItemFeatureProto_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_AdItemFeatureProto_descriptor,
+        new java.lang.String[] { "AdId", "AdCode", "AdvertiserId", "AdvertiserCode", "CampaignId", "CampaignCode", "CreativeId", "CreativeCode", "Day1CntFeatures", "Day3CntFeatures", "Day7CntFeatures", "Month3CntFeatures", });
+    internal_static_GetAdItemFeatureRequest_descriptor =
+      getDescriptor().getMessageTypes().get(14);
+    internal_static_GetAdItemFeatureRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAdItemFeatureRequest_descriptor,
+        new java.lang.String[] { "AdId", });
+    internal_static_GetAdItemFeatureResponse_descriptor =
+      getDescriptor().getMessageTypes().get(15);
+    internal_static_GetAdItemFeatureResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAdItemFeatureResponse_descriptor,
+        new java.lang.String[] { "Result", "AdItemFeature", });
+    internal_static_GetAllAdItemFeatureRequest_descriptor =
+      getDescriptor().getMessageTypes().get(16);
+    internal_static_GetAllAdItemFeatureRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAllAdItemFeatureRequest_descriptor,
+        new java.lang.String[] { "AdId", });
+    internal_static_GetAllAdItemFeatureResponse_descriptor =
+      getDescriptor().getMessageTypes().get(17);
+    internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAllAdItemFeatureResponse_descriptor,
+        new java.lang.String[] { "Result", "AdItemFeature", });
     com.google.protobuf.AnyProto.getDescriptor();
     com.tzld.piaoquan.recommend.feature.model.common.Common.getDescriptor();
   }

+ 231 - 18
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java

@@ -11,6 +11,30 @@ public  abstract class FeatureService
   protected FeatureService() {}
 
   public interface Interface {
+    /**
+     * <code>rpc GetUserAdFeature(.GetUserAdFeatureRequest) returns (.GetUserAdFeatureResponse);</code>
+     */
+    public abstract void getUserAdFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> done);
+
+    /**
+     * <code>rpc GetAdItemFeature(.GetAdItemFeatureRequest) returns (.GetAdItemFeatureResponse);</code>
+     */
+    public abstract void getAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> done);
+
+    /**
+     * <code>rpc GETAllAdItemFeature(.GetAllAdItemFeatureRequest) returns (.GetAllAdItemFeatureResponse);</code>
+     */
+    public abstract void gETAllAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> done);
+
     /**
      * <code>rpc GetUserFeature(.GetUserFeatureRequest) returns (.GetUserFeatureResponse);</code>
      */
@@ -40,6 +64,30 @@ public  abstract class FeatureService
   public static com.google.protobuf.Service newReflectiveService(
       final Interface impl) {
     return new FeatureService() {
+      @java.lang.Override
+      public  void getUserAdFeature(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> done) {
+        impl.getUserAdFeature(controller, request, done);
+      }
+
+      @java.lang.Override
+      public  void getAdItemFeature(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> done) {
+        impl.getAdItemFeature(controller, request, done);
+      }
+
+      @java.lang.Override
+      public  void gETAllAdItemFeature(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> done) {
+        impl.gETAllAdItemFeature(controller, request, done);
+      }
+
       @java.lang.Override
       public  void getUserFeature(
           com.google.protobuf.RpcController controller,
@@ -87,10 +135,16 @@ public  abstract class FeatureService
         }
         switch(method.getIndex()) {
           case 0:
-            return impl.getUserFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest)request);
+            return impl.getUserAdFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest)request);
           case 1:
-            return impl.getVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest)request);
+            return impl.getAdItemFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest)request);
           case 2:
+            return impl.gETAllAdItemFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest)request);
+          case 3:
+            return impl.getUserFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest)request);
+          case 4:
+            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);
           default:
             throw new java.lang.AssertionError("Can't get here.");
@@ -107,10 +161,16 @@ public  abstract class FeatureService
         }
         switch(method.getIndex()) {
           case 0:
-            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.getDefaultInstance();
           case 1:
-            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.getDefaultInstance();
           case 2:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.getDefaultInstance();
+          case 3:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
+          case 4:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+          case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
@@ -127,10 +187,16 @@ public  abstract class FeatureService
         }
         switch(method.getIndex()) {
           case 0:
-            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance();
           case 1:
-            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance();
           case 2:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance();
+          case 3:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
+          case 4:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+          case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
@@ -140,6 +206,30 @@ public  abstract class FeatureService
     };
   }
 
+  /**
+   * <code>rpc GetUserAdFeature(.GetUserAdFeatureRequest) returns (.GetUserAdFeatureResponse);</code>
+   */
+  public abstract void getUserAdFeature(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> done);
+
+  /**
+   * <code>rpc GetAdItemFeature(.GetAdItemFeatureRequest) returns (.GetAdItemFeatureResponse);</code>
+   */
+  public abstract void getAdItemFeature(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> done);
+
+  /**
+   * <code>rpc GETAllAdItemFeature(.GetAllAdItemFeatureRequest) returns (.GetAllAdItemFeatureResponse);</code>
+   */
+  public abstract void gETAllAdItemFeature(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> done);
+
   /**
    * <code>rpc GetUserFeature(.GetUserFeatureRequest) returns (.GetUserFeatureResponse);</code>
    */
@@ -187,16 +277,31 @@ public  abstract class FeatureService
     }
     switch(method.getIndex()) {
       case 0:
+        this.getUserAdFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse>specializeCallback(
+            done));
+        return;
+      case 1:
+        this.getAdItemFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse>specializeCallback(
+            done));
+        return;
+      case 2:
+        this.gETAllAdItemFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse>specializeCallback(
+            done));
+        return;
+      case 3:
         this.getUserFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest)request,
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse>specializeCallback(
             done));
         return;
-      case 1:
+      case 4:
         this.getVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest)request,
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse>specializeCallback(
             done));
         return;
-      case 2:
+      case 5:
         this.getAllVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)request,
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>specializeCallback(
             done));
@@ -216,10 +321,16 @@ public  abstract class FeatureService
     }
     switch(method.getIndex()) {
       case 0:
-        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.getDefaultInstance();
       case 1:
-        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.getDefaultInstance();
       case 2:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.getDefaultInstance();
+      case 3:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
+      case 4:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+      case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
@@ -236,10 +347,16 @@ public  abstract class FeatureService
     }
     switch(method.getIndex()) {
       case 0:
-        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance();
       case 1:
-        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance();
       case 2:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance();
+      case 3:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
+      case 4:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+      case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
@@ -262,12 +379,57 @@ public  abstract class FeatureService
       return channel;
     }
 
+    public  void getUserAdFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(0),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance()));
+    }
+
+    public  void getAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(1),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance()));
+    }
+
+    public  void gETAllAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(2),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance()));
+    }
+
     public  void getUserFeature(
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request,
         com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse> done) {
       channel.callMethod(
-        getDescriptor().getMethods().get(0),
+        getDescriptor().getMethods().get(3),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance(),
@@ -282,7 +444,7 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest request,
         com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse> done) {
       channel.callMethod(
-        getDescriptor().getMethods().get(1),
+        getDescriptor().getMethods().get(4),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance(),
@@ -297,7 +459,7 @@ 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) {
       channel.callMethod(
-        getDescriptor().getMethods().get(2),
+        getDescriptor().getMethods().get(5),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance(),
@@ -314,6 +476,21 @@ public  abstract class FeatureService
   }
 
   public interface BlockingInterface {
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getUserAdFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request)
+        throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request)
+        throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse gETAllAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request)
+        throws com.google.protobuf.ServiceException;
+
     public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse getUserFeature(
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request)
@@ -337,12 +514,48 @@ public  abstract class FeatureService
 
     private final com.google.protobuf.BlockingRpcChannel channel;
 
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getUserAdFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(0),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance());
+    }
+
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(1),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance());
+    }
+
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse gETAllAdItemFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(2),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance());
+    }
+
+
     public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse getUserFeature(
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request)
         throws com.google.protobuf.ServiceException {
       return (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse) channel.callBlockingMethod(
-        getDescriptor().getMethods().get(0),
+        getDescriptor().getMethods().get(3),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance());
@@ -354,7 +567,7 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest request)
         throws com.google.protobuf.ServiceException {
       return (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse) channel.callBlockingMethod(
-        getDescriptor().getMethods().get(1),
+        getDescriptor().getMethods().get(4),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance());
@@ -366,7 +579,7 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request)
         throws com.google.protobuf.ServiceException {
       return (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse) channel.callBlockingMethod(
-        getDescriptor().getMethods().get(2),
+        getDescriptor().getMethods().get(5),
         controller,
         request,
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance());

+ 225 - 3
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java

@@ -27,6 +27,99 @@ public final class FeatureServiceGrpc {
   public static final String SERVICE_NAME = "FeatureService";
 
   // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> getGetUserAdFeatureMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetUserAdFeature",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> getGetUserAdFeatureMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> getGetUserAdFeatureMethod;
+    if ((getGetUserAdFeatureMethod = FeatureServiceGrpc.getGetUserAdFeatureMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetUserAdFeatureMethod = FeatureServiceGrpc.getGetUserAdFeatureMethod) == null) {
+          FeatureServiceGrpc.getGetUserAdFeatureMethod = getGetUserAdFeatureMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetUserAdFeature"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetUserAdFeature"))
+              .build();
+        }
+      }
+    }
+    return getGetUserAdFeatureMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> getGetAdItemFeatureMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetAdItemFeature",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> getGetAdItemFeatureMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> getGetAdItemFeatureMethod;
+    if ((getGetAdItemFeatureMethod = FeatureServiceGrpc.getGetAdItemFeatureMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetAdItemFeatureMethod = FeatureServiceGrpc.getGetAdItemFeatureMethod) == null) {
+          FeatureServiceGrpc.getGetAdItemFeatureMethod = getGetAdItemFeatureMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetAdItemFeature"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetAdItemFeature"))
+              .build();
+        }
+      }
+    }
+    return getGetAdItemFeatureMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> getGETAllAdItemFeatureMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GETAllAdItemFeature",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> getGETAllAdItemFeatureMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> getGETAllAdItemFeatureMethod;
+    if ((getGETAllAdItemFeatureMethod = FeatureServiceGrpc.getGETAllAdItemFeatureMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGETAllAdItemFeatureMethod = FeatureServiceGrpc.getGETAllAdItemFeatureMethod) == null) {
+          FeatureServiceGrpc.getGETAllAdItemFeatureMethod = getGETAllAdItemFeatureMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GETAllAdItemFeature"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GETAllAdItemFeature"))
+              .build();
+        }
+      }
+    }
+    return getGETAllAdItemFeatureMethod;
+  }
+
   private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest,
       com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse> getGetUserFeatureMethod;
 
@@ -168,6 +261,27 @@ public final class FeatureServiceGrpc {
    */
   public static abstract class FeatureServiceImplBase implements io.grpc.BindableService {
 
+    /**
+     */
+    public void getUserAdFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetUserAdFeatureMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetAdItemFeatureMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void gETAllAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGETAllAdItemFeatureMethod(), responseObserver);
+    }
+
     /**
      */
     public void getUserFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request,
@@ -191,6 +305,27 @@ public final class FeatureServiceGrpc {
 
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+          .addMethod(
+            getGetUserAdFeatureMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse>(
+                  this, METHODID_GET_USER_AD_FEATURE)))
+          .addMethod(
+            getGetAdItemFeatureMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse>(
+                  this, METHODID_GET_AD_ITEM_FEATURE)))
+          .addMethod(
+            getGETAllAdItemFeatureMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse>(
+                  this, METHODID_GETALL_AD_ITEM_FEATURE)))
           .addMethod(
             getGetUserFeatureMethod(),
             asyncUnaryCall(
@@ -230,6 +365,30 @@ public final class FeatureServiceGrpc {
       return new FeatureServiceStub(channel, callOptions);
     }
 
+    /**
+     */
+    public void getUserAdFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetUserAdFeatureMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetAdItemFeatureMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void gETAllAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGETAllAdItemFeatureMethod(), getCallOptions()), request, responseObserver);
+    }
+
     /**
      */
     public void getUserFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request,
@@ -269,6 +428,27 @@ public final class FeatureServiceGrpc {
       return new FeatureServiceBlockingStub(channel, callOptions);
     }
 
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getUserAdFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetUserAdFeatureMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetAdItemFeatureMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse gETAllAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGETAllAdItemFeatureMethod(), getCallOptions(), request);
+    }
+
     /**
      */
     public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse getUserFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest request) {
@@ -305,6 +485,30 @@ public final class FeatureServiceGrpc {
       return new FeatureServiceFutureStub(channel, callOptions);
     }
 
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse> getUserAdFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetUserAdFeatureMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse> getAdItemFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetAdItemFeatureMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse> gETAllAdItemFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGETAllAdItemFeatureMethod(), getCallOptions()), request);
+    }
+
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse> getUserFeature(
@@ -330,9 +534,12 @@ public final class FeatureServiceGrpc {
     }
   }
 
-  private static final int METHODID_GET_USER_FEATURE = 0;
-  private static final int METHODID_GET_VIDEO_FEATURE = 1;
-  private static final int METHODID_GET_ALL_VIDEO_FEATURE = 2;
+  private static final int METHODID_GET_USER_AD_FEATURE = 0;
+  private static final int METHODID_GET_AD_ITEM_FEATURE = 1;
+  private static final int METHODID_GETALL_AD_ITEM_FEATURE = 2;
+  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 class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -351,6 +558,18 @@ public final class FeatureServiceGrpc {
     @java.lang.SuppressWarnings("unchecked")
     public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
       switch (methodId) {
+        case METHODID_GET_USER_AD_FEATURE:
+          serviceImpl.getUserAdFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse>) responseObserver);
+          break;
+        case METHODID_GET_AD_ITEM_FEATURE:
+          serviceImpl.getAdItemFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse>) responseObserver);
+          break;
+        case METHODID_GETALL_AD_ITEM_FEATURE:
+          serviceImpl.gETAllAdItemFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse>) responseObserver);
+          break;
         case METHODID_GET_USER_FEATURE:
           serviceImpl.getUserFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest) request,
               (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse>) responseObserver);
@@ -424,6 +643,9 @@ public final class FeatureServiceGrpc {
         if (result == null) {
           serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
               .setSchemaDescriptor(new FeatureServiceFileDescriptorSupplier())
+              .addMethod(getGetUserAdFeatureMethod())
+              .addMethod(getGetAdItemFeatureMethod())
+              .addMethod(getGETAllAdItemFeatureMethod())
               .addMethod(getGetUserFeatureMethod())
               .addMethod(getGetVideoFeatureMethod())
               .addMethod(getGetAllVideoFeatureMethod())

+ 557 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureRequest.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 GetAdItemFeatureRequest}
+ */
+public final class GetAdItemFeatureRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAdItemFeatureRequest)
+    GetAdItemFeatureRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAdItemFeatureRequest.newBuilder() to construct.
+  private GetAdItemFeatureRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAdItemFeatureRequest() {
+    adId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAdItemFeatureRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAdItemFeatureRequest(
+      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();
+
+            adId_ = 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_GetAdItemFeatureRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.Builder.class);
+  }
+
+  public static final int AD_ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object adId_;
+  /**
+   * <code>string ad_id = 1;</code>
+   * @return The adId.
+   */
+  @java.lang.Override
+  public java.lang.String getAdId() {
+    java.lang.Object ref = adId_;
+    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();
+      adId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string ad_id = 1;</code>
+   * @return The bytes for adId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAdIdBytes() {
+    java.lang.Object ref = adId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      adId_ = 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 (!getAdIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, adId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getAdIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, adId_);
+    }
+    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.GetAdItemFeatureRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest) obj;
+
+    if (!getAdId()
+        .equals(other.getAdId())) 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) + AD_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getAdId().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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.GetAdItemFeatureRequest 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 GetAdItemFeatureRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAdItemFeatureRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.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();
+      adId_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest(this);
+      result.adId_ = adId_;
+      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.GetAdItemFeatureRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest.getDefaultInstance()) return this;
+      if (!other.getAdId().isEmpty()) {
+        adId_ = other.adId_;
+        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.GetAdItemFeatureRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object adId_ = "";
+    /**
+     * <code>string ad_id = 1;</code>
+     * @return The adId.
+     */
+    public java.lang.String getAdId() {
+      java.lang.Object ref = adId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        adId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string ad_id = 1;</code>
+     * @return The bytes for adId.
+     */
+    public com.google.protobuf.ByteString
+        getAdIdBytes() {
+      java.lang.Object ref = adId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        adId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string ad_id = 1;</code>
+     * @param value The adId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      adId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ad_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdId() {
+      
+      adId_ = getDefaultInstance().getAdId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ad_id = 1;</code>
+     * @param value The bytes for adId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      adId_ = 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:GetAdItemFeatureRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAdItemFeatureRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAdItemFeatureRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetAdItemFeatureRequest>() {
+    @java.lang.Override
+    public GetAdItemFeatureRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAdItemFeatureRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAdItemFeatureRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAdItemFeatureRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 21 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureRequestOrBuilder.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 GetAdItemFeatureRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAdItemFeatureRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string ad_id = 1;</code>
+   * @return The adId.
+   */
+  java.lang.String getAdId();
+  /**
+   * <code>string ad_id = 1;</code>
+   * @return The bytes for adId.
+   */
+  com.google.protobuf.ByteString
+      getAdIdBytes();
+}

+ 795 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureResponse.java

@@ -0,0 +1,795 @@
+// 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 GetAdItemFeatureResponse}
+ */
+public final class GetAdItemFeatureResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAdItemFeatureResponse)
+    GetAdItemFeatureResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAdItemFeatureResponse.newBuilder() to construct.
+  private GetAdItemFeatureResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAdItemFeatureResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAdItemFeatureResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAdItemFeatureResponse(
+      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: {
+            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: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder subBuilder = null;
+            if (adItemFeature_ != null) {
+              subBuilder = adItemFeature_.toBuilder();
+            }
+            adItemFeature_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(adItemFeature_);
+              adItemFeature_ = subBuilder.buildPartial();
+            }
+
+            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_GetAdItemFeatureResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.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 AD_ITEM_FEATURE_FIELD_NUMBER = 2;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto adItemFeature_;
+  /**
+   * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+   * @return Whether the adItemFeature field is set.
+   */
+  @java.lang.Override
+  public boolean hasAdItemFeature() {
+    return adItemFeature_ != null;
+  }
+  /**
+   * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+   * @return The adItemFeature.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature() {
+    return adItemFeature_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance() : adItemFeature_;
+  }
+  /**
+   * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder() {
+    return getAdItemFeature();
+  }
+
+  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());
+    }
+    if (adItemFeature_ != null) {
+      output.writeMessage(2, getAdItemFeature());
+    }
+    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());
+    }
+    if (adItemFeature_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getAdItemFeature());
+    }
+    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.GetAdItemFeatureResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (hasAdItemFeature() != other.hasAdItemFeature()) return false;
+    if (hasAdItemFeature()) {
+      if (!getAdItemFeature()
+          .equals(other.getAdItemFeature())) 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 (hasAdItemFeature()) {
+      hash = (37 * hash) + AD_ITEM_FEATURE_FIELD_NUMBER;
+      hash = (53 * hash) + getAdItemFeature().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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.GetAdItemFeatureResponse 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 GetAdItemFeatureResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAdItemFeatureResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.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;
+      }
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeature_ = null;
+      } else {
+        adItemFeature_ = null;
+        adItemFeatureBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAdItemFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse(this);
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (adItemFeatureBuilder_ == null) {
+        result.adItemFeature_ = adItemFeature_;
+      } else {
+        result.adItemFeature_ = adItemFeatureBuilder_.build();
+      }
+      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.GetAdItemFeatureResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (other.hasAdItemFeature()) {
+        mergeAdItemFeature(other.getAdItemFeature());
+      }
+      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.GetAdItemFeatureResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    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.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto adItemFeature_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> adItemFeatureBuilder_;
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     * @return Whether the adItemFeature field is set.
+     */
+    public boolean hasAdItemFeature() {
+      return adItemFeatureBuilder_ != null || adItemFeature_ != null;
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     * @return The adItemFeature.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature() {
+      if (adItemFeatureBuilder_ == null) {
+        return adItemFeature_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance() : adItemFeature_;
+      } else {
+        return adItemFeatureBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder setAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto value) {
+      if (adItemFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        adItemFeature_ = value;
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder setAdItemFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder builderForValue) {
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeature_ = builderForValue.build();
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder mergeAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto value) {
+      if (adItemFeatureBuilder_ == null) {
+        if (adItemFeature_ != null) {
+          adItemFeature_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.newBuilder(adItemFeature_).mergeFrom(value).buildPartial();
+        } else {
+          adItemFeature_ = value;
+        }
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder clearAdItemFeature() {
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeature_ = null;
+        onChanged();
+      } else {
+        adItemFeature_ = null;
+        adItemFeatureBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder getAdItemFeatureBuilder() {
+      
+      onChanged();
+      return getAdItemFeatureFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder() {
+      if (adItemFeatureBuilder_ != null) {
+        return adItemFeatureBuilder_.getMessageOrBuilder();
+      } else {
+        return adItemFeature_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance() : adItemFeature_;
+      }
+    }
+    /**
+     * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> 
+        getAdItemFeatureFieldBuilder() {
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeatureBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder>(
+                getAdItemFeature(),
+                getParentForChildren(),
+                isClean());
+        adItemFeature_ = null;
+      }
+      return adItemFeatureBuilder_;
+    }
+    @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:GetAdItemFeatureResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAdItemFeatureResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAdItemFeatureResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetAdItemFeatureResponse>() {
+    @java.lang.Override
+    public GetAdItemFeatureResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAdItemFeatureResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAdItemFeatureResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAdItemFeatureResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAdItemFeatureResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 39 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAdItemFeatureResponseOrBuilder.java

@@ -0,0 +1,39 @@
+// 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 GetAdItemFeatureResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAdItemFeatureResponse)
+    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>.AdItemFeatureProto ad_item_feature = 2;</code>
+   * @return Whether the adItemFeature field is set.
+   */
+  boolean hasAdItemFeature();
+  /**
+   * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+   * @return The adItemFeature.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature();
+  /**
+   * <code>.AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder();
+}

+ 614 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureRequest.java

@@ -0,0 +1,614 @@
+// 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 GetAllAdItemFeatureRequest}
+ */
+public final class GetAllAdItemFeatureRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAllAdItemFeatureRequest)
+    GetAllAdItemFeatureRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAllAdItemFeatureRequest.newBuilder() to construct.
+  private GetAllAdItemFeatureRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAllAdItemFeatureRequest() {
+    adId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAllAdItemFeatureRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAllAdItemFeatureRequest(
+      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: {
+            java.lang.String s = input.readStringRequireUtf8();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              adId_ = new com.google.protobuf.LazyStringArrayList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            adId_.add(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 {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        adId_ = adId_.getUnmodifiableView();
+      }
+      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_GetAllAdItemFeatureRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.Builder.class);
+  }
+
+  public static final int AD_ID_FIELD_NUMBER = 1;
+  private com.google.protobuf.LazyStringList adId_;
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @return A list containing the adId.
+   */
+  public com.google.protobuf.ProtocolStringList
+      getAdIdList() {
+    return adId_;
+  }
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @return The count of adId.
+   */
+  public int getAdIdCount() {
+    return adId_.size();
+  }
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @param index The index of the element to return.
+   * @return The adId at the given index.
+   */
+  public java.lang.String getAdId(int index) {
+    return adId_.get(index);
+  }
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the adId at the given index.
+   */
+  public com.google.protobuf.ByteString
+      getAdIdBytes(int index) {
+    return adId_.getByteString(index);
+  }
+
+  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 {
+    for (int i = 0; i < adId_.size(); i++) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, adId_.getRaw(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    {
+      int dataSize = 0;
+      for (int i = 0; i < adId_.size(); i++) {
+        dataSize += computeStringSizeNoTag(adId_.getRaw(i));
+      }
+      size += dataSize;
+      size += 1 * getAdIdList().size();
+    }
+    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.GetAllAdItemFeatureRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest) obj;
+
+    if (!getAdIdList()
+        .equals(other.getAdIdList())) 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 (getAdIdCount() > 0) {
+      hash = (37 * hash) + AD_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getAdIdList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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.GetAllAdItemFeatureRequest 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 GetAllAdItemFeatureRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAllAdItemFeatureRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.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();
+      adId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        adId_ = adId_.getUnmodifiableView();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.adId_ = adId_;
+      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.GetAllAdItemFeatureRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest.getDefaultInstance()) return this;
+      if (!other.adId_.isEmpty()) {
+        if (adId_.isEmpty()) {
+          adId_ = other.adId_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureAdIdIsMutable();
+          adId_.addAll(other.adId_);
+        }
+        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.GetAllAdItemFeatureRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.google.protobuf.LazyStringList adId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    private void ensureAdIdIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        adId_ = new com.google.protobuf.LazyStringArrayList(adId_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @return A list containing the adId.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getAdIdList() {
+      return adId_.getUnmodifiableView();
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @return The count of adId.
+     */
+    public int getAdIdCount() {
+      return adId_.size();
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param index The index of the element to return.
+     * @return The adId at the given index.
+     */
+    public java.lang.String getAdId(int index) {
+      return adId_.get(index);
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the adId at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getAdIdBytes(int index) {
+      return adId_.getByteString(index);
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The adId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAdId(
+        int index, java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureAdIdIsMutable();
+      adId_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param value The adId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAdId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureAdIdIsMutable();
+      adId_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param values The adId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllAdId(
+        java.lang.Iterable<java.lang.String> values) {
+      ensureAdIdIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, adId_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAdId() {
+      adId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string ad_id = 1;</code>
+     * @param value The bytes of the adId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAdIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      ensureAdIdIsMutable();
+      adId_.add(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:GetAllAdItemFeatureRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAllAdItemFeatureRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAllAdItemFeatureRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetAllAdItemFeatureRequest>() {
+    @java.lang.Override
+    public GetAllAdItemFeatureRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAllAdItemFeatureRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAllAdItemFeatureRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAllAdItemFeatureRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 34 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureRequestOrBuilder.java

@@ -0,0 +1,34 @@
+// 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 GetAllAdItemFeatureRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAllAdItemFeatureRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @return A list containing the adId.
+   */
+  java.util.List<java.lang.String>
+      getAdIdList();
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @return The count of adId.
+   */
+  int getAdIdCount();
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @param index The index of the element to return.
+   * @return The adId at the given index.
+   */
+  java.lang.String getAdId(int index);
+  /**
+   * <code>repeated string ad_id = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the adId at the given index.
+   */
+  com.google.protobuf.ByteString
+      getAdIdBytes(int index);
+}

+ 958 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureResponse.java

@@ -0,0 +1,958 @@
+// 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 GetAllAdItemFeatureResponse}
+ */
+public final class GetAllAdItemFeatureResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAllAdItemFeatureResponse)
+    GetAllAdItemFeatureResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAllAdItemFeatureResponse.newBuilder() to construct.
+  private GetAllAdItemFeatureResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAllAdItemFeatureResponse() {
+    adItemFeature_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAllAdItemFeatureResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAllAdItemFeatureResponse(
+      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)) {
+              adItemFeature_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            adItemFeature_.add(
+                input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.parser(), extensionRegistry));
+            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 {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        adItemFeature_ = java.util.Collections.unmodifiableList(adItemFeature_);
+      }
+      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_GetAllAdItemFeatureResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.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 AD_ITEM_FEATURE_FIELD_NUMBER = 2;
+  private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> adItemFeature_;
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> getAdItemFeatureList() {
+    return adItemFeature_;
+  }
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> 
+      getAdItemFeatureOrBuilderList() {
+    return adItemFeature_;
+  }
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public int getAdItemFeatureCount() {
+    return adItemFeature_.size();
+  }
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature(int index) {
+    return adItemFeature_.get(index);
+  }
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder(
+      int index) {
+    return adItemFeature_.get(index);
+  }
+
+  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());
+    }
+    for (int i = 0; i < adItemFeature_.size(); i++) {
+      output.writeMessage(2, adItemFeature_.get(i));
+    }
+    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 (int i = 0; i < adItemFeature_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, adItemFeature_.get(i));
+    }
+    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.GetAllAdItemFeatureResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!getAdItemFeatureList()
+        .equals(other.getAdItemFeatureList())) 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 (getAdItemFeatureCount() > 0) {
+      hash = (37 * hash) + AD_ITEM_FEATURE_FIELD_NUMBER;
+      hash = (53 * hash) + getAdItemFeatureList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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.GetAllAdItemFeatureResponse 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 GetAllAdItemFeatureResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAllAdItemFeatureResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getAdItemFeatureFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        adItemFeatureBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllAdItemFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (adItemFeatureBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          adItemFeature_ = java.util.Collections.unmodifiableList(adItemFeature_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.adItemFeature_ = adItemFeature_;
+      } else {
+        result.adItemFeature_ = adItemFeatureBuilder_.build();
+      }
+      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.GetAllAdItemFeatureResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (adItemFeatureBuilder_ == null) {
+        if (!other.adItemFeature_.isEmpty()) {
+          if (adItemFeature_.isEmpty()) {
+            adItemFeature_ = other.adItemFeature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureAdItemFeatureIsMutable();
+            adItemFeature_.addAll(other.adItemFeature_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.adItemFeature_.isEmpty()) {
+          if (adItemFeatureBuilder_.isEmpty()) {
+            adItemFeatureBuilder_.dispose();
+            adItemFeatureBuilder_ = null;
+            adItemFeature_ = other.adItemFeature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            adItemFeatureBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getAdItemFeatureFieldBuilder() : null;
+          } else {
+            adItemFeatureBuilder_.addAllMessages(other.adItemFeature_);
+          }
+        }
+      }
+      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.GetAllAdItemFeatureResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse) 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 java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> adItemFeature_ =
+      java.util.Collections.emptyList();
+    private void ensureAdItemFeatureIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        adItemFeature_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto>(adItemFeature_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> adItemFeatureBuilder_;
+
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> getAdItemFeatureList() {
+      if (adItemFeatureBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(adItemFeature_);
+      } else {
+        return adItemFeatureBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public int getAdItemFeatureCount() {
+      if (adItemFeatureBuilder_ == null) {
+        return adItemFeature_.size();
+      } else {
+        return adItemFeatureBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature(int index) {
+      if (adItemFeatureBuilder_ == null) {
+        return adItemFeature_.get(index);
+      } else {
+        return adItemFeatureBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder setAdItemFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto value) {
+      if (adItemFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.set(index, value);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder setAdItemFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder builderForValue) {
+      if (adItemFeatureBuilder_ == null) {
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder addAdItemFeature(com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto value) {
+      if (adItemFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.add(value);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder addAdItemFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto value) {
+      if (adItemFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.add(index, value);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder addAdItemFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder builderForValue) {
+      if (adItemFeatureBuilder_ == null) {
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.add(builderForValue.build());
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder addAdItemFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder builderForValue) {
+      if (adItemFeatureBuilder_ == null) {
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder addAllAdItemFeature(
+        java.lang.Iterable<? extends com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> values) {
+      if (adItemFeatureBuilder_ == null) {
+        ensureAdItemFeatureIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, adItemFeature_);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder clearAdItemFeature() {
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public Builder removeAdItemFeature(int index) {
+      if (adItemFeatureBuilder_ == null) {
+        ensureAdItemFeatureIsMutable();
+        adItemFeature_.remove(index);
+        onChanged();
+      } else {
+        adItemFeatureBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder getAdItemFeatureBuilder(
+        int index) {
+      return getAdItemFeatureFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder(
+        int index) {
+      if (adItemFeatureBuilder_ == null) {
+        return adItemFeature_.get(index);  } else {
+        return adItemFeatureBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> 
+         getAdItemFeatureOrBuilderList() {
+      if (adItemFeatureBuilder_ != null) {
+        return adItemFeatureBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(adItemFeature_);
+      }
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder addAdItemFeatureBuilder() {
+      return getAdItemFeatureFieldBuilder().addBuilder(
+          com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder addAdItemFeatureBuilder(
+        int index) {
+      return getAdItemFeatureFieldBuilder().addBuilder(
+          index, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder> 
+         getAdItemFeatureBuilderList() {
+      return getAdItemFeatureFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> 
+        getAdItemFeatureFieldBuilder() {
+      if (adItemFeatureBuilder_ == null) {
+        adItemFeatureBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder>(
+                adItemFeature_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        adItemFeature_ = null;
+      }
+      return adItemFeatureBuilder_;
+    }
+    @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:GetAllAdItemFeatureResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAllAdItemFeatureResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAllAdItemFeatureResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetAllAdItemFeatureResponse>() {
+    @java.lang.Override
+    public GetAllAdItemFeatureResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAllAdItemFeatureResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAllAdItemFeatureResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAllAdItemFeatureResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAllAdItemFeatureResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllAdItemFeatureResponseOrBuilder.java

@@ -0,0 +1,48 @@
+// 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 GetAllAdItemFeatureResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAllAdItemFeatureResponse)
+    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>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto> 
+      getAdItemFeatureList();
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProto getAdItemFeature(int index);
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  int getAdItemFeatureCount();
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder> 
+      getAdItemFeatureOrBuilderList();
+  /**
+   * <code>repeated .AdItemFeatureProto ad_item_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdItemFeatureProtoOrBuilder getAdItemFeatureOrBuilder(
+      int index);
+}

+ 557 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureRequest.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 GetUserAdFeatureRequest}
+ */
+public final class GetUserAdFeatureRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserAdFeatureRequest)
+    GetUserAdFeatureRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserAdFeatureRequest.newBuilder() to construct.
+  private GetUserAdFeatureRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserAdFeatureRequest() {
+    mid_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserAdFeatureRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserAdFeatureRequest(
+      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_GetUserAdFeatureRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.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.GetUserAdFeatureRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest) 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.GetUserAdFeatureRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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.GetUserAdFeatureRequest 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 GetUserAdFeatureRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserAdFeatureRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.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_GetUserAdFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest(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.GetUserAdFeatureRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest.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.GetUserAdFeatureRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest) 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:GetUserAdFeatureRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserAdFeatureRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserAdFeatureRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserAdFeatureRequest>() {
+    @java.lang.Override
+    public GetUserAdFeatureRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserAdFeatureRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserAdFeatureRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserAdFeatureRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 21 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureRequestOrBuilder.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 GetUserAdFeatureRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserAdFeatureRequest)
+    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();
+}

+ 795 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureResponse.java

@@ -0,0 +1,795 @@
+// 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 GetUserAdFeatureResponse}
+ */
+public final class GetUserAdFeatureResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserAdFeatureResponse)
+    GetUserAdFeatureResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserAdFeatureResponse.newBuilder() to construct.
+  private GetUserAdFeatureResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserAdFeatureResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserAdFeatureResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserAdFeatureResponse(
+      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: {
+            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: {
+            com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder subBuilder = null;
+            if (userAdFeature_ != null) {
+              subBuilder = userAdFeature_.toBuilder();
+            }
+            userAdFeature_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAdFeature_);
+              userAdFeature_ = subBuilder.buildPartial();
+            }
+
+            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_GetUserAdFeatureResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.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 USER_AD_FEATURE_FIELD_NUMBER = 2;
+  private com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto userAdFeature_;
+  /**
+   * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+   * @return Whether the userAdFeature field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAdFeature() {
+    return userAdFeature_ != null;
+  }
+  /**
+   * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+   * @return The userAdFeature.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getUserAdFeature() {
+    return userAdFeature_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance() : userAdFeature_;
+  }
+  /**
+   * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder getUserAdFeatureOrBuilder() {
+    return getUserAdFeature();
+  }
+
+  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());
+    }
+    if (userAdFeature_ != null) {
+      output.writeMessage(2, getUserAdFeature());
+    }
+    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());
+    }
+    if (userAdFeature_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getUserAdFeature());
+    }
+    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.GetUserAdFeatureResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (hasUserAdFeature() != other.hasUserAdFeature()) return false;
+    if (hasUserAdFeature()) {
+      if (!getUserAdFeature()
+          .equals(other.getUserAdFeature())) 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 (hasUserAdFeature()) {
+      hash = (37 * hash) + USER_AD_FEATURE_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAdFeature().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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.GetUserAdFeatureResponse 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 GetUserAdFeatureResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserAdFeatureResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.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;
+      }
+      if (userAdFeatureBuilder_ == null) {
+        userAdFeature_ = null;
+      } else {
+        userAdFeature_ = null;
+        userAdFeatureBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserAdFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse(this);
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (userAdFeatureBuilder_ == null) {
+        result.userAdFeature_ = userAdFeature_;
+      } else {
+        result.userAdFeature_ = userAdFeatureBuilder_.build();
+      }
+      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.GetUserAdFeatureResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (other.hasUserAdFeature()) {
+        mergeUserAdFeature(other.getUserAdFeature());
+      }
+      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.GetUserAdFeatureResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    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.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto userAdFeature_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder> userAdFeatureBuilder_;
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     * @return Whether the userAdFeature field is set.
+     */
+    public boolean hasUserAdFeature() {
+      return userAdFeatureBuilder_ != null || userAdFeature_ != null;
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     * @return The userAdFeature.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getUserAdFeature() {
+      if (userAdFeatureBuilder_ == null) {
+        return userAdFeature_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance() : userAdFeature_;
+      } else {
+        return userAdFeatureBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public Builder setUserAdFeature(com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto value) {
+      if (userAdFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAdFeature_ = value;
+        onChanged();
+      } else {
+        userAdFeatureBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public Builder setUserAdFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder builderForValue) {
+      if (userAdFeatureBuilder_ == null) {
+        userAdFeature_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAdFeatureBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public Builder mergeUserAdFeature(com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto value) {
+      if (userAdFeatureBuilder_ == null) {
+        if (userAdFeature_ != null) {
+          userAdFeature_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.newBuilder(userAdFeature_).mergeFrom(value).buildPartial();
+        } else {
+          userAdFeature_ = value;
+        }
+        onChanged();
+      } else {
+        userAdFeatureBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public Builder clearUserAdFeature() {
+      if (userAdFeatureBuilder_ == null) {
+        userAdFeature_ = null;
+        onChanged();
+      } else {
+        userAdFeature_ = null;
+        userAdFeatureBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder getUserAdFeatureBuilder() {
+      
+      onChanged();
+      return getUserAdFeatureFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder getUserAdFeatureOrBuilder() {
+      if (userAdFeatureBuilder_ != null) {
+        return userAdFeatureBuilder_.getMessageOrBuilder();
+      } else {
+        return userAdFeature_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance() : userAdFeature_;
+      }
+    }
+    /**
+     * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder> 
+        getUserAdFeatureFieldBuilder() {
+      if (userAdFeatureBuilder_ == null) {
+        userAdFeatureBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder>(
+                getUserAdFeature(),
+                getParentForChildren(),
+                isClean());
+        userAdFeature_ = null;
+      }
+      return userAdFeatureBuilder_;
+    }
+    @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:GetUserAdFeatureResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserAdFeatureResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserAdFeatureResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserAdFeatureResponse>() {
+    @java.lang.Override
+    public GetUserAdFeatureResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserAdFeatureResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserAdFeatureResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserAdFeatureResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 39 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserAdFeatureResponseOrBuilder.java

@@ -0,0 +1,39 @@
+// 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 GetUserAdFeatureResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserAdFeatureResponse)
+    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>.UserAdFeatureProto user_ad_feature = 2;</code>
+   * @return Whether the userAdFeature field is set.
+   */
+  boolean hasUserAdFeature();
+  /**
+   * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+   * @return The userAdFeature.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getUserAdFeature();
+  /**
+   * <code>.UserAdFeatureProto user_ad_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder getUserAdFeatureOrBuilder();
+}

+ 6139 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProto.java

@@ -0,0 +1,6139 @@
+// 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 UserAdFeatureProto}
+ */
+public final class UserAdFeatureProto extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:UserAdFeatureProto)
+    UserAdFeatureProtoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use UserAdFeatureProto.newBuilder() to construct.
+  private UserAdFeatureProto(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private UserAdFeatureProto() {
+    mid_ = "";
+    gender_ = "";
+    userType_ = "";
+    gmtCreate_ = "";
+    tags_ = "";
+    categoryName_ = "";
+    isvip_ = "";
+    isreward_ = "";
+    isad_ = "";
+    isgood_ = "";
+    firstUpDatetime_ = "";
+    lastUpDatetime_ = "";
+    nextToLastUpDatetime_ = "";
+    videos_ = "";
+    idols_ = "";
+    fans_ = "";
+    playCount_ = "";
+    playCountTotal_ = "";
+    totalReward_ = "";
+    currentdayReward_ = "";
+    rewardPerson_ = "";
+    totalRewardTimes_ = "";
+    rewardVideos_ = "";
+    totalPrice_ = "";
+    currentdayPrice_ = "";
+    totalPriceTimes_ = "";
+    totalPricePerson_ = "";
+    totalPriceVideos_ = "";
+    cgrainUserType_ = "";
+    identityTagname_ = "";
+    operationTags_ = "";
+    identityTagId_ = "";
+    identityCreateTime_ = "";
+    country_ = "";
+    province_ = "";
+    city_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new UserAdFeatureProto();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private UserAdFeatureProto(
+      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;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            gender_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            userType_ = s;
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            gmtCreate_ = s;
+            break;
+          }
+          case 42: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            tags_ = s;
+            break;
+          }
+          case 50: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            categoryName_ = s;
+            break;
+          }
+          case 58: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            isvip_ = s;
+            break;
+          }
+          case 66: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            isreward_ = s;
+            break;
+          }
+          case 74: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            isad_ = s;
+            break;
+          }
+          case 82: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            isgood_ = s;
+            break;
+          }
+          case 90: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            firstUpDatetime_ = s;
+            break;
+          }
+          case 98: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            lastUpDatetime_ = s;
+            break;
+          }
+          case 106: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            nextToLastUpDatetime_ = s;
+            break;
+          }
+          case 114: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            videos_ = s;
+            break;
+          }
+          case 122: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            idols_ = s;
+            break;
+          }
+          case 130: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            fans_ = s;
+            break;
+          }
+          case 138: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            playCount_ = s;
+            break;
+          }
+          case 146: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            playCountTotal_ = s;
+            break;
+          }
+          case 154: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalReward_ = s;
+            break;
+          }
+          case 162: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            currentdayReward_ = s;
+            break;
+          }
+          case 170: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            rewardPerson_ = s;
+            break;
+          }
+          case 178: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalRewardTimes_ = s;
+            break;
+          }
+          case 186: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            rewardVideos_ = s;
+            break;
+          }
+          case 194: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalPrice_ = s;
+            break;
+          }
+          case 202: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            currentdayPrice_ = s;
+            break;
+          }
+          case 210: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalPriceTimes_ = s;
+            break;
+          }
+          case 218: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalPricePerson_ = s;
+            break;
+          }
+          case 226: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            totalPriceVideos_ = s;
+            break;
+          }
+          case 234: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            cgrainUserType_ = s;
+            break;
+          }
+          case 242: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            identityTagname_ = s;
+            break;
+          }
+          case 250: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            operationTags_ = s;
+            break;
+          }
+          case 258: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            identityTagId_ = s;
+            break;
+          }
+          case 266: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            identityCreateTime_ = s;
+            break;
+          }
+          case 274: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            country_ = s;
+            break;
+          }
+          case 282: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            province_ = s;
+            break;
+          }
+          case 290: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            city_ = s;
+            break;
+          }
+          case 298: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day1CntFeatures_ != null) {
+              subBuilder = day1CntFeatures_.toBuilder();
+            }
+            day1CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day1CntFeatures_);
+              day1CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 306: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day3CntFeatures_ != null) {
+              subBuilder = day3CntFeatures_.toBuilder();
+            }
+            day3CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day3CntFeatures_);
+              day3CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 314: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (day7CntFeatures_ != null) {
+              subBuilder = day7CntFeatures_.toBuilder();
+            }
+            day7CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(day7CntFeatures_);
+              day7CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 322: {
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder subBuilder = null;
+            if (month3CntFeatures_ != null) {
+              subBuilder = month3CntFeatures_.toBuilder();
+            }
+            month3CntFeatures_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(month3CntFeatures_);
+              month3CntFeatures_ = subBuilder.buildPartial();
+            }
+
+            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_UserAdFeatureProto_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_UserAdFeatureProto_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.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;
+    }
+  }
+
+  public static final int GENDER_FIELD_NUMBER = 2;
+  private volatile java.lang.Object gender_;
+  /**
+   * <code>string gender = 2;</code>
+   * @return The gender.
+   */
+  @java.lang.Override
+  public java.lang.String getGender() {
+    java.lang.Object ref = gender_;
+    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();
+      gender_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string gender = 2;</code>
+   * @return The bytes for gender.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getGenderBytes() {
+    java.lang.Object ref = gender_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      gender_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int USER_TYPE_FIELD_NUMBER = 3;
+  private volatile java.lang.Object userType_;
+  /**
+   * <code>string user_type = 3;</code>
+   * @return The userType.
+   */
+  @java.lang.Override
+  public java.lang.String getUserType() {
+    java.lang.Object ref = userType_;
+    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();
+      userType_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string user_type = 3;</code>
+   * @return The bytes for userType.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getUserTypeBytes() {
+    java.lang.Object ref = userType_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      userType_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int GMT_CREATE_FIELD_NUMBER = 4;
+  private volatile java.lang.Object gmtCreate_;
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The gmtCreate.
+   */
+  @java.lang.Override
+  public java.lang.String getGmtCreate() {
+    java.lang.Object ref = gmtCreate_;
+    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();
+      gmtCreate_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The bytes for gmtCreate.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getGmtCreateBytes() {
+    java.lang.Object ref = gmtCreate_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      gmtCreate_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TAGS_FIELD_NUMBER = 5;
+  private volatile java.lang.Object tags_;
+  /**
+   * <code>string tags = 5;</code>
+   * @return The tags.
+   */
+  @java.lang.Override
+  public java.lang.String getTags() {
+    java.lang.Object ref = tags_;
+    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();
+      tags_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string tags = 5;</code>
+   * @return The bytes for tags.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTagsBytes() {
+    java.lang.Object ref = tags_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      tags_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CATEGORY_NAME_FIELD_NUMBER = 6;
+  private volatile java.lang.Object categoryName_;
+  /**
+   * <code>string category_name = 6;</code>
+   * @return The categoryName.
+   */
+  @java.lang.Override
+  public java.lang.String getCategoryName() {
+    java.lang.Object ref = categoryName_;
+    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();
+      categoryName_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string category_name = 6;</code>
+   * @return The bytes for categoryName.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCategoryNameBytes() {
+    java.lang.Object ref = categoryName_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      categoryName_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ISVIP_FIELD_NUMBER = 7;
+  private volatile java.lang.Object isvip_;
+  /**
+   * <code>string isvip = 7;</code>
+   * @return The isvip.
+   */
+  @java.lang.Override
+  public java.lang.String getIsvip() {
+    java.lang.Object ref = isvip_;
+    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();
+      isvip_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string isvip = 7;</code>
+   * @return The bytes for isvip.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIsvipBytes() {
+    java.lang.Object ref = isvip_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      isvip_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ISREWARD_FIELD_NUMBER = 8;
+  private volatile java.lang.Object isreward_;
+  /**
+   * <code>string isreward = 8;</code>
+   * @return The isreward.
+   */
+  @java.lang.Override
+  public java.lang.String getIsreward() {
+    java.lang.Object ref = isreward_;
+    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();
+      isreward_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string isreward = 8;</code>
+   * @return The bytes for isreward.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIsrewardBytes() {
+    java.lang.Object ref = isreward_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      isreward_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ISAD_FIELD_NUMBER = 9;
+  private volatile java.lang.Object isad_;
+  /**
+   * <code>string isad = 9;</code>
+   * @return The isad.
+   */
+  @java.lang.Override
+  public java.lang.String getIsad() {
+    java.lang.Object ref = isad_;
+    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();
+      isad_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string isad = 9;</code>
+   * @return The bytes for isad.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIsadBytes() {
+    java.lang.Object ref = isad_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      isad_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int ISGOOD_FIELD_NUMBER = 10;
+  private volatile java.lang.Object isgood_;
+  /**
+   * <code>string isgood = 10;</code>
+   * @return The isgood.
+   */
+  @java.lang.Override
+  public java.lang.String getIsgood() {
+    java.lang.Object ref = isgood_;
+    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();
+      isgood_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string isgood = 10;</code>
+   * @return The bytes for isgood.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIsgoodBytes() {
+    java.lang.Object ref = isgood_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      isgood_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int FIRST_UP_DATETIME_FIELD_NUMBER = 11;
+  private volatile java.lang.Object firstUpDatetime_;
+  /**
+   * <code>string first_up_datetime = 11;</code>
+   * @return The firstUpDatetime.
+   */
+  @java.lang.Override
+  public java.lang.String getFirstUpDatetime() {
+    java.lang.Object ref = firstUpDatetime_;
+    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();
+      firstUpDatetime_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string first_up_datetime = 11;</code>
+   * @return The bytes for firstUpDatetime.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getFirstUpDatetimeBytes() {
+    java.lang.Object ref = firstUpDatetime_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      firstUpDatetime_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int LAST_UP_DATETIME_FIELD_NUMBER = 12;
+  private volatile java.lang.Object lastUpDatetime_;
+  /**
+   * <code>string last_up_datetime = 12;</code>
+   * @return The lastUpDatetime.
+   */
+  @java.lang.Override
+  public java.lang.String getLastUpDatetime() {
+    java.lang.Object ref = lastUpDatetime_;
+    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();
+      lastUpDatetime_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string last_up_datetime = 12;</code>
+   * @return The bytes for lastUpDatetime.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getLastUpDatetimeBytes() {
+    java.lang.Object ref = lastUpDatetime_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      lastUpDatetime_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NEXT_TO_LAST_UP_DATETIME_FIELD_NUMBER = 13;
+  private volatile java.lang.Object nextToLastUpDatetime_;
+  /**
+   * <code>string next_to_last_up_datetime = 13;</code>
+   * @return The nextToLastUpDatetime.
+   */
+  @java.lang.Override
+  public java.lang.String getNextToLastUpDatetime() {
+    java.lang.Object ref = nextToLastUpDatetime_;
+    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();
+      nextToLastUpDatetime_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string next_to_last_up_datetime = 13;</code>
+   * @return The bytes for nextToLastUpDatetime.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNextToLastUpDatetimeBytes() {
+    java.lang.Object ref = nextToLastUpDatetime_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nextToLastUpDatetime_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int VIDEOS_FIELD_NUMBER = 14;
+  private volatile java.lang.Object videos_;
+  /**
+   * <code>string videos = 14;</code>
+   * @return The videos.
+   */
+  @java.lang.Override
+  public java.lang.String getVideos() {
+    java.lang.Object ref = videos_;
+    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();
+      videos_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string videos = 14;</code>
+   * @return The bytes for videos.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getVideosBytes() {
+    java.lang.Object ref = videos_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      videos_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDOLS_FIELD_NUMBER = 15;
+  private volatile java.lang.Object idols_;
+  /**
+   * <code>string idols = 15;</code>
+   * @return The idols.
+   */
+  @java.lang.Override
+  public java.lang.String getIdols() {
+    java.lang.Object ref = idols_;
+    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();
+      idols_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string idols = 15;</code>
+   * @return The bytes for idols.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdolsBytes() {
+    java.lang.Object ref = idols_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      idols_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int FANS_FIELD_NUMBER = 16;
+  private volatile java.lang.Object fans_;
+  /**
+   * <code>string fans = 16;</code>
+   * @return The fans.
+   */
+  @java.lang.Override
+  public java.lang.String getFans() {
+    java.lang.Object ref = fans_;
+    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();
+      fans_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string fans = 16;</code>
+   * @return The bytes for fans.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getFansBytes() {
+    java.lang.Object ref = fans_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      fans_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PLAY_COUNT_FIELD_NUMBER = 17;
+  private volatile java.lang.Object playCount_;
+  /**
+   * <code>string play_count = 17;</code>
+   * @return The playCount.
+   */
+  @java.lang.Override
+  public java.lang.String getPlayCount() {
+    java.lang.Object ref = playCount_;
+    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();
+      playCount_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string play_count = 17;</code>
+   * @return The bytes for playCount.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getPlayCountBytes() {
+    java.lang.Object ref = playCount_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      playCount_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PLAY_COUNT_TOTAL_FIELD_NUMBER = 18;
+  private volatile java.lang.Object playCountTotal_;
+  /**
+   * <code>string play_count_total = 18;</code>
+   * @return The playCountTotal.
+   */
+  @java.lang.Override
+  public java.lang.String getPlayCountTotal() {
+    java.lang.Object ref = playCountTotal_;
+    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();
+      playCountTotal_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string play_count_total = 18;</code>
+   * @return The bytes for playCountTotal.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getPlayCountTotalBytes() {
+    java.lang.Object ref = playCountTotal_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      playCountTotal_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_REWARD_FIELD_NUMBER = 19;
+  private volatile java.lang.Object totalReward_;
+  /**
+   * <code>string total_reward = 19;</code>
+   * @return The totalReward.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalReward() {
+    java.lang.Object ref = totalReward_;
+    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();
+      totalReward_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_reward = 19;</code>
+   * @return The bytes for totalReward.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalRewardBytes() {
+    java.lang.Object ref = totalReward_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalReward_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CURRENTDAY_REWARD_FIELD_NUMBER = 20;
+  private volatile java.lang.Object currentdayReward_;
+  /**
+   * <code>string currentday_reward = 20;</code>
+   * @return The currentdayReward.
+   */
+  @java.lang.Override
+  public java.lang.String getCurrentdayReward() {
+    java.lang.Object ref = currentdayReward_;
+    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();
+      currentdayReward_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string currentday_reward = 20;</code>
+   * @return The bytes for currentdayReward.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCurrentdayRewardBytes() {
+    java.lang.Object ref = currentdayReward_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      currentdayReward_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int REWARD_PERSON_FIELD_NUMBER = 21;
+  private volatile java.lang.Object rewardPerson_;
+  /**
+   * <code>string reward_person = 21;</code>
+   * @return The rewardPerson.
+   */
+  @java.lang.Override
+  public java.lang.String getRewardPerson() {
+    java.lang.Object ref = rewardPerson_;
+    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();
+      rewardPerson_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string reward_person = 21;</code>
+   * @return The bytes for rewardPerson.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRewardPersonBytes() {
+    java.lang.Object ref = rewardPerson_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      rewardPerson_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_REWARD_TIMES_FIELD_NUMBER = 22;
+  private volatile java.lang.Object totalRewardTimes_;
+  /**
+   * <code>string total_reward_times = 22;</code>
+   * @return The totalRewardTimes.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalRewardTimes() {
+    java.lang.Object ref = totalRewardTimes_;
+    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();
+      totalRewardTimes_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_reward_times = 22;</code>
+   * @return The bytes for totalRewardTimes.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalRewardTimesBytes() {
+    java.lang.Object ref = totalRewardTimes_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalRewardTimes_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int REWARD_VIDEOS_FIELD_NUMBER = 23;
+  private volatile java.lang.Object rewardVideos_;
+  /**
+   * <code>string reward_videos = 23;</code>
+   * @return The rewardVideos.
+   */
+  @java.lang.Override
+  public java.lang.String getRewardVideos() {
+    java.lang.Object ref = rewardVideos_;
+    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();
+      rewardVideos_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string reward_videos = 23;</code>
+   * @return The bytes for rewardVideos.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRewardVideosBytes() {
+    java.lang.Object ref = rewardVideos_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      rewardVideos_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_PRICE_FIELD_NUMBER = 24;
+  private volatile java.lang.Object totalPrice_;
+  /**
+   * <code>string total_price = 24;</code>
+   * @return The totalPrice.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalPrice() {
+    java.lang.Object ref = totalPrice_;
+    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();
+      totalPrice_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_price = 24;</code>
+   * @return The bytes for totalPrice.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalPriceBytes() {
+    java.lang.Object ref = totalPrice_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalPrice_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CURRENTDAY_PRICE_FIELD_NUMBER = 25;
+  private volatile java.lang.Object currentdayPrice_;
+  /**
+   * <code>string currentday_price = 25;</code>
+   * @return The currentdayPrice.
+   */
+  @java.lang.Override
+  public java.lang.String getCurrentdayPrice() {
+    java.lang.Object ref = currentdayPrice_;
+    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();
+      currentdayPrice_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string currentday_price = 25;</code>
+   * @return The bytes for currentdayPrice.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCurrentdayPriceBytes() {
+    java.lang.Object ref = currentdayPrice_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      currentdayPrice_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_PRICE_TIMES_FIELD_NUMBER = 26;
+  private volatile java.lang.Object totalPriceTimes_;
+  /**
+   * <code>string total_price_times = 26;</code>
+   * @return The totalPriceTimes.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalPriceTimes() {
+    java.lang.Object ref = totalPriceTimes_;
+    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();
+      totalPriceTimes_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_price_times = 26;</code>
+   * @return The bytes for totalPriceTimes.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalPriceTimesBytes() {
+    java.lang.Object ref = totalPriceTimes_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalPriceTimes_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_PRICE_PERSON_FIELD_NUMBER = 27;
+  private volatile java.lang.Object totalPricePerson_;
+  /**
+   * <code>string total_price_person = 27;</code>
+   * @return The totalPricePerson.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalPricePerson() {
+    java.lang.Object ref = totalPricePerson_;
+    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();
+      totalPricePerson_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_price_person = 27;</code>
+   * @return The bytes for totalPricePerson.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalPricePersonBytes() {
+    java.lang.Object ref = totalPricePerson_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalPricePerson_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TOTAL_PRICE_VIDEOS_FIELD_NUMBER = 28;
+  private volatile java.lang.Object totalPriceVideos_;
+  /**
+   * <code>string total_price_videos = 28;</code>
+   * @return The totalPriceVideos.
+   */
+  @java.lang.Override
+  public java.lang.String getTotalPriceVideos() {
+    java.lang.Object ref = totalPriceVideos_;
+    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();
+      totalPriceVideos_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string total_price_videos = 28;</code>
+   * @return The bytes for totalPriceVideos.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTotalPriceVideosBytes() {
+    java.lang.Object ref = totalPriceVideos_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      totalPriceVideos_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CGRAIN_USER_TYPE_FIELD_NUMBER = 29;
+  private volatile java.lang.Object cgrainUserType_;
+  /**
+   * <code>string cgrain_user_type = 29;</code>
+   * @return The cgrainUserType.
+   */
+  @java.lang.Override
+  public java.lang.String getCgrainUserType() {
+    java.lang.Object ref = cgrainUserType_;
+    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();
+      cgrainUserType_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string cgrain_user_type = 29;</code>
+   * @return The bytes for cgrainUserType.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCgrainUserTypeBytes() {
+    java.lang.Object ref = cgrainUserType_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      cgrainUserType_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDENTITY_TAGNAME_FIELD_NUMBER = 30;
+  private volatile java.lang.Object identityTagname_;
+  /**
+   * <code>string identity_tagname = 30;</code>
+   * @return The identityTagname.
+   */
+  @java.lang.Override
+  public java.lang.String getIdentityTagname() {
+    java.lang.Object ref = identityTagname_;
+    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();
+      identityTagname_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string identity_tagname = 30;</code>
+   * @return The bytes for identityTagname.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdentityTagnameBytes() {
+    java.lang.Object ref = identityTagname_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      identityTagname_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int OPERATION_TAGS_FIELD_NUMBER = 31;
+  private volatile java.lang.Object operationTags_;
+  /**
+   * <code>string operation_tags = 31;</code>
+   * @return The operationTags.
+   */
+  @java.lang.Override
+  public java.lang.String getOperationTags() {
+    java.lang.Object ref = operationTags_;
+    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();
+      operationTags_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string operation_tags = 31;</code>
+   * @return The bytes for operationTags.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getOperationTagsBytes() {
+    java.lang.Object ref = operationTags_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      operationTags_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDENTITY_TAG_ID_FIELD_NUMBER = 32;
+  private volatile java.lang.Object identityTagId_;
+  /**
+   * <code>string identity_tag_id = 32;</code>
+   * @return The identityTagId.
+   */
+  @java.lang.Override
+  public java.lang.String getIdentityTagId() {
+    java.lang.Object ref = identityTagId_;
+    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();
+      identityTagId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string identity_tag_id = 32;</code>
+   * @return The bytes for identityTagId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdentityTagIdBytes() {
+    java.lang.Object ref = identityTagId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      identityTagId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDENTITY_CREATE_TIME_FIELD_NUMBER = 33;
+  private volatile java.lang.Object identityCreateTime_;
+  /**
+   * <code>string identity_create_time = 33;</code>
+   * @return The identityCreateTime.
+   */
+  @java.lang.Override
+  public java.lang.String getIdentityCreateTime() {
+    java.lang.Object ref = identityCreateTime_;
+    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();
+      identityCreateTime_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string identity_create_time = 33;</code>
+   * @return The bytes for identityCreateTime.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdentityCreateTimeBytes() {
+    java.lang.Object ref = identityCreateTime_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      identityCreateTime_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int COUNTRY_FIELD_NUMBER = 34;
+  private volatile java.lang.Object country_;
+  /**
+   * <code>string country = 34;</code>
+   * @return The country.
+   */
+  @java.lang.Override
+  public java.lang.String getCountry() {
+    java.lang.Object ref = country_;
+    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();
+      country_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string country = 34;</code>
+   * @return The bytes for country.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCountryBytes() {
+    java.lang.Object ref = country_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      country_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PROVINCE_FIELD_NUMBER = 35;
+  private volatile java.lang.Object province_;
+  /**
+   * <code>string province = 35;</code>
+   * @return The province.
+   */
+  @java.lang.Override
+  public java.lang.String getProvince() {
+    java.lang.Object ref = province_;
+    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();
+      province_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string province = 35;</code>
+   * @return The bytes for province.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getProvinceBytes() {
+    java.lang.Object ref = province_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      province_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CITY_FIELD_NUMBER = 36;
+  private volatile java.lang.Object city_;
+  /**
+   * <code>string city = 36;</code>
+   * @return The city.
+   */
+  @java.lang.Override
+  public java.lang.String getCity() {
+    java.lang.Object ref = city_;
+    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();
+      city_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string city = 36;</code>
+   * @return The bytes for city.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCityBytes() {
+    java.lang.Object ref = city_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      city_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int DAY1_CNT_FEATURES_FIELD_NUMBER = 37;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day1CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return Whether the day1CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay1CntFeatures() {
+    return day1CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return The day1CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures() {
+    return day1CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder() {
+    return getDay1CntFeatures();
+  }
+
+  public static final int DAY3_CNT_FEATURES_FIELD_NUMBER = 38;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day3CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return Whether the day3CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay3CntFeatures() {
+    return day3CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return The day3CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures() {
+    return day3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder() {
+    return getDay3CntFeatures();
+  }
+
+  public static final int DAY7_CNT_FEATURES_FIELD_NUMBER = 39;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day7CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return Whether the day7CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasDay7CntFeatures() {
+    return day7CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return The day7CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures() {
+    return day7CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder() {
+    return getDay7CntFeatures();
+  }
+
+  public static final int MONTH3_CNT_FEATURES_FIELD_NUMBER = 40;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto month3CntFeatures_;
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return Whether the month3CntFeatures field is set.
+   */
+  @java.lang.Override
+  public boolean hasMonth3CntFeatures() {
+    return month3CntFeatures_ != null;
+  }
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return The month3CntFeatures.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures() {
+    return month3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+  }
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder() {
+    return getMonth3CntFeatures();
+  }
+
+  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_);
+    }
+    if (!getGenderBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, gender_);
+    }
+    if (!getUserTypeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, userType_);
+    }
+    if (!getGmtCreateBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, gmtCreate_);
+    }
+    if (!getTagsBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, tags_);
+    }
+    if (!getCategoryNameBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 6, categoryName_);
+    }
+    if (!getIsvipBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 7, isvip_);
+    }
+    if (!getIsrewardBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 8, isreward_);
+    }
+    if (!getIsadBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 9, isad_);
+    }
+    if (!getIsgoodBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 10, isgood_);
+    }
+    if (!getFirstUpDatetimeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 11, firstUpDatetime_);
+    }
+    if (!getLastUpDatetimeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 12, lastUpDatetime_);
+    }
+    if (!getNextToLastUpDatetimeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 13, nextToLastUpDatetime_);
+    }
+    if (!getVideosBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 14, videos_);
+    }
+    if (!getIdolsBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 15, idols_);
+    }
+    if (!getFansBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 16, fans_);
+    }
+    if (!getPlayCountBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 17, playCount_);
+    }
+    if (!getPlayCountTotalBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 18, playCountTotal_);
+    }
+    if (!getTotalRewardBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 19, totalReward_);
+    }
+    if (!getCurrentdayRewardBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 20, currentdayReward_);
+    }
+    if (!getRewardPersonBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 21, rewardPerson_);
+    }
+    if (!getTotalRewardTimesBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 22, totalRewardTimes_);
+    }
+    if (!getRewardVideosBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 23, rewardVideos_);
+    }
+    if (!getTotalPriceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 24, totalPrice_);
+    }
+    if (!getCurrentdayPriceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 25, currentdayPrice_);
+    }
+    if (!getTotalPriceTimesBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 26, totalPriceTimes_);
+    }
+    if (!getTotalPricePersonBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 27, totalPricePerson_);
+    }
+    if (!getTotalPriceVideosBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 28, totalPriceVideos_);
+    }
+    if (!getCgrainUserTypeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 29, cgrainUserType_);
+    }
+    if (!getIdentityTagnameBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 30, identityTagname_);
+    }
+    if (!getOperationTagsBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 31, operationTags_);
+    }
+    if (!getIdentityTagIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 32, identityTagId_);
+    }
+    if (!getIdentityCreateTimeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 33, identityCreateTime_);
+    }
+    if (!getCountryBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 34, country_);
+    }
+    if (!getProvinceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 35, province_);
+    }
+    if (!getCityBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 36, city_);
+    }
+    if (day1CntFeatures_ != null) {
+      output.writeMessage(37, getDay1CntFeatures());
+    }
+    if (day3CntFeatures_ != null) {
+      output.writeMessage(38, getDay3CntFeatures());
+    }
+    if (day7CntFeatures_ != null) {
+      output.writeMessage(39, getDay7CntFeatures());
+    }
+    if (month3CntFeatures_ != null) {
+      output.writeMessage(40, getMonth3CntFeatures());
+    }
+    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_);
+    }
+    if (!getGenderBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, gender_);
+    }
+    if (!getUserTypeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, userType_);
+    }
+    if (!getGmtCreateBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, gmtCreate_);
+    }
+    if (!getTagsBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, tags_);
+    }
+    if (!getCategoryNameBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, categoryName_);
+    }
+    if (!getIsvipBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, isvip_);
+    }
+    if (!getIsrewardBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, isreward_);
+    }
+    if (!getIsadBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, isad_);
+    }
+    if (!getIsgoodBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, isgood_);
+    }
+    if (!getFirstUpDatetimeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, firstUpDatetime_);
+    }
+    if (!getLastUpDatetimeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, lastUpDatetime_);
+    }
+    if (!getNextToLastUpDatetimeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, nextToLastUpDatetime_);
+    }
+    if (!getVideosBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, videos_);
+    }
+    if (!getIdolsBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, idols_);
+    }
+    if (!getFansBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, fans_);
+    }
+    if (!getPlayCountBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(17, playCount_);
+    }
+    if (!getPlayCountTotalBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(18, playCountTotal_);
+    }
+    if (!getTotalRewardBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(19, totalReward_);
+    }
+    if (!getCurrentdayRewardBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(20, currentdayReward_);
+    }
+    if (!getRewardPersonBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(21, rewardPerson_);
+    }
+    if (!getTotalRewardTimesBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(22, totalRewardTimes_);
+    }
+    if (!getRewardVideosBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(23, rewardVideos_);
+    }
+    if (!getTotalPriceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, totalPrice_);
+    }
+    if (!getCurrentdayPriceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(25, currentdayPrice_);
+    }
+    if (!getTotalPriceTimesBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(26, totalPriceTimes_);
+    }
+    if (!getTotalPricePersonBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(27, totalPricePerson_);
+    }
+    if (!getTotalPriceVideosBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(28, totalPriceVideos_);
+    }
+    if (!getCgrainUserTypeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(29, cgrainUserType_);
+    }
+    if (!getIdentityTagnameBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(30, identityTagname_);
+    }
+    if (!getOperationTagsBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(31, operationTags_);
+    }
+    if (!getIdentityTagIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(32, identityTagId_);
+    }
+    if (!getIdentityCreateTimeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(33, identityCreateTime_);
+    }
+    if (!getCountryBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(34, country_);
+    }
+    if (!getProvinceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(35, province_);
+    }
+    if (!getCityBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(36, city_);
+    }
+    if (day1CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(37, getDay1CntFeatures());
+    }
+    if (day3CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(38, getDay3CntFeatures());
+    }
+    if (day7CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(39, getDay7CntFeatures());
+    }
+    if (month3CntFeatures_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(40, getMonth3CntFeatures());
+    }
+    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.UserAdFeatureProto)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto other = (com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto) obj;
+
+    if (!getMid()
+        .equals(other.getMid())) return false;
+    if (!getGender()
+        .equals(other.getGender())) return false;
+    if (!getUserType()
+        .equals(other.getUserType())) return false;
+    if (!getGmtCreate()
+        .equals(other.getGmtCreate())) return false;
+    if (!getTags()
+        .equals(other.getTags())) return false;
+    if (!getCategoryName()
+        .equals(other.getCategoryName())) return false;
+    if (!getIsvip()
+        .equals(other.getIsvip())) return false;
+    if (!getIsreward()
+        .equals(other.getIsreward())) return false;
+    if (!getIsad()
+        .equals(other.getIsad())) return false;
+    if (!getIsgood()
+        .equals(other.getIsgood())) return false;
+    if (!getFirstUpDatetime()
+        .equals(other.getFirstUpDatetime())) return false;
+    if (!getLastUpDatetime()
+        .equals(other.getLastUpDatetime())) return false;
+    if (!getNextToLastUpDatetime()
+        .equals(other.getNextToLastUpDatetime())) return false;
+    if (!getVideos()
+        .equals(other.getVideos())) return false;
+    if (!getIdols()
+        .equals(other.getIdols())) return false;
+    if (!getFans()
+        .equals(other.getFans())) return false;
+    if (!getPlayCount()
+        .equals(other.getPlayCount())) return false;
+    if (!getPlayCountTotal()
+        .equals(other.getPlayCountTotal())) return false;
+    if (!getTotalReward()
+        .equals(other.getTotalReward())) return false;
+    if (!getCurrentdayReward()
+        .equals(other.getCurrentdayReward())) return false;
+    if (!getRewardPerson()
+        .equals(other.getRewardPerson())) return false;
+    if (!getTotalRewardTimes()
+        .equals(other.getTotalRewardTimes())) return false;
+    if (!getRewardVideos()
+        .equals(other.getRewardVideos())) return false;
+    if (!getTotalPrice()
+        .equals(other.getTotalPrice())) return false;
+    if (!getCurrentdayPrice()
+        .equals(other.getCurrentdayPrice())) return false;
+    if (!getTotalPriceTimes()
+        .equals(other.getTotalPriceTimes())) return false;
+    if (!getTotalPricePerson()
+        .equals(other.getTotalPricePerson())) return false;
+    if (!getTotalPriceVideos()
+        .equals(other.getTotalPriceVideos())) return false;
+    if (!getCgrainUserType()
+        .equals(other.getCgrainUserType())) return false;
+    if (!getIdentityTagname()
+        .equals(other.getIdentityTagname())) return false;
+    if (!getOperationTags()
+        .equals(other.getOperationTags())) return false;
+    if (!getIdentityTagId()
+        .equals(other.getIdentityTagId())) return false;
+    if (!getIdentityCreateTime()
+        .equals(other.getIdentityCreateTime())) return false;
+    if (!getCountry()
+        .equals(other.getCountry())) return false;
+    if (!getProvince()
+        .equals(other.getProvince())) return false;
+    if (!getCity()
+        .equals(other.getCity())) return false;
+    if (hasDay1CntFeatures() != other.hasDay1CntFeatures()) return false;
+    if (hasDay1CntFeatures()) {
+      if (!getDay1CntFeatures()
+          .equals(other.getDay1CntFeatures())) return false;
+    }
+    if (hasDay3CntFeatures() != other.hasDay3CntFeatures()) return false;
+    if (hasDay3CntFeatures()) {
+      if (!getDay3CntFeatures()
+          .equals(other.getDay3CntFeatures())) return false;
+    }
+    if (hasDay7CntFeatures() != other.hasDay7CntFeatures()) return false;
+    if (hasDay7CntFeatures()) {
+      if (!getDay7CntFeatures()
+          .equals(other.getDay7CntFeatures())) return false;
+    }
+    if (hasMonth3CntFeatures() != other.hasMonth3CntFeatures()) return false;
+    if (hasMonth3CntFeatures()) {
+      if (!getMonth3CntFeatures()
+          .equals(other.getMonth3CntFeatures())) 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 = (37 * hash) + GENDER_FIELD_NUMBER;
+    hash = (53 * hash) + getGender().hashCode();
+    hash = (37 * hash) + USER_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getUserType().hashCode();
+    hash = (37 * hash) + GMT_CREATE_FIELD_NUMBER;
+    hash = (53 * hash) + getGmtCreate().hashCode();
+    hash = (37 * hash) + TAGS_FIELD_NUMBER;
+    hash = (53 * hash) + getTags().hashCode();
+    hash = (37 * hash) + CATEGORY_NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getCategoryName().hashCode();
+    hash = (37 * hash) + ISVIP_FIELD_NUMBER;
+    hash = (53 * hash) + getIsvip().hashCode();
+    hash = (37 * hash) + ISREWARD_FIELD_NUMBER;
+    hash = (53 * hash) + getIsreward().hashCode();
+    hash = (37 * hash) + ISAD_FIELD_NUMBER;
+    hash = (53 * hash) + getIsad().hashCode();
+    hash = (37 * hash) + ISGOOD_FIELD_NUMBER;
+    hash = (53 * hash) + getIsgood().hashCode();
+    hash = (37 * hash) + FIRST_UP_DATETIME_FIELD_NUMBER;
+    hash = (53 * hash) + getFirstUpDatetime().hashCode();
+    hash = (37 * hash) + LAST_UP_DATETIME_FIELD_NUMBER;
+    hash = (53 * hash) + getLastUpDatetime().hashCode();
+    hash = (37 * hash) + NEXT_TO_LAST_UP_DATETIME_FIELD_NUMBER;
+    hash = (53 * hash) + getNextToLastUpDatetime().hashCode();
+    hash = (37 * hash) + VIDEOS_FIELD_NUMBER;
+    hash = (53 * hash) + getVideos().hashCode();
+    hash = (37 * hash) + IDOLS_FIELD_NUMBER;
+    hash = (53 * hash) + getIdols().hashCode();
+    hash = (37 * hash) + FANS_FIELD_NUMBER;
+    hash = (53 * hash) + getFans().hashCode();
+    hash = (37 * hash) + PLAY_COUNT_FIELD_NUMBER;
+    hash = (53 * hash) + getPlayCount().hashCode();
+    hash = (37 * hash) + PLAY_COUNT_TOTAL_FIELD_NUMBER;
+    hash = (53 * hash) + getPlayCountTotal().hashCode();
+    hash = (37 * hash) + TOTAL_REWARD_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalReward().hashCode();
+    hash = (37 * hash) + CURRENTDAY_REWARD_FIELD_NUMBER;
+    hash = (53 * hash) + getCurrentdayReward().hashCode();
+    hash = (37 * hash) + REWARD_PERSON_FIELD_NUMBER;
+    hash = (53 * hash) + getRewardPerson().hashCode();
+    hash = (37 * hash) + TOTAL_REWARD_TIMES_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalRewardTimes().hashCode();
+    hash = (37 * hash) + REWARD_VIDEOS_FIELD_NUMBER;
+    hash = (53 * hash) + getRewardVideos().hashCode();
+    hash = (37 * hash) + TOTAL_PRICE_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalPrice().hashCode();
+    hash = (37 * hash) + CURRENTDAY_PRICE_FIELD_NUMBER;
+    hash = (53 * hash) + getCurrentdayPrice().hashCode();
+    hash = (37 * hash) + TOTAL_PRICE_TIMES_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalPriceTimes().hashCode();
+    hash = (37 * hash) + TOTAL_PRICE_PERSON_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalPricePerson().hashCode();
+    hash = (37 * hash) + TOTAL_PRICE_VIDEOS_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalPriceVideos().hashCode();
+    hash = (37 * hash) + CGRAIN_USER_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getCgrainUserType().hashCode();
+    hash = (37 * hash) + IDENTITY_TAGNAME_FIELD_NUMBER;
+    hash = (53 * hash) + getIdentityTagname().hashCode();
+    hash = (37 * hash) + OPERATION_TAGS_FIELD_NUMBER;
+    hash = (53 * hash) + getOperationTags().hashCode();
+    hash = (37 * hash) + IDENTITY_TAG_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getIdentityTagId().hashCode();
+    hash = (37 * hash) + IDENTITY_CREATE_TIME_FIELD_NUMBER;
+    hash = (53 * hash) + getIdentityCreateTime().hashCode();
+    hash = (37 * hash) + COUNTRY_FIELD_NUMBER;
+    hash = (53 * hash) + getCountry().hashCode();
+    hash = (37 * hash) + PROVINCE_FIELD_NUMBER;
+    hash = (53 * hash) + getProvince().hashCode();
+    hash = (37 * hash) + CITY_FIELD_NUMBER;
+    hash = (53 * hash) + getCity().hashCode();
+    if (hasDay1CntFeatures()) {
+      hash = (37 * hash) + DAY1_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay1CntFeatures().hashCode();
+    }
+    if (hasDay3CntFeatures()) {
+      hash = (37 * hash) + DAY3_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay3CntFeatures().hashCode();
+    }
+    if (hasDay7CntFeatures()) {
+      hash = (37 * hash) + DAY7_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay7CntFeatures().hashCode();
+    }
+    if (hasMonth3CntFeatures()) {
+      hash = (37 * hash) + MONTH3_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getMonth3CntFeatures().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto 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.UserAdFeatureProto parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto 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.UserAdFeatureProto parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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.UserAdFeatureProto 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 UserAdFeatureProto}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:UserAdFeatureProto)
+      com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProtoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_UserAdFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_UserAdFeatureProto_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.class, com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.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_ = "";
+
+      gender_ = "";
+
+      userType_ = "";
+
+      gmtCreate_ = "";
+
+      tags_ = "";
+
+      categoryName_ = "";
+
+      isvip_ = "";
+
+      isreward_ = "";
+
+      isad_ = "";
+
+      isgood_ = "";
+
+      firstUpDatetime_ = "";
+
+      lastUpDatetime_ = "";
+
+      nextToLastUpDatetime_ = "";
+
+      videos_ = "";
+
+      idols_ = "";
+
+      fans_ = "";
+
+      playCount_ = "";
+
+      playCountTotal_ = "";
+
+      totalReward_ = "";
+
+      currentdayReward_ = "";
+
+      rewardPerson_ = "";
+
+      totalRewardTimes_ = "";
+
+      rewardVideos_ = "";
+
+      totalPrice_ = "";
+
+      currentdayPrice_ = "";
+
+      totalPriceTimes_ = "";
+
+      totalPricePerson_ = "";
+
+      totalPriceVideos_ = "";
+
+      cgrainUserType_ = "";
+
+      identityTagname_ = "";
+
+      operationTags_ = "";
+
+      identityTagId_ = "";
+
+      identityCreateTime_ = "";
+
+      country_ = "";
+
+      province_ = "";
+
+      city_ = "";
+
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = null;
+      } else {
+        day1CntFeatures_ = null;
+        day1CntFeaturesBuilder_ = null;
+      }
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = null;
+      } else {
+        day3CntFeatures_ = null;
+        day3CntFeaturesBuilder_ = null;
+      }
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = null;
+      } else {
+        day7CntFeatures_ = null;
+        day7CntFeaturesBuilder_ = null;
+      }
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = null;
+      } else {
+        month3CntFeatures_ = null;
+        month3CntFeaturesBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_UserAdFeatureProto_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto result = new com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto(this);
+      result.mid_ = mid_;
+      result.gender_ = gender_;
+      result.userType_ = userType_;
+      result.gmtCreate_ = gmtCreate_;
+      result.tags_ = tags_;
+      result.categoryName_ = categoryName_;
+      result.isvip_ = isvip_;
+      result.isreward_ = isreward_;
+      result.isad_ = isad_;
+      result.isgood_ = isgood_;
+      result.firstUpDatetime_ = firstUpDatetime_;
+      result.lastUpDatetime_ = lastUpDatetime_;
+      result.nextToLastUpDatetime_ = nextToLastUpDatetime_;
+      result.videos_ = videos_;
+      result.idols_ = idols_;
+      result.fans_ = fans_;
+      result.playCount_ = playCount_;
+      result.playCountTotal_ = playCountTotal_;
+      result.totalReward_ = totalReward_;
+      result.currentdayReward_ = currentdayReward_;
+      result.rewardPerson_ = rewardPerson_;
+      result.totalRewardTimes_ = totalRewardTimes_;
+      result.rewardVideos_ = rewardVideos_;
+      result.totalPrice_ = totalPrice_;
+      result.currentdayPrice_ = currentdayPrice_;
+      result.totalPriceTimes_ = totalPriceTimes_;
+      result.totalPricePerson_ = totalPricePerson_;
+      result.totalPriceVideos_ = totalPriceVideos_;
+      result.cgrainUserType_ = cgrainUserType_;
+      result.identityTagname_ = identityTagname_;
+      result.operationTags_ = operationTags_;
+      result.identityTagId_ = identityTagId_;
+      result.identityCreateTime_ = identityCreateTime_;
+      result.country_ = country_;
+      result.province_ = province_;
+      result.city_ = city_;
+      if (day1CntFeaturesBuilder_ == null) {
+        result.day1CntFeatures_ = day1CntFeatures_;
+      } else {
+        result.day1CntFeatures_ = day1CntFeaturesBuilder_.build();
+      }
+      if (day3CntFeaturesBuilder_ == null) {
+        result.day3CntFeatures_ = day3CntFeatures_;
+      } else {
+        result.day3CntFeatures_ = day3CntFeaturesBuilder_.build();
+      }
+      if (day7CntFeaturesBuilder_ == null) {
+        result.day7CntFeatures_ = day7CntFeatures_;
+      } else {
+        result.day7CntFeatures_ = day7CntFeaturesBuilder_.build();
+      }
+      if (month3CntFeaturesBuilder_ == null) {
+        result.month3CntFeatures_ = month3CntFeatures_;
+      } else {
+        result.month3CntFeatures_ = month3CntFeaturesBuilder_.build();
+      }
+      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.UserAdFeatureProto) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance()) return this;
+      if (!other.getMid().isEmpty()) {
+        mid_ = other.mid_;
+        onChanged();
+      }
+      if (!other.getGender().isEmpty()) {
+        gender_ = other.gender_;
+        onChanged();
+      }
+      if (!other.getUserType().isEmpty()) {
+        userType_ = other.userType_;
+        onChanged();
+      }
+      if (!other.getGmtCreate().isEmpty()) {
+        gmtCreate_ = other.gmtCreate_;
+        onChanged();
+      }
+      if (!other.getTags().isEmpty()) {
+        tags_ = other.tags_;
+        onChanged();
+      }
+      if (!other.getCategoryName().isEmpty()) {
+        categoryName_ = other.categoryName_;
+        onChanged();
+      }
+      if (!other.getIsvip().isEmpty()) {
+        isvip_ = other.isvip_;
+        onChanged();
+      }
+      if (!other.getIsreward().isEmpty()) {
+        isreward_ = other.isreward_;
+        onChanged();
+      }
+      if (!other.getIsad().isEmpty()) {
+        isad_ = other.isad_;
+        onChanged();
+      }
+      if (!other.getIsgood().isEmpty()) {
+        isgood_ = other.isgood_;
+        onChanged();
+      }
+      if (!other.getFirstUpDatetime().isEmpty()) {
+        firstUpDatetime_ = other.firstUpDatetime_;
+        onChanged();
+      }
+      if (!other.getLastUpDatetime().isEmpty()) {
+        lastUpDatetime_ = other.lastUpDatetime_;
+        onChanged();
+      }
+      if (!other.getNextToLastUpDatetime().isEmpty()) {
+        nextToLastUpDatetime_ = other.nextToLastUpDatetime_;
+        onChanged();
+      }
+      if (!other.getVideos().isEmpty()) {
+        videos_ = other.videos_;
+        onChanged();
+      }
+      if (!other.getIdols().isEmpty()) {
+        idols_ = other.idols_;
+        onChanged();
+      }
+      if (!other.getFans().isEmpty()) {
+        fans_ = other.fans_;
+        onChanged();
+      }
+      if (!other.getPlayCount().isEmpty()) {
+        playCount_ = other.playCount_;
+        onChanged();
+      }
+      if (!other.getPlayCountTotal().isEmpty()) {
+        playCountTotal_ = other.playCountTotal_;
+        onChanged();
+      }
+      if (!other.getTotalReward().isEmpty()) {
+        totalReward_ = other.totalReward_;
+        onChanged();
+      }
+      if (!other.getCurrentdayReward().isEmpty()) {
+        currentdayReward_ = other.currentdayReward_;
+        onChanged();
+      }
+      if (!other.getRewardPerson().isEmpty()) {
+        rewardPerson_ = other.rewardPerson_;
+        onChanged();
+      }
+      if (!other.getTotalRewardTimes().isEmpty()) {
+        totalRewardTimes_ = other.totalRewardTimes_;
+        onChanged();
+      }
+      if (!other.getRewardVideos().isEmpty()) {
+        rewardVideos_ = other.rewardVideos_;
+        onChanged();
+      }
+      if (!other.getTotalPrice().isEmpty()) {
+        totalPrice_ = other.totalPrice_;
+        onChanged();
+      }
+      if (!other.getCurrentdayPrice().isEmpty()) {
+        currentdayPrice_ = other.currentdayPrice_;
+        onChanged();
+      }
+      if (!other.getTotalPriceTimes().isEmpty()) {
+        totalPriceTimes_ = other.totalPriceTimes_;
+        onChanged();
+      }
+      if (!other.getTotalPricePerson().isEmpty()) {
+        totalPricePerson_ = other.totalPricePerson_;
+        onChanged();
+      }
+      if (!other.getTotalPriceVideos().isEmpty()) {
+        totalPriceVideos_ = other.totalPriceVideos_;
+        onChanged();
+      }
+      if (!other.getCgrainUserType().isEmpty()) {
+        cgrainUserType_ = other.cgrainUserType_;
+        onChanged();
+      }
+      if (!other.getIdentityTagname().isEmpty()) {
+        identityTagname_ = other.identityTagname_;
+        onChanged();
+      }
+      if (!other.getOperationTags().isEmpty()) {
+        operationTags_ = other.operationTags_;
+        onChanged();
+      }
+      if (!other.getIdentityTagId().isEmpty()) {
+        identityTagId_ = other.identityTagId_;
+        onChanged();
+      }
+      if (!other.getIdentityCreateTime().isEmpty()) {
+        identityCreateTime_ = other.identityCreateTime_;
+        onChanged();
+      }
+      if (!other.getCountry().isEmpty()) {
+        country_ = other.country_;
+        onChanged();
+      }
+      if (!other.getProvince().isEmpty()) {
+        province_ = other.province_;
+        onChanged();
+      }
+      if (!other.getCity().isEmpty()) {
+        city_ = other.city_;
+        onChanged();
+      }
+      if (other.hasDay1CntFeatures()) {
+        mergeDay1CntFeatures(other.getDay1CntFeatures());
+      }
+      if (other.hasDay3CntFeatures()) {
+        mergeDay3CntFeatures(other.getDay3CntFeatures());
+      }
+      if (other.hasDay7CntFeatures()) {
+        mergeDay7CntFeatures(other.getDay7CntFeatures());
+      }
+      if (other.hasMonth3CntFeatures()) {
+        mergeMonth3CntFeatures(other.getMonth3CntFeatures());
+      }
+      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.UserAdFeatureProto parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto) 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;
+    }
+
+    private java.lang.Object gender_ = "";
+    /**
+     * <code>string gender = 2;</code>
+     * @return The gender.
+     */
+    public java.lang.String getGender() {
+      java.lang.Object ref = gender_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        gender_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string gender = 2;</code>
+     * @return The bytes for gender.
+     */
+    public com.google.protobuf.ByteString
+        getGenderBytes() {
+      java.lang.Object ref = gender_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        gender_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string gender = 2;</code>
+     * @param value The gender to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGender(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      gender_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gender = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearGender() {
+      
+      gender_ = getDefaultInstance().getGender();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gender = 2;</code>
+     * @param value The bytes for gender to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGenderBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      gender_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object userType_ = "";
+    /**
+     * <code>string user_type = 3;</code>
+     * @return The userType.
+     */
+    public java.lang.String getUserType() {
+      java.lang.Object ref = userType_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        userType_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string user_type = 3;</code>
+     * @return The bytes for userType.
+     */
+    public com.google.protobuf.ByteString
+        getUserTypeBytes() {
+      java.lang.Object ref = userType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        userType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string user_type = 3;</code>
+     * @param value The userType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUserType(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      userType_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string user_type = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUserType() {
+      
+      userType_ = getDefaultInstance().getUserType();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string user_type = 3;</code>
+     * @param value The bytes for userType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUserTypeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      userType_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object gmtCreate_ = "";
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return The gmtCreate.
+     */
+    public java.lang.String getGmtCreate() {
+      java.lang.Object ref = gmtCreate_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        gmtCreate_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return The bytes for gmtCreate.
+     */
+    public com.google.protobuf.ByteString
+        getGmtCreateBytes() {
+      java.lang.Object ref = gmtCreate_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        gmtCreate_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @param value The gmtCreate to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGmtCreate(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      gmtCreate_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearGmtCreate() {
+      
+      gmtCreate_ = getDefaultInstance().getGmtCreate();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @param value The bytes for gmtCreate to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGmtCreateBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      gmtCreate_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object tags_ = "";
+    /**
+     * <code>string tags = 5;</code>
+     * @return The tags.
+     */
+    public java.lang.String getTags() {
+      java.lang.Object ref = tags_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        tags_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string tags = 5;</code>
+     * @return The bytes for tags.
+     */
+    public com.google.protobuf.ByteString
+        getTagsBytes() {
+      java.lang.Object ref = tags_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        tags_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string tags = 5;</code>
+     * @param value The tags to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTags(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      tags_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string tags = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTags() {
+      
+      tags_ = getDefaultInstance().getTags();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string tags = 5;</code>
+     * @param value The bytes for tags to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTagsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      tags_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object categoryName_ = "";
+    /**
+     * <code>string category_name = 6;</code>
+     * @return The categoryName.
+     */
+    public java.lang.String getCategoryName() {
+      java.lang.Object ref = categoryName_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        categoryName_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string category_name = 6;</code>
+     * @return The bytes for categoryName.
+     */
+    public com.google.protobuf.ByteString
+        getCategoryNameBytes() {
+      java.lang.Object ref = categoryName_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        categoryName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string category_name = 6;</code>
+     * @param value The categoryName to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategoryName(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      categoryName_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string category_name = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCategoryName() {
+      
+      categoryName_ = getDefaultInstance().getCategoryName();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string category_name = 6;</code>
+     * @param value The bytes for categoryName to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategoryNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      categoryName_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object isvip_ = "";
+    /**
+     * <code>string isvip = 7;</code>
+     * @return The isvip.
+     */
+    public java.lang.String getIsvip() {
+      java.lang.Object ref = isvip_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        isvip_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string isvip = 7;</code>
+     * @return The bytes for isvip.
+     */
+    public com.google.protobuf.ByteString
+        getIsvipBytes() {
+      java.lang.Object ref = isvip_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        isvip_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string isvip = 7;</code>
+     * @param value The isvip to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsvip(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      isvip_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isvip = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsvip() {
+      
+      isvip_ = getDefaultInstance().getIsvip();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isvip = 7;</code>
+     * @param value The bytes for isvip to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsvipBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      isvip_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object isreward_ = "";
+    /**
+     * <code>string isreward = 8;</code>
+     * @return The isreward.
+     */
+    public java.lang.String getIsreward() {
+      java.lang.Object ref = isreward_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        isreward_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string isreward = 8;</code>
+     * @return The bytes for isreward.
+     */
+    public com.google.protobuf.ByteString
+        getIsrewardBytes() {
+      java.lang.Object ref = isreward_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        isreward_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string isreward = 8;</code>
+     * @param value The isreward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsreward(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      isreward_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isreward = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsreward() {
+      
+      isreward_ = getDefaultInstance().getIsreward();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isreward = 8;</code>
+     * @param value The bytes for isreward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsrewardBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      isreward_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object isad_ = "";
+    /**
+     * <code>string isad = 9;</code>
+     * @return The isad.
+     */
+    public java.lang.String getIsad() {
+      java.lang.Object ref = isad_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        isad_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string isad = 9;</code>
+     * @return The bytes for isad.
+     */
+    public com.google.protobuf.ByteString
+        getIsadBytes() {
+      java.lang.Object ref = isad_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        isad_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string isad = 9;</code>
+     * @param value The isad to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsad(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      isad_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isad = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsad() {
+      
+      isad_ = getDefaultInstance().getIsad();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isad = 9;</code>
+     * @param value The bytes for isad to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsadBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      isad_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object isgood_ = "";
+    /**
+     * <code>string isgood = 10;</code>
+     * @return The isgood.
+     */
+    public java.lang.String getIsgood() {
+      java.lang.Object ref = isgood_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        isgood_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string isgood = 10;</code>
+     * @return The bytes for isgood.
+     */
+    public com.google.protobuf.ByteString
+        getIsgoodBytes() {
+      java.lang.Object ref = isgood_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        isgood_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string isgood = 10;</code>
+     * @param value The isgood to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsgood(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      isgood_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isgood = 10;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsgood() {
+      
+      isgood_ = getDefaultInstance().getIsgood();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string isgood = 10;</code>
+     * @param value The bytes for isgood to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsgoodBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      isgood_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object firstUpDatetime_ = "";
+    /**
+     * <code>string first_up_datetime = 11;</code>
+     * @return The firstUpDatetime.
+     */
+    public java.lang.String getFirstUpDatetime() {
+      java.lang.Object ref = firstUpDatetime_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        firstUpDatetime_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string first_up_datetime = 11;</code>
+     * @return The bytes for firstUpDatetime.
+     */
+    public com.google.protobuf.ByteString
+        getFirstUpDatetimeBytes() {
+      java.lang.Object ref = firstUpDatetime_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        firstUpDatetime_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string first_up_datetime = 11;</code>
+     * @param value The firstUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setFirstUpDatetime(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      firstUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string first_up_datetime = 11;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearFirstUpDatetime() {
+      
+      firstUpDatetime_ = getDefaultInstance().getFirstUpDatetime();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string first_up_datetime = 11;</code>
+     * @param value The bytes for firstUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setFirstUpDatetimeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      firstUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object lastUpDatetime_ = "";
+    /**
+     * <code>string last_up_datetime = 12;</code>
+     * @return The lastUpDatetime.
+     */
+    public java.lang.String getLastUpDatetime() {
+      java.lang.Object ref = lastUpDatetime_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        lastUpDatetime_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string last_up_datetime = 12;</code>
+     * @return The bytes for lastUpDatetime.
+     */
+    public com.google.protobuf.ByteString
+        getLastUpDatetimeBytes() {
+      java.lang.Object ref = lastUpDatetime_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        lastUpDatetime_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string last_up_datetime = 12;</code>
+     * @param value The lastUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLastUpDatetime(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      lastUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string last_up_datetime = 12;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearLastUpDatetime() {
+      
+      lastUpDatetime_ = getDefaultInstance().getLastUpDatetime();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string last_up_datetime = 12;</code>
+     * @param value The bytes for lastUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLastUpDatetimeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      lastUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object nextToLastUpDatetime_ = "";
+    /**
+     * <code>string next_to_last_up_datetime = 13;</code>
+     * @return The nextToLastUpDatetime.
+     */
+    public java.lang.String getNextToLastUpDatetime() {
+      java.lang.Object ref = nextToLastUpDatetime_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nextToLastUpDatetime_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string next_to_last_up_datetime = 13;</code>
+     * @return The bytes for nextToLastUpDatetime.
+     */
+    public com.google.protobuf.ByteString
+        getNextToLastUpDatetimeBytes() {
+      java.lang.Object ref = nextToLastUpDatetime_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nextToLastUpDatetime_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string next_to_last_up_datetime = 13;</code>
+     * @param value The nextToLastUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNextToLastUpDatetime(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nextToLastUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string next_to_last_up_datetime = 13;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNextToLastUpDatetime() {
+      
+      nextToLastUpDatetime_ = getDefaultInstance().getNextToLastUpDatetime();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string next_to_last_up_datetime = 13;</code>
+     * @param value The bytes for nextToLastUpDatetime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNextToLastUpDatetimeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nextToLastUpDatetime_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object videos_ = "";
+    /**
+     * <code>string videos = 14;</code>
+     * @return The videos.
+     */
+    public java.lang.String getVideos() {
+      java.lang.Object ref = videos_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        videos_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string videos = 14;</code>
+     * @return The bytes for videos.
+     */
+    public com.google.protobuf.ByteString
+        getVideosBytes() {
+      java.lang.Object ref = videos_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        videos_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string videos = 14;</code>
+     * @param value The videos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideos(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      videos_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string videos = 14;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideos() {
+      
+      videos_ = getDefaultInstance().getVideos();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string videos = 14;</code>
+     * @param value The bytes for videos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideosBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      videos_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object idols_ = "";
+    /**
+     * <code>string idols = 15;</code>
+     * @return The idols.
+     */
+    public java.lang.String getIdols() {
+      java.lang.Object ref = idols_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        idols_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string idols = 15;</code>
+     * @return The bytes for idols.
+     */
+    public com.google.protobuf.ByteString
+        getIdolsBytes() {
+      java.lang.Object ref = idols_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        idols_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string idols = 15;</code>
+     * @param value The idols to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdols(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      idols_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string idols = 15;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIdols() {
+      
+      idols_ = getDefaultInstance().getIdols();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string idols = 15;</code>
+     * @param value The bytes for idols to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdolsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      idols_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object fans_ = "";
+    /**
+     * <code>string fans = 16;</code>
+     * @return The fans.
+     */
+    public java.lang.String getFans() {
+      java.lang.Object ref = fans_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        fans_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string fans = 16;</code>
+     * @return The bytes for fans.
+     */
+    public com.google.protobuf.ByteString
+        getFansBytes() {
+      java.lang.Object ref = fans_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        fans_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string fans = 16;</code>
+     * @param value The fans to set.
+     * @return This builder for chaining.
+     */
+    public Builder setFans(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      fans_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string fans = 16;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearFans() {
+      
+      fans_ = getDefaultInstance().getFans();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string fans = 16;</code>
+     * @param value The bytes for fans to set.
+     * @return This builder for chaining.
+     */
+    public Builder setFansBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      fans_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object playCount_ = "";
+    /**
+     * <code>string play_count = 17;</code>
+     * @return The playCount.
+     */
+    public java.lang.String getPlayCount() {
+      java.lang.Object ref = playCount_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        playCount_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string play_count = 17;</code>
+     * @return The bytes for playCount.
+     */
+    public com.google.protobuf.ByteString
+        getPlayCountBytes() {
+      java.lang.Object ref = playCount_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        playCount_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string play_count = 17;</code>
+     * @param value The playCount to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPlayCount(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      playCount_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string play_count = 17;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPlayCount() {
+      
+      playCount_ = getDefaultInstance().getPlayCount();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string play_count = 17;</code>
+     * @param value The bytes for playCount to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPlayCountBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      playCount_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object playCountTotal_ = "";
+    /**
+     * <code>string play_count_total = 18;</code>
+     * @return The playCountTotal.
+     */
+    public java.lang.String getPlayCountTotal() {
+      java.lang.Object ref = playCountTotal_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        playCountTotal_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string play_count_total = 18;</code>
+     * @return The bytes for playCountTotal.
+     */
+    public com.google.protobuf.ByteString
+        getPlayCountTotalBytes() {
+      java.lang.Object ref = playCountTotal_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        playCountTotal_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string play_count_total = 18;</code>
+     * @param value The playCountTotal to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPlayCountTotal(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      playCountTotal_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string play_count_total = 18;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPlayCountTotal() {
+      
+      playCountTotal_ = getDefaultInstance().getPlayCountTotal();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string play_count_total = 18;</code>
+     * @param value The bytes for playCountTotal to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPlayCountTotalBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      playCountTotal_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalReward_ = "";
+    /**
+     * <code>string total_reward = 19;</code>
+     * @return The totalReward.
+     */
+    public java.lang.String getTotalReward() {
+      java.lang.Object ref = totalReward_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalReward_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_reward = 19;</code>
+     * @return The bytes for totalReward.
+     */
+    public com.google.protobuf.ByteString
+        getTotalRewardBytes() {
+      java.lang.Object ref = totalReward_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalReward_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_reward = 19;</code>
+     * @param value The totalReward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalReward(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalReward_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_reward = 19;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalReward() {
+      
+      totalReward_ = getDefaultInstance().getTotalReward();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_reward = 19;</code>
+     * @param value The bytes for totalReward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalRewardBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalReward_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object currentdayReward_ = "";
+    /**
+     * <code>string currentday_reward = 20;</code>
+     * @return The currentdayReward.
+     */
+    public java.lang.String getCurrentdayReward() {
+      java.lang.Object ref = currentdayReward_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        currentdayReward_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string currentday_reward = 20;</code>
+     * @return The bytes for currentdayReward.
+     */
+    public com.google.protobuf.ByteString
+        getCurrentdayRewardBytes() {
+      java.lang.Object ref = currentdayReward_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        currentdayReward_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string currentday_reward = 20;</code>
+     * @param value The currentdayReward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrentdayReward(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      currentdayReward_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string currentday_reward = 20;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCurrentdayReward() {
+      
+      currentdayReward_ = getDefaultInstance().getCurrentdayReward();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string currentday_reward = 20;</code>
+     * @param value The bytes for currentdayReward to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrentdayRewardBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      currentdayReward_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object rewardPerson_ = "";
+    /**
+     * <code>string reward_person = 21;</code>
+     * @return The rewardPerson.
+     */
+    public java.lang.String getRewardPerson() {
+      java.lang.Object ref = rewardPerson_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        rewardPerson_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string reward_person = 21;</code>
+     * @return The bytes for rewardPerson.
+     */
+    public com.google.protobuf.ByteString
+        getRewardPersonBytes() {
+      java.lang.Object ref = rewardPerson_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        rewardPerson_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string reward_person = 21;</code>
+     * @param value The rewardPerson to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRewardPerson(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      rewardPerson_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string reward_person = 21;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRewardPerson() {
+      
+      rewardPerson_ = getDefaultInstance().getRewardPerson();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string reward_person = 21;</code>
+     * @param value The bytes for rewardPerson to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRewardPersonBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      rewardPerson_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalRewardTimes_ = "";
+    /**
+     * <code>string total_reward_times = 22;</code>
+     * @return The totalRewardTimes.
+     */
+    public java.lang.String getTotalRewardTimes() {
+      java.lang.Object ref = totalRewardTimes_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalRewardTimes_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_reward_times = 22;</code>
+     * @return The bytes for totalRewardTimes.
+     */
+    public com.google.protobuf.ByteString
+        getTotalRewardTimesBytes() {
+      java.lang.Object ref = totalRewardTimes_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalRewardTimes_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_reward_times = 22;</code>
+     * @param value The totalRewardTimes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalRewardTimes(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalRewardTimes_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_reward_times = 22;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalRewardTimes() {
+      
+      totalRewardTimes_ = getDefaultInstance().getTotalRewardTimes();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_reward_times = 22;</code>
+     * @param value The bytes for totalRewardTimes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalRewardTimesBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalRewardTimes_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object rewardVideos_ = "";
+    /**
+     * <code>string reward_videos = 23;</code>
+     * @return The rewardVideos.
+     */
+    public java.lang.String getRewardVideos() {
+      java.lang.Object ref = rewardVideos_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        rewardVideos_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string reward_videos = 23;</code>
+     * @return The bytes for rewardVideos.
+     */
+    public com.google.protobuf.ByteString
+        getRewardVideosBytes() {
+      java.lang.Object ref = rewardVideos_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        rewardVideos_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string reward_videos = 23;</code>
+     * @param value The rewardVideos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRewardVideos(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      rewardVideos_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string reward_videos = 23;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRewardVideos() {
+      
+      rewardVideos_ = getDefaultInstance().getRewardVideos();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string reward_videos = 23;</code>
+     * @param value The bytes for rewardVideos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRewardVideosBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      rewardVideos_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalPrice_ = "";
+    /**
+     * <code>string total_price = 24;</code>
+     * @return The totalPrice.
+     */
+    public java.lang.String getTotalPrice() {
+      java.lang.Object ref = totalPrice_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalPrice_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_price = 24;</code>
+     * @return The bytes for totalPrice.
+     */
+    public com.google.protobuf.ByteString
+        getTotalPriceBytes() {
+      java.lang.Object ref = totalPrice_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalPrice_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_price = 24;</code>
+     * @param value The totalPrice to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPrice(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalPrice_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price = 24;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalPrice() {
+      
+      totalPrice_ = getDefaultInstance().getTotalPrice();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price = 24;</code>
+     * @param value The bytes for totalPrice to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPriceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalPrice_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object currentdayPrice_ = "";
+    /**
+     * <code>string currentday_price = 25;</code>
+     * @return The currentdayPrice.
+     */
+    public java.lang.String getCurrentdayPrice() {
+      java.lang.Object ref = currentdayPrice_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        currentdayPrice_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string currentday_price = 25;</code>
+     * @return The bytes for currentdayPrice.
+     */
+    public com.google.protobuf.ByteString
+        getCurrentdayPriceBytes() {
+      java.lang.Object ref = currentdayPrice_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        currentdayPrice_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string currentday_price = 25;</code>
+     * @param value The currentdayPrice to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrentdayPrice(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      currentdayPrice_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string currentday_price = 25;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCurrentdayPrice() {
+      
+      currentdayPrice_ = getDefaultInstance().getCurrentdayPrice();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string currentday_price = 25;</code>
+     * @param value The bytes for currentdayPrice to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrentdayPriceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      currentdayPrice_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalPriceTimes_ = "";
+    /**
+     * <code>string total_price_times = 26;</code>
+     * @return The totalPriceTimes.
+     */
+    public java.lang.String getTotalPriceTimes() {
+      java.lang.Object ref = totalPriceTimes_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalPriceTimes_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_price_times = 26;</code>
+     * @return The bytes for totalPriceTimes.
+     */
+    public com.google.protobuf.ByteString
+        getTotalPriceTimesBytes() {
+      java.lang.Object ref = totalPriceTimes_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalPriceTimes_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_price_times = 26;</code>
+     * @param value The totalPriceTimes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPriceTimes(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalPriceTimes_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_times = 26;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalPriceTimes() {
+      
+      totalPriceTimes_ = getDefaultInstance().getTotalPriceTimes();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_times = 26;</code>
+     * @param value The bytes for totalPriceTimes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPriceTimesBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalPriceTimes_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalPricePerson_ = "";
+    /**
+     * <code>string total_price_person = 27;</code>
+     * @return The totalPricePerson.
+     */
+    public java.lang.String getTotalPricePerson() {
+      java.lang.Object ref = totalPricePerson_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalPricePerson_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_price_person = 27;</code>
+     * @return The bytes for totalPricePerson.
+     */
+    public com.google.protobuf.ByteString
+        getTotalPricePersonBytes() {
+      java.lang.Object ref = totalPricePerson_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalPricePerson_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_price_person = 27;</code>
+     * @param value The totalPricePerson to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPricePerson(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalPricePerson_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_person = 27;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalPricePerson() {
+      
+      totalPricePerson_ = getDefaultInstance().getTotalPricePerson();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_person = 27;</code>
+     * @param value The bytes for totalPricePerson to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPricePersonBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalPricePerson_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object totalPriceVideos_ = "";
+    /**
+     * <code>string total_price_videos = 28;</code>
+     * @return The totalPriceVideos.
+     */
+    public java.lang.String getTotalPriceVideos() {
+      java.lang.Object ref = totalPriceVideos_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        totalPriceVideos_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string total_price_videos = 28;</code>
+     * @return The bytes for totalPriceVideos.
+     */
+    public com.google.protobuf.ByteString
+        getTotalPriceVideosBytes() {
+      java.lang.Object ref = totalPriceVideos_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        totalPriceVideos_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string total_price_videos = 28;</code>
+     * @param value The totalPriceVideos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPriceVideos(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      totalPriceVideos_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_videos = 28;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalPriceVideos() {
+      
+      totalPriceVideos_ = getDefaultInstance().getTotalPriceVideos();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string total_price_videos = 28;</code>
+     * @param value The bytes for totalPriceVideos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalPriceVideosBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      totalPriceVideos_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object cgrainUserType_ = "";
+    /**
+     * <code>string cgrain_user_type = 29;</code>
+     * @return The cgrainUserType.
+     */
+    public java.lang.String getCgrainUserType() {
+      java.lang.Object ref = cgrainUserType_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        cgrainUserType_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string cgrain_user_type = 29;</code>
+     * @return The bytes for cgrainUserType.
+     */
+    public com.google.protobuf.ByteString
+        getCgrainUserTypeBytes() {
+      java.lang.Object ref = cgrainUserType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        cgrainUserType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string cgrain_user_type = 29;</code>
+     * @param value The cgrainUserType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCgrainUserType(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      cgrainUserType_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string cgrain_user_type = 29;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCgrainUserType() {
+      
+      cgrainUserType_ = getDefaultInstance().getCgrainUserType();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string cgrain_user_type = 29;</code>
+     * @param value The bytes for cgrainUserType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCgrainUserTypeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      cgrainUserType_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object identityTagname_ = "";
+    /**
+     * <code>string identity_tagname = 30;</code>
+     * @return The identityTagname.
+     */
+    public java.lang.String getIdentityTagname() {
+      java.lang.Object ref = identityTagname_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        identityTagname_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string identity_tagname = 30;</code>
+     * @return The bytes for identityTagname.
+     */
+    public com.google.protobuf.ByteString
+        getIdentityTagnameBytes() {
+      java.lang.Object ref = identityTagname_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        identityTagname_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string identity_tagname = 30;</code>
+     * @param value The identityTagname to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityTagname(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      identityTagname_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_tagname = 30;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIdentityTagname() {
+      
+      identityTagname_ = getDefaultInstance().getIdentityTagname();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_tagname = 30;</code>
+     * @param value The bytes for identityTagname to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityTagnameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      identityTagname_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object operationTags_ = "";
+    /**
+     * <code>string operation_tags = 31;</code>
+     * @return The operationTags.
+     */
+    public java.lang.String getOperationTags() {
+      java.lang.Object ref = operationTags_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        operationTags_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string operation_tags = 31;</code>
+     * @return The bytes for operationTags.
+     */
+    public com.google.protobuf.ByteString
+        getOperationTagsBytes() {
+      java.lang.Object ref = operationTags_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        operationTags_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string operation_tags = 31;</code>
+     * @param value The operationTags to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOperationTags(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      operationTags_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string operation_tags = 31;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearOperationTags() {
+      
+      operationTags_ = getDefaultInstance().getOperationTags();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string operation_tags = 31;</code>
+     * @param value The bytes for operationTags to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOperationTagsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      operationTags_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object identityTagId_ = "";
+    /**
+     * <code>string identity_tag_id = 32;</code>
+     * @return The identityTagId.
+     */
+    public java.lang.String getIdentityTagId() {
+      java.lang.Object ref = identityTagId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        identityTagId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string identity_tag_id = 32;</code>
+     * @return The bytes for identityTagId.
+     */
+    public com.google.protobuf.ByteString
+        getIdentityTagIdBytes() {
+      java.lang.Object ref = identityTagId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        identityTagId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string identity_tag_id = 32;</code>
+     * @param value The identityTagId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityTagId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      identityTagId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_tag_id = 32;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIdentityTagId() {
+      
+      identityTagId_ = getDefaultInstance().getIdentityTagId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_tag_id = 32;</code>
+     * @param value The bytes for identityTagId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityTagIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      identityTagId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object identityCreateTime_ = "";
+    /**
+     * <code>string identity_create_time = 33;</code>
+     * @return The identityCreateTime.
+     */
+    public java.lang.String getIdentityCreateTime() {
+      java.lang.Object ref = identityCreateTime_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        identityCreateTime_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string identity_create_time = 33;</code>
+     * @return The bytes for identityCreateTime.
+     */
+    public com.google.protobuf.ByteString
+        getIdentityCreateTimeBytes() {
+      java.lang.Object ref = identityCreateTime_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        identityCreateTime_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string identity_create_time = 33;</code>
+     * @param value The identityCreateTime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityCreateTime(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      identityCreateTime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_create_time = 33;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIdentityCreateTime() {
+      
+      identityCreateTime_ = getDefaultInstance().getIdentityCreateTime();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string identity_create_time = 33;</code>
+     * @param value The bytes for identityCreateTime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdentityCreateTimeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      identityCreateTime_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object country_ = "";
+    /**
+     * <code>string country = 34;</code>
+     * @return The country.
+     */
+    public java.lang.String getCountry() {
+      java.lang.Object ref = country_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        country_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string country = 34;</code>
+     * @return The bytes for country.
+     */
+    public com.google.protobuf.ByteString
+        getCountryBytes() {
+      java.lang.Object ref = country_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        country_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string country = 34;</code>
+     * @param value The country to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCountry(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      country_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string country = 34;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCountry() {
+      
+      country_ = getDefaultInstance().getCountry();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string country = 34;</code>
+     * @param value The bytes for country to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCountryBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      country_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object province_ = "";
+    /**
+     * <code>string province = 35;</code>
+     * @return The province.
+     */
+    public java.lang.String getProvince() {
+      java.lang.Object ref = province_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        province_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string province = 35;</code>
+     * @return The bytes for province.
+     */
+    public com.google.protobuf.ByteString
+        getProvinceBytes() {
+      java.lang.Object ref = province_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        province_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string province = 35;</code>
+     * @param value The province to set.
+     * @return This builder for chaining.
+     */
+    public Builder setProvince(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      province_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string province = 35;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearProvince() {
+      
+      province_ = getDefaultInstance().getProvince();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string province = 35;</code>
+     * @param value The bytes for province to set.
+     * @return This builder for chaining.
+     */
+    public Builder setProvinceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      province_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object city_ = "";
+    /**
+     * <code>string city = 36;</code>
+     * @return The city.
+     */
+    public java.lang.String getCity() {
+      java.lang.Object ref = city_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        city_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string city = 36;</code>
+     * @return The bytes for city.
+     */
+    public com.google.protobuf.ByteString
+        getCityBytes() {
+      java.lang.Object ref = city_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        city_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string city = 36;</code>
+     * @param value The city to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCity(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      city_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string city = 36;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCity() {
+      
+      city_ = getDefaultInstance().getCity();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string city = 36;</code>
+     * @param value The bytes for city to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCityBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      city_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day1CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day1CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     * @return Whether the day1CntFeatures field is set.
+     */
+    public boolean hasDay1CntFeatures() {
+      return day1CntFeaturesBuilder_ != null || day1CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     * @return The day1CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures() {
+      if (day1CntFeaturesBuilder_ == null) {
+        return day1CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+      } else {
+        return day1CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public Builder setDay1CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day1CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day1CntFeatures_ = value;
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public Builder setDay1CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public Builder mergeDay1CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day1CntFeaturesBuilder_ == null) {
+        if (day1CntFeatures_ != null) {
+          day1CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day1CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day1CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day1CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public Builder clearDay1CntFeatures() {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = null;
+        onChanged();
+      } else {
+        day1CntFeatures_ = null;
+        day1CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay1CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay1CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder() {
+      if (day1CntFeaturesBuilder_ != null) {
+        return day1CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day1CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay1CntFeaturesFieldBuilder() {
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay1CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day1CntFeatures_ = null;
+      }
+      return day1CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day3CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day3CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     * @return Whether the day3CntFeatures field is set.
+     */
+    public boolean hasDay3CntFeatures() {
+      return day3CntFeaturesBuilder_ != null || day3CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     * @return The day3CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures() {
+      if (day3CntFeaturesBuilder_ == null) {
+        return day3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+      } else {
+        return day3CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public Builder setDay3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day3CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day3CntFeatures_ = value;
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public Builder setDay3CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public Builder mergeDay3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day3CntFeaturesBuilder_ == null) {
+        if (day3CntFeatures_ != null) {
+          day3CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day3CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day3CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day3CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public Builder clearDay3CntFeatures() {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = null;
+        onChanged();
+      } else {
+        day3CntFeatures_ = null;
+        day3CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay3CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay3CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder() {
+      if (day3CntFeaturesBuilder_ != null) {
+        return day3CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day3CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay3CntFeaturesFieldBuilder() {
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay3CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day3CntFeatures_ = null;
+      }
+      return day3CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day7CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> day7CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     * @return Whether the day7CntFeatures field is set.
+     */
+    public boolean hasDay7CntFeatures() {
+      return day7CntFeaturesBuilder_ != null || day7CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     * @return The day7CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures() {
+      if (day7CntFeaturesBuilder_ == null) {
+        return day7CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+      } else {
+        return day7CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public Builder setDay7CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day7CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        day7CntFeatures_ = value;
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public Builder setDay7CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public Builder mergeDay7CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (day7CntFeaturesBuilder_ == null) {
+        if (day7CntFeatures_ != null) {
+          day7CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(day7CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          day7CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        day7CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public Builder clearDay7CntFeatures() {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = null;
+        onChanged();
+      } else {
+        day7CntFeatures_ = null;
+        day7CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getDay7CntFeaturesBuilder() {
+      
+      onChanged();
+      return getDay7CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder() {
+      if (day7CntFeaturesBuilder_ != null) {
+        return day7CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return day7CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getDay7CntFeaturesFieldBuilder() {
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getDay7CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        day7CntFeatures_ = null;
+      }
+      return day7CntFeaturesBuilder_;
+    }
+
+    private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto month3CntFeatures_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> month3CntFeaturesBuilder_;
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     * @return Whether the month3CntFeatures field is set.
+     */
+    public boolean hasMonth3CntFeatures() {
+      return month3CntFeaturesBuilder_ != null || month3CntFeatures_ != null;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     * @return The month3CntFeatures.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures() {
+      if (month3CntFeaturesBuilder_ == null) {
+        return month3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+      } else {
+        return month3CntFeaturesBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public Builder setMonth3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (month3CntFeaturesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        month3CntFeatures_ = value;
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public Builder setMonth3CntFeatures(
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder builderForValue) {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = builderForValue.build();
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public Builder mergeMonth3CntFeatures(com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto value) {
+      if (month3CntFeaturesBuilder_ == null) {
+        if (month3CntFeatures_ != null) {
+          month3CntFeatures_ =
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.newBuilder(month3CntFeatures_).mergeFrom(value).buildPartial();
+        } else {
+          month3CntFeatures_ = value;
+        }
+        onChanged();
+      } else {
+        month3CntFeaturesBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public Builder clearMonth3CntFeatures() {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = null;
+        onChanged();
+      } else {
+        month3CntFeatures_ = null;
+        month3CntFeaturesBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder getMonth3CntFeaturesBuilder() {
+      
+      onChanged();
+      return getMonth3CntFeaturesFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder() {
+      if (month3CntFeaturesBuilder_ != null) {
+        return month3CntFeaturesBuilder_.getMessageOrBuilder();
+      } else {
+        return month3CntFeatures_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
+      }
+    }
+    /**
+     * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder> 
+        getMonth3CntFeaturesFieldBuilder() {
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeaturesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder>(
+                getMonth3CntFeatures(),
+                getParentForChildren(),
+                isClean());
+        month3CntFeatures_ = null;
+      }
+      return month3CntFeaturesBuilder_;
+    }
+    @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:UserAdFeatureProto)
+  }
+
+  // @@protoc_insertion_point(class_scope:UserAdFeatureProto)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<UserAdFeatureProto>
+      PARSER = new com.google.protobuf.AbstractParser<UserAdFeatureProto>() {
+    @java.lang.Override
+    public UserAdFeatureProto parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new UserAdFeatureProto(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<UserAdFeatureProto> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<UserAdFeatureProto> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 501 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProtoOrBuilder.java

@@ -0,0 +1,501 @@
+// 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 UserAdFeatureProtoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:UserAdFeatureProto)
+    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();
+
+  /**
+   * <code>string gender = 2;</code>
+   * @return The gender.
+   */
+  java.lang.String getGender();
+  /**
+   * <code>string gender = 2;</code>
+   * @return The bytes for gender.
+   */
+  com.google.protobuf.ByteString
+      getGenderBytes();
+
+  /**
+   * <code>string user_type = 3;</code>
+   * @return The userType.
+   */
+  java.lang.String getUserType();
+  /**
+   * <code>string user_type = 3;</code>
+   * @return The bytes for userType.
+   */
+  com.google.protobuf.ByteString
+      getUserTypeBytes();
+
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The gmtCreate.
+   */
+  java.lang.String getGmtCreate();
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The bytes for gmtCreate.
+   */
+  com.google.protobuf.ByteString
+      getGmtCreateBytes();
+
+  /**
+   * <code>string tags = 5;</code>
+   * @return The tags.
+   */
+  java.lang.String getTags();
+  /**
+   * <code>string tags = 5;</code>
+   * @return The bytes for tags.
+   */
+  com.google.protobuf.ByteString
+      getTagsBytes();
+
+  /**
+   * <code>string category_name = 6;</code>
+   * @return The categoryName.
+   */
+  java.lang.String getCategoryName();
+  /**
+   * <code>string category_name = 6;</code>
+   * @return The bytes for categoryName.
+   */
+  com.google.protobuf.ByteString
+      getCategoryNameBytes();
+
+  /**
+   * <code>string isvip = 7;</code>
+   * @return The isvip.
+   */
+  java.lang.String getIsvip();
+  /**
+   * <code>string isvip = 7;</code>
+   * @return The bytes for isvip.
+   */
+  com.google.protobuf.ByteString
+      getIsvipBytes();
+
+  /**
+   * <code>string isreward = 8;</code>
+   * @return The isreward.
+   */
+  java.lang.String getIsreward();
+  /**
+   * <code>string isreward = 8;</code>
+   * @return The bytes for isreward.
+   */
+  com.google.protobuf.ByteString
+      getIsrewardBytes();
+
+  /**
+   * <code>string isad = 9;</code>
+   * @return The isad.
+   */
+  java.lang.String getIsad();
+  /**
+   * <code>string isad = 9;</code>
+   * @return The bytes for isad.
+   */
+  com.google.protobuf.ByteString
+      getIsadBytes();
+
+  /**
+   * <code>string isgood = 10;</code>
+   * @return The isgood.
+   */
+  java.lang.String getIsgood();
+  /**
+   * <code>string isgood = 10;</code>
+   * @return The bytes for isgood.
+   */
+  com.google.protobuf.ByteString
+      getIsgoodBytes();
+
+  /**
+   * <code>string first_up_datetime = 11;</code>
+   * @return The firstUpDatetime.
+   */
+  java.lang.String getFirstUpDatetime();
+  /**
+   * <code>string first_up_datetime = 11;</code>
+   * @return The bytes for firstUpDatetime.
+   */
+  com.google.protobuf.ByteString
+      getFirstUpDatetimeBytes();
+
+  /**
+   * <code>string last_up_datetime = 12;</code>
+   * @return The lastUpDatetime.
+   */
+  java.lang.String getLastUpDatetime();
+  /**
+   * <code>string last_up_datetime = 12;</code>
+   * @return The bytes for lastUpDatetime.
+   */
+  com.google.protobuf.ByteString
+      getLastUpDatetimeBytes();
+
+  /**
+   * <code>string next_to_last_up_datetime = 13;</code>
+   * @return The nextToLastUpDatetime.
+   */
+  java.lang.String getNextToLastUpDatetime();
+  /**
+   * <code>string next_to_last_up_datetime = 13;</code>
+   * @return The bytes for nextToLastUpDatetime.
+   */
+  com.google.protobuf.ByteString
+      getNextToLastUpDatetimeBytes();
+
+  /**
+   * <code>string videos = 14;</code>
+   * @return The videos.
+   */
+  java.lang.String getVideos();
+  /**
+   * <code>string videos = 14;</code>
+   * @return The bytes for videos.
+   */
+  com.google.protobuf.ByteString
+      getVideosBytes();
+
+  /**
+   * <code>string idols = 15;</code>
+   * @return The idols.
+   */
+  java.lang.String getIdols();
+  /**
+   * <code>string idols = 15;</code>
+   * @return The bytes for idols.
+   */
+  com.google.protobuf.ByteString
+      getIdolsBytes();
+
+  /**
+   * <code>string fans = 16;</code>
+   * @return The fans.
+   */
+  java.lang.String getFans();
+  /**
+   * <code>string fans = 16;</code>
+   * @return The bytes for fans.
+   */
+  com.google.protobuf.ByteString
+      getFansBytes();
+
+  /**
+   * <code>string play_count = 17;</code>
+   * @return The playCount.
+   */
+  java.lang.String getPlayCount();
+  /**
+   * <code>string play_count = 17;</code>
+   * @return The bytes for playCount.
+   */
+  com.google.protobuf.ByteString
+      getPlayCountBytes();
+
+  /**
+   * <code>string play_count_total = 18;</code>
+   * @return The playCountTotal.
+   */
+  java.lang.String getPlayCountTotal();
+  /**
+   * <code>string play_count_total = 18;</code>
+   * @return The bytes for playCountTotal.
+   */
+  com.google.protobuf.ByteString
+      getPlayCountTotalBytes();
+
+  /**
+   * <code>string total_reward = 19;</code>
+   * @return The totalReward.
+   */
+  java.lang.String getTotalReward();
+  /**
+   * <code>string total_reward = 19;</code>
+   * @return The bytes for totalReward.
+   */
+  com.google.protobuf.ByteString
+      getTotalRewardBytes();
+
+  /**
+   * <code>string currentday_reward = 20;</code>
+   * @return The currentdayReward.
+   */
+  java.lang.String getCurrentdayReward();
+  /**
+   * <code>string currentday_reward = 20;</code>
+   * @return The bytes for currentdayReward.
+   */
+  com.google.protobuf.ByteString
+      getCurrentdayRewardBytes();
+
+  /**
+   * <code>string reward_person = 21;</code>
+   * @return The rewardPerson.
+   */
+  java.lang.String getRewardPerson();
+  /**
+   * <code>string reward_person = 21;</code>
+   * @return The bytes for rewardPerson.
+   */
+  com.google.protobuf.ByteString
+      getRewardPersonBytes();
+
+  /**
+   * <code>string total_reward_times = 22;</code>
+   * @return The totalRewardTimes.
+   */
+  java.lang.String getTotalRewardTimes();
+  /**
+   * <code>string total_reward_times = 22;</code>
+   * @return The bytes for totalRewardTimes.
+   */
+  com.google.protobuf.ByteString
+      getTotalRewardTimesBytes();
+
+  /**
+   * <code>string reward_videos = 23;</code>
+   * @return The rewardVideos.
+   */
+  java.lang.String getRewardVideos();
+  /**
+   * <code>string reward_videos = 23;</code>
+   * @return The bytes for rewardVideos.
+   */
+  com.google.protobuf.ByteString
+      getRewardVideosBytes();
+
+  /**
+   * <code>string total_price = 24;</code>
+   * @return The totalPrice.
+   */
+  java.lang.String getTotalPrice();
+  /**
+   * <code>string total_price = 24;</code>
+   * @return The bytes for totalPrice.
+   */
+  com.google.protobuf.ByteString
+      getTotalPriceBytes();
+
+  /**
+   * <code>string currentday_price = 25;</code>
+   * @return The currentdayPrice.
+   */
+  java.lang.String getCurrentdayPrice();
+  /**
+   * <code>string currentday_price = 25;</code>
+   * @return The bytes for currentdayPrice.
+   */
+  com.google.protobuf.ByteString
+      getCurrentdayPriceBytes();
+
+  /**
+   * <code>string total_price_times = 26;</code>
+   * @return The totalPriceTimes.
+   */
+  java.lang.String getTotalPriceTimes();
+  /**
+   * <code>string total_price_times = 26;</code>
+   * @return The bytes for totalPriceTimes.
+   */
+  com.google.protobuf.ByteString
+      getTotalPriceTimesBytes();
+
+  /**
+   * <code>string total_price_person = 27;</code>
+   * @return The totalPricePerson.
+   */
+  java.lang.String getTotalPricePerson();
+  /**
+   * <code>string total_price_person = 27;</code>
+   * @return The bytes for totalPricePerson.
+   */
+  com.google.protobuf.ByteString
+      getTotalPricePersonBytes();
+
+  /**
+   * <code>string total_price_videos = 28;</code>
+   * @return The totalPriceVideos.
+   */
+  java.lang.String getTotalPriceVideos();
+  /**
+   * <code>string total_price_videos = 28;</code>
+   * @return The bytes for totalPriceVideos.
+   */
+  com.google.protobuf.ByteString
+      getTotalPriceVideosBytes();
+
+  /**
+   * <code>string cgrain_user_type = 29;</code>
+   * @return The cgrainUserType.
+   */
+  java.lang.String getCgrainUserType();
+  /**
+   * <code>string cgrain_user_type = 29;</code>
+   * @return The bytes for cgrainUserType.
+   */
+  com.google.protobuf.ByteString
+      getCgrainUserTypeBytes();
+
+  /**
+   * <code>string identity_tagname = 30;</code>
+   * @return The identityTagname.
+   */
+  java.lang.String getIdentityTagname();
+  /**
+   * <code>string identity_tagname = 30;</code>
+   * @return The bytes for identityTagname.
+   */
+  com.google.protobuf.ByteString
+      getIdentityTagnameBytes();
+
+  /**
+   * <code>string operation_tags = 31;</code>
+   * @return The operationTags.
+   */
+  java.lang.String getOperationTags();
+  /**
+   * <code>string operation_tags = 31;</code>
+   * @return The bytes for operationTags.
+   */
+  com.google.protobuf.ByteString
+      getOperationTagsBytes();
+
+  /**
+   * <code>string identity_tag_id = 32;</code>
+   * @return The identityTagId.
+   */
+  java.lang.String getIdentityTagId();
+  /**
+   * <code>string identity_tag_id = 32;</code>
+   * @return The bytes for identityTagId.
+   */
+  com.google.protobuf.ByteString
+      getIdentityTagIdBytes();
+
+  /**
+   * <code>string identity_create_time = 33;</code>
+   * @return The identityCreateTime.
+   */
+  java.lang.String getIdentityCreateTime();
+  /**
+   * <code>string identity_create_time = 33;</code>
+   * @return The bytes for identityCreateTime.
+   */
+  com.google.protobuf.ByteString
+      getIdentityCreateTimeBytes();
+
+  /**
+   * <code>string country = 34;</code>
+   * @return The country.
+   */
+  java.lang.String getCountry();
+  /**
+   * <code>string country = 34;</code>
+   * @return The bytes for country.
+   */
+  com.google.protobuf.ByteString
+      getCountryBytes();
+
+  /**
+   * <code>string province = 35;</code>
+   * @return The province.
+   */
+  java.lang.String getProvince();
+  /**
+   * <code>string province = 35;</code>
+   * @return The bytes for province.
+   */
+  com.google.protobuf.ByteString
+      getProvinceBytes();
+
+  /**
+   * <code>string city = 36;</code>
+   * @return The city.
+   */
+  java.lang.String getCity();
+  /**
+   * <code>string city = 36;</code>
+   * @return The bytes for city.
+   */
+  com.google.protobuf.ByteString
+      getCityBytes();
+
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return Whether the day1CntFeatures field is set.
+   */
+  boolean hasDay1CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return The day1CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay1CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return Whether the day3CntFeatures field is set.
+   */
+  boolean hasDay3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return The day3CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return Whether the day7CntFeatures field is set.
+   */
+  boolean hasDay7CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return The day7CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder();
+
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return Whether the month3CntFeatures field is set.
+   */
+  boolean hasMonth3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return The month3CntFeatures.
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures();
+  /**
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder();
+}

+ 98 - 0
recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto

@@ -74,7 +74,105 @@ message UserActionFeatureProto{
 
 }
 
+message UserAdFeatureProto {
+    string mid = 1;
+    string gender = 2;
+    string user_type = 3;
+    string gmt_create = 4;
+    string tags = 5;
+    string category_name = 6;
+    string isvip = 7;
+    string isreward = 8;
+    string isad = 9;
+    string isgood = 10;
+    string first_up_datetime = 11;
+    string last_up_datetime = 12;
+    string next_to_last_up_datetime = 13;
+    string videos = 14;
+    string idols = 15;
+    string fans = 16;
+    string play_count = 17;
+    string play_count_total = 18;
+    string total_reward = 19;
+    string currentday_reward = 20;
+    string reward_person = 21;
+    string total_reward_times = 22;
+    string reward_videos = 23;
+    string total_price = 24;
+    string currentday_price = 25;
+    string total_price_times = 26;
+    string total_price_person = 27;
+    string total_price_videos = 28;
+    string cgrain_user_type = 29;
+    string identity_tagname = 30;
+    string operation_tags = 31;
+    string identity_tag_id = 32;
+    string identity_create_time = 33;
+    string country = 34;
+    string province = 35;
+    string city = 36;
+    AdActionFeatureProto day1_cnt_features = 37;
+    AdActionFeatureProto day3_cnt_features = 38;
+    AdActionFeatureProto day7_cnt_features = 39;
+    AdActionFeatureProto month3_cnt_features = 40;
+}
+
+message AdActionFeatureProto {
+    double adView = 1;
+    double adClick = 2;
+    double adConversion = 3;
+    double ctr = 4;
+    double cvr = 5;
+}
+
+message GetUserAdFeatureRequest {
+  string mid = 1;
+}
+
+message GetUserAdFeatureResponse {
+  Result result = 1;
+  UserAdFeatureProto user_ad_feature = 2;
+}
+
+message AdItemFeatureProto {
+    string adId = 1;
+    string adCode = 2;
+    string advertiserId = 3;
+    string advertiserCode = 4;
+    string campaignId = 5;
+    string campaignCode = 6;
+    string creativeId = 7;
+    string creativeCode = 8;
+    AdActionFeatureProto day1_cnt_features = 9;
+    AdActionFeatureProto day3_cnt_features = 10;
+    AdActionFeatureProto day7_cnt_features = 11;
+    AdActionFeatureProto month3_cnt_features = 12;
+}
+
+
+
+message GetAdItemFeatureRequest {
+  string ad_id = 1;
+}
+
+message GetAdItemFeatureResponse {
+  Result result = 1;
+  AdItemFeatureProto ad_item_feature = 2;
+}
+
+message GetAllAdItemFeatureRequest {
+  repeated string ad_id = 1;
+}
+
+message GetAllAdItemFeatureResponse {
+  Result result = 1;
+  repeated AdItemFeatureProto ad_item_feature = 2;
+}
+
 service FeatureService {
+  rpc GetUserAdFeature (GetUserAdFeatureRequest) returns (GetUserAdFeatureResponse);
+  rpc GetAdItemFeature (GetAdItemFeatureRequest) returns (GetAdItemFeatureResponse);
+  rpc GETAllAdItemFeature (GetAllAdItemFeatureRequest) returns (GetAllAdItemFeatureResponse);
   rpc GetUserFeature (GetUserFeatureRequest) returns (GetUserFeatureResponse);
   rpc GetVideoFeature (GetVideoFeatureRequest) returns (GetVideoFeatureResponse);
   rpc GetAllVideoFeature (GetAllVideoFeatureRequest) returns (GetAllVideoFeatureResponse);

+ 72 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdActionFeature.java

@@ -0,0 +1,72 @@
+package com.tzld.piaoquan.recommend.feature.model;
+
+import lombok.Data;
+
+@Data
+public class AdActionFeature {
+    private double adView;
+    private double adClick;
+    private double adConversion;
+
+    private double ctr;
+    private double cvr;
+
+    private double ceilLog(Double key) {
+        return Math.ceil(Math.log(key));
+    }
+
+    private double bucketRatioFeature(Double key) {
+        long bucket = Math.round(Math.log(key * 100));
+        if (bucket > 100)
+            bucket = 100;
+        return (double) bucket;
+    }
+
+
+    public void setAdView(Object key) {
+        if (key == null) {
+            this.adView = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "-1");
+            this.adView = ceilLog(Double.valueOf(formateKey));
+        }
+    }
+
+    public void setAdClick(Object key) {
+        if (key == null) {
+            this.adClick = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "-1");
+            this.adClick = ceilLog(Double.valueOf(formateKey));
+        }
+    }
+
+    public void setAdConversion(Object key) {
+        if (key == null) {
+            this.adConversion = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "-1");
+            this.adConversion = ceilLog(Double.valueOf(formateKey));
+        }
+    }
+
+    public void setCtr(Object key) {
+        if (key == null) {
+            this.ctr = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "-1");
+            this.ctr = bucketRatioFeature(Double.valueOf(formateKey));
+        }
+    }
+
+    public void setCvr(Object key) {
+        if (key == null) {
+            this.cvr = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "-1");
+            this.cvr = bucketRatioFeature(Double.valueOf(formateKey));
+        }
+    }
+
+
+}

+ 86 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdItemFeature.java

@@ -0,0 +1,86 @@
+package com.tzld.piaoquan.recommend.feature.model;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@NoArgsConstructor
+public class AdItemFeature {
+    @Setter
+    @NotNull
+    private String adId = "0";
+
+    @Setter
+    @NotNull
+    private String adCode = "0";
+
+    @Setter
+    @NotNull
+    private String advertiserId = "0";
+    @Setter
+    @NotNull
+    private String advertiserCode = "0";
+    @Setter
+    @NotNull
+    private String campaignId = "0";
+
+    @Setter
+    @NotNull
+    private String campaignCode = "0";
+
+    @Setter
+    @NotNull
+    private String creativeId = "0";
+
+    @Setter
+    @NotNull
+    private String creativeCode = "0";
+
+
+
+    // 当天统计量信息
+    private AdActionFeature day1_cnt_features;
+    // 3天内统计量
+    private AdActionFeature day3_cnt_features;
+    // 7天内统计量
+    private AdActionFeature day7_cnt_features;
+    // 3个月统计量
+    private AdActionFeature month3_cnt_features;
+
+
+    public void setDay1_cnt_features(AdActionFeature feature) {
+        this.day1_cnt_features = feature;
+    }
+
+
+    public void setDay3_cnt_features(AdActionFeature feature) {
+        this.day3_cnt_features = feature;
+
+    }
+
+    public void setDay7_cnt_features(AdActionFeature feature) {
+        this.day7_cnt_features = feature;
+
+    }
+
+    public void setMonth3_cnt_features(AdActionFeature feature) {
+        this.month3_cnt_features = feature;
+
+    }
+
+    public String getKey() {
+        return this.adId;
+    }
+
+    public String getValue() {
+        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
+        return gson.toJson(this);
+    }
+
+
+}

+ 113 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/UserAdFeature.java

@@ -0,0 +1,113 @@
+package com.tzld.piaoquan.recommend.feature.model;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@NoArgsConstructor
+@Setter
+@NotNull
+public class UserAdFeature {
+
+    private String mid = "0";
+
+    private String gender = "0";
+
+    private String user_type = "0";
+
+    private String gmt_create = "0";
+
+    private String tags = "0";
+
+    private String category_name = "0";
+
+    private String isvip = "0";
+
+    private String isreward = "0";
+
+    private String isad = "0";
+
+    private String isgood = "0";
+
+    private String first_up_datetime = "0";
+    private String last_up_datetime = "0";
+    private String next_to_last_up_datetime = "0";
+    private String videos = "0"; // 上传视频数量
+    private String idols = "0"; // 关注人数
+    private String fans = "0";  // 粉丝数
+    private String play_count = "0";  // 播放人数
+    private String play_count_total = "0";  // 累计播放次数
+
+    private String total_reward = "0";
+    private String currentday_reward = "0";
+    private String reward_person = "0";
+    private String total_reward_times = "0";
+
+    private String reward_videos = "0";
+    private String total_price = "0";
+    private String currentday_price = "0";
+    private String total_price_times = "0";
+    private String total_price_person = "0";
+    private String total_price_videos = "0";
+    private String cgrain_user_type = "0";
+    private String identity_tagname = "0";
+
+
+    private String operation_tags = "0";
+    private String identity_tag_id = "0";
+    private String identity_create_time = "0";
+    private String country = "0";
+    private String province = "0";
+    private String city = "0";
+
+
+    // 当天统计量信息
+    private AdActionFeature day1_cnt_features;
+    // 3天内统计量
+    private AdActionFeature day3_cnt_features;
+    // 7天内统计量
+    private AdActionFeature day7_cnt_features;
+    // 3个月统计量
+    private AdActionFeature month3_cnt_features;
+
+
+    public void setDay1_cnt_features(AdActionFeature key) {
+        this.day1_cnt_features = key;
+        if (key == null)
+            this.day1_cnt_features = new AdActionFeature();
+    }
+
+    public void setDay3_cnt_features(AdActionFeature key) {
+        this.day3_cnt_features = key;
+        if (key == null)
+            this.day3_cnt_features = new AdActionFeature();
+    }
+
+    public void setDay7_cnt_features(AdActionFeature key) {
+        this.day7_cnt_features = key;
+        if (key == null)
+            this.day7_cnt_features = new AdActionFeature();
+    }
+
+    public void setMonth3_cnt_features(AdActionFeature key) {
+        this.month3_cnt_features = key;
+        if (key == null)
+            this.month3_cnt_features = new AdActionFeature();
+    }
+
+
+    public String getKey() {
+        return this.mid;
+    }
+
+    public String getValue() {
+        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
+        return gson.toJson(this);
+    }
+
+}

+ 71 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/AdItemFeatureService.java

@@ -0,0 +1,71 @@
+package com.tzld.piaoquan.recommend.feature.service;
+
+import com.google.common.reflect.TypeToken;
+import com.tzld.piaoquan.recommend.feature.model.AdItemFeature;
+import com.tzld.piaoquan.recommend.feature.model.common.Result;
+import com.tzld.piaoquan.recommend.feature.model.feature.*;
+import com.tzld.piaoquan.recommend.feature.util.CommonCollectionUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class AdItemFeatureService  extends AbstractFeatureService<String, AdItemFeature> {
+
+    public AdItemFeatureService() {
+        super.emptyData = "{}";
+        super.emptyDataExpire = 0;
+        super.defaultExpire = 0;
+        super.keyFunc = k -> String.format("ad:adid:%s", k);
+        super.typeToken = new TypeToken<AdItemFeature>() {
+        };
+
+        int maximumSize = 10000;
+        int refreshAfterWrite = 60;
+        int expireAfterWrite = 60;
+        int expireAfterAccess = 60;
+        initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
+    }
+
+    public GetAdItemFeatureResponse getVideoFeature(GetAdItemFeatureRequest request) {
+        String adId = request.getAdId();
+        if (StringUtils.isBlank(adId)) {
+            return GetAdItemFeatureResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1))
+                    .build();
+        }
+        AdItemFeature adItemFeature = super.get(adId);
+        GetAdItemFeatureResponse.Builder builder = GetAdItemFeatureResponse.newBuilder();
+        builder.setResult(Result.newBuilder().setCode(1));
+        if (adItemFeature != null) {
+            builder.setAdItemFeature(FeatureConverter.convertToProto(adItemFeature));
+        }
+        return builder.build();
+    }
+
+    public GetAllAdItemFeatureResponse getAllVideoFeature(GetAllAdItemFeatureRequest request) {
+        if (request.getAdIdCount() == 0) {
+            return GetAllAdItemFeatureResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1))
+                    .build();
+        }
+        List<String> adIdList = request.getAdIdList();
+
+        Map<String, AdItemFeature> itemFeatureMap = super.getAll(adIdList);
+        if (MapUtils.isEmpty(itemFeatureMap)) {
+            return GetAllAdItemFeatureResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1))
+                    .build();
+        }
+
+        return GetAllAdItemFeatureResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1))
+                .addAllAdItemFeature(CommonCollectionUtils.toList(itemFeatureMap.values(), FeatureConverter::convertToProto))
+                .build();
+    }
+}

+ 76 - 6
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/FeatureConverter.java

@@ -1,12 +1,8 @@
 package com.tzld.piaoquan.recommend.feature.service;
 
 import com.google.common.base.Strings;
-import com.tzld.piaoquan.recommend.feature.model.UserActionFeature;
-import com.tzld.piaoquan.recommend.feature.model.UserFeature;
-import com.tzld.piaoquan.recommend.feature.model.VideoFeature;
-import com.tzld.piaoquan.recommend.feature.model.feature.UserActionFeatureProto;
-import com.tzld.piaoquan.recommend.feature.model.feature.UserFeatureProto;
-import com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto;
+import com.tzld.piaoquan.recommend.feature.model.*;
+import com.tzld.piaoquan.recommend.feature.model.feature.*;
 
 /**
  * @author dyp
@@ -83,4 +79,78 @@ public class FeatureConverter {
 
         return builder.build();
     }
+
+    public static UserAdFeatureProto convertToProto(UserAdFeature userAdFeature) {
+        UserAdFeatureProto.Builder builder = UserAdFeatureProto.newBuilder();
+        builder.setMid(userAdFeature.getMid());
+        builder.setGender(userAdFeature.getGender());
+        builder.setUserType(userAdFeature.getUser_type());
+        builder.setGmtCreate(userAdFeature.getGmt_create());
+        builder.setTags(userAdFeature.getTags());
+        builder.setCategoryName(userAdFeature.getCategory_name());
+        builder.setIsvip(userAdFeature.getIsvip());
+        builder.setIsreward(userAdFeature.getIsreward());
+        builder.setIsad(userAdFeature.getIsad());
+        builder.setIsgood(userAdFeature.getIsgood());
+        builder.setFirstUpDatetime(userAdFeature.getFirst_up_datetime());
+        builder.setLastUpDatetime(userAdFeature.getLast_up_datetime());
+        builder.setNextToLastUpDatetime(userAdFeature.getNext_to_last_up_datetime());
+        builder.setVideos(userAdFeature.getVideos());
+        builder.setIdols(userAdFeature.getIdols());
+        builder.setFans(userAdFeature.getFans());
+        builder.setPlayCount(userAdFeature.getPlay_count());
+        builder.setPlayCountTotal(userAdFeature.getPlay_count_total());
+        builder.setTotalReward(userAdFeature.getTotal_reward());
+        builder.setCurrentdayReward(userAdFeature.getCurrentday_reward());
+        builder.setRewardPerson(userAdFeature.getReward_person());
+        builder.setTotalRewardTimes(userAdFeature.getTotal_reward_times());
+        builder.setRewardVideos(userAdFeature.getReward_videos());
+        builder.setTotalPrice(userAdFeature.getTotal_price());
+        builder.setCurrentdayPrice(userAdFeature.getCurrentday_price());
+        builder.setTotalPriceTimes(userAdFeature.getTotal_price_times());
+        builder.setTotalPricePerson(userAdFeature.getTotal_price_person());
+        builder.setTotalPriceVideos(userAdFeature.getTotal_price_videos());
+        builder.setCgrainUserType(userAdFeature.getCgrain_user_type());
+        builder.setIdentityTagname(userAdFeature.getIdentity_tagname());
+        builder.setOperationTags(userAdFeature.getOperation_tags());
+        builder.setIdentityTagId(userAdFeature.getIdentity_tag_id());
+        builder.setIdentityCreateTime(userAdFeature.getIdentity_create_time());
+        builder.setCountry(userAdFeature.getCountry());
+        builder.setProvince(userAdFeature.getProvince());
+        builder.setCity(userAdFeature.getCity());
+
+        builder.setDay1CntFeatures(convertToProto(userAdFeature.getDay1_cnt_features()));
+        builder.setDay3CntFeatures(convertToProto(userAdFeature.getDay3_cnt_features()));
+        builder.setDay7CntFeatures(convertToProto(userAdFeature.getDay7_cnt_features()));
+        builder.setMonth3CntFeatures(convertToProto(userAdFeature.getMonth3_cnt_features()));
+
+        return builder.build();
+    }
+
+    public static AdActionFeatureProto convertToProto(AdActionFeature adActionFeature) {
+        AdActionFeatureProto.Builder builder = AdActionFeatureProto.newBuilder();
+        builder.setAdView(adActionFeature.getAdView());
+        builder.setAdClick(adActionFeature.getAdClick());
+        builder.setAdConversion(adActionFeature.getAdConversion());
+        builder.setCtr(adActionFeature.getCtr());
+        builder.setCvr(adActionFeature.getCvr());
+        return builder.build();
+    }
+
+    public static AdItemFeatureProto convertToProto(AdItemFeature adItemFeature) {
+        AdItemFeatureProto.Builder builder = AdItemFeatureProto.newBuilder();
+        builder.setAdId(adItemFeature.getAdId());
+        builder.setAdCode(adItemFeature.getAdCode());
+        builder.setAdvertiserId(adItemFeature.getAdvertiserId());
+        builder.setAdvertiserCode(adItemFeature.getAdvertiserCode());
+        builder.setCampaignId(adItemFeature.getCampaignId());
+        builder.setCampaignCode(adItemFeature.getCampaignCode());
+        builder.setCreativeId(adItemFeature.getCreativeId());
+        builder.setCreativeCode(adItemFeature.getCreativeCode());
+        builder.setDay1CntFeatures(convertToProto(adItemFeature.getDay1_cnt_features()));
+        builder.setDay3CntFeatures(convertToProto(adItemFeature.getDay3_cnt_features()));
+        builder.setDay7CntFeatures(convertToProto(adItemFeature.getDay7_cnt_features()));
+        builder.setMonth3CntFeatures(convertToProto(adItemFeature.getMonth3_cnt_features()));
+        return builder.build();
+    }
 }

+ 47 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAdFeatureService.java

@@ -0,0 +1,47 @@
+package com.tzld.piaoquan.recommend.feature.service;
+
+import com.google.common.reflect.TypeToken;
+import com.tzld.piaoquan.recommend.feature.model.UserAdFeature;
+import com.tzld.piaoquan.recommend.feature.model.common.Result;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureRequest;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserAdFeatureResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class UserAdFeatureService extends AbstractFeatureService<String, UserAdFeature> {
+    public UserAdFeatureService() {
+        super.emptyData = "{}";
+        super.emptyDataExpire = 0;
+        super.defaultExpire = 0;
+        super.keyFunc = k -> String.format("user:ad:%s", k);
+        super.typeToken = new TypeToken<UserAdFeature>() {
+        };
+
+        int maximumSize = 10000;
+        int refreshAfterWrite = 60;
+        int expireAfterWrite = 60;
+        int expireAfterAccess = 60;
+        initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
+    }
+
+    public GetUserAdFeatureResponse getUserFeature(GetUserAdFeatureRequest request) {
+        String uid = request.getMid();
+        if (StringUtils.isBlank(uid)) {
+            return GetUserAdFeatureResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1))
+                    .build();
+        }
+        UserAdFeature userAdFeature = super.get(uid);
+        GetUserAdFeatureResponse.Builder builder = GetUserAdFeatureResponse.newBuilder();
+        builder.setResult(Result.newBuilder().setCode(1));
+        if (userAdFeature != null) {
+            builder.setUserAdFeature(FeatureConverter.convertToProto(userAdFeature));
+        }
+        return builder.build();
+    }
+}
+
+

+ 1 - 1
recommend-feature-service/src/main/resources/application-dev.yml

@@ -52,4 +52,4 @@ aliyun:
 
 logging:
   file:
-    path: /Users/dingyunpeng/Desktop/code/pq/recommend-feature/logs/${spring.application.name}/
+    path: ./${spring.application.name}/