Bladeren bron

move_ad_feautre_to_feature_server_20231222 v0

sunmingze 1 jaar geleden
bovenliggende
commit
d5201f661a
20 gewijzigde bestanden met toevoegingen van 1881 en 5891 verwijderingen
  1. 5 0
      recommend-feature-client/pom.xml
  2. 7 5
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdActionFeature.java
  3. 183 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemBytesFeature.java
  4. 2 1
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemFeature.java
  5. 40 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRankItem.java
  6. 98 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRequestContext.java
  7. 41 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRequestContextBytesFeature.java
  8. 64 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdBytesFeature.java
  9. 62 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdFeature.java
  10. 162 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/enums/VlogAdFeatureGroup.java
  11. 35 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/BytesGroup.java
  12. 192 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/BytesUtils.java
  13. 230 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/FeatureHash.java
  14. 76 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/LRBytesFeatureExtractorBase.java
  15. 216 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/VlogAdCtrLRFeatureExtractor.java
  16. 56 75
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java
  17. 412 5242
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProto.java
  18. 0 420
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProtoOrBuilder.java
  19. 0 35
      recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto
  20. 0 113
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/UserAdFeature.java

+ 5 - 0
recommend-feature-client/pom.xml

@@ -13,6 +13,11 @@
     <version>1.0.1</version>
 
     <dependencies>
+        <dependency>
+            <groupId>it.unimi.dsi</groupId>
+            <artifactId>fastutil</artifactId>
+            <version>7.0.12</version>
+        </dependency>
         <dependency>
             <groupId>net.devh</groupId>
             <artifactId>grpc-client-spring-boot-starter</artifactId>

+ 7 - 5
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdActionFeature.java → recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdActionFeature.java

@@ -1,8 +1,10 @@
-package com.tzld.piaoquan.recommend.feature.model;
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
 
+import com.sun.istack.internal.NotNull;
 import lombok.Data;
+import lombok.Getter;
 
-@Data
+@Getter
 public class AdActionFeature {
     private double adView=0d;
     private double adClick=0d;
@@ -16,9 +18,9 @@ public class AdActionFeature {
     }
 
     private double bucketRatioFeature(Double key) {
-        long bucket = Math.round(Math.log((key + 1) * 1000));
-        if (bucket > 1000)
-            bucket = 1000;
+        long bucket = Math.round(Math.log((key + 1) * 50));
+        if (bucket > 50)
+            bucket = 50;
         return (double) bucket;
     }
 

+ 183 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemBytesFeature.java

@@ -0,0 +1,183 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class AdItemBytesFeature {
+
+    private final byte[] adId;
+
+    //private final byte[] adCode;
+
+    private final byte[] advertiserId;
+
+    //private final byte[] advertiserCode;
+
+    private final byte[] campaignId;
+
+    //private final byte[] campaignCode;
+
+    private final byte[] creative;
+
+    //private final byte[] creativeCode;
+
+    // adid 维度,也就是planid
+    private Map<String, byte[]> day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> month3_cnt_features;
+
+
+    // creative 维度
+    private Map<String, byte[]> creative_day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> creative_day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> creative_day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> creative_month3_cnt_features;
+
+
+    // advertiserid 维度
+    private Map<String, byte[]> advertiser_day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> advertiser_day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> advertiser_day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> advertiser_month3_cnt_features;
+
+
+
+
+    public AdItemBytesFeature(AdItemFeature feature) {
+
+        adId = feature.getAdId().getBytes();
+        // adCode = feature.getAdCode().getBytes();
+        advertiserId = feature.getAdvertiserId().getBytes();
+        //advertiserCode = feature.getAdvertiserCode().getBytes();
+        campaignId = feature.getCampaignId().getBytes();
+        //campaignCode = feature.getCampaignCode().getBytes();
+        creative = feature.getCreativeId().getBytes();
+        // creativeCode = feature.getCreativeCode().getBytes();
+
+
+        // adid 维度  planid
+        // 1 day statistic
+        day1_cnt_features = new HashMap<String, byte[]>();
+        day1_cnt_features.put("view", String.valueOf(feature.getDay1_cnt_features().getAdView()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(feature.getDay1_cnt_features().getAdClick()).getBytes());
+        day1_cnt_features.put("conversion", String.valueOf(feature.getDay1_cnt_features().getAdConversion()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(feature.getDay1_cnt_features().getCtr()).getBytes());
+        day1_cnt_features.put("cvr", String.valueOf(feature.getDay1_cnt_features().getCvr()).getBytes());
+
+        // 3 day statistic
+        day3_cnt_features = new HashMap<String, byte[]>();
+        day3_cnt_features.put("view", String.valueOf(feature.getDay3_cnt_features().getAdView()).getBytes());
+        day3_cnt_features.put("click", String.valueOf(feature.getDay3_cnt_features().getAdClick()).getBytes());
+        day3_cnt_features.put("conversion", String.valueOf(feature.getDay3_cnt_features().getAdConversion()).getBytes());
+        day3_cnt_features.put("ctr", String.valueOf(feature.getDay3_cnt_features().getCtr()).getBytes());
+        day3_cnt_features.put("cvr", String.valueOf(feature.getDay3_cnt_features().getCvr()).getBytes());
+
+        // 7 day statistic
+        day7_cnt_features = new HashMap<String, byte[]>();
+        day7_cnt_features.put("view", String.valueOf(feature.getDay7_cnt_features().getAdView()).getBytes());
+        day7_cnt_features.put("click", String.valueOf(feature.getDay7_cnt_features().getAdClick()).getBytes());
+        day7_cnt_features.put("conversion", String.valueOf(feature.getDay7_cnt_features().getAdConversion()).getBytes());
+        day7_cnt_features.put("ctr", String.valueOf(feature.getDay7_cnt_features().getCtr()).getBytes());
+        day7_cnt_features.put("cvr", String.valueOf(feature.getDay7_cnt_features().getCvr()).getBytes());
+
+        // 3 month statisic
+        month3_cnt_features = new HashMap<String, byte[]>();
+        month3_cnt_features.put("view", String.valueOf(feature.getMonth3_cnt_features().getAdView()).getBytes());
+        month3_cnt_features.put("click", String.valueOf(feature.getMonth3_cnt_features().getAdClick()).getBytes());
+        month3_cnt_features.put("conversion", String.valueOf(feature.getMonth3_cnt_features().getAdConversion()).getBytes());
+        month3_cnt_features.put("ctr", String.valueOf(feature.getMonth3_cnt_features().getCtr()).getBytes());
+        month3_cnt_features.put("cvr", String.valueOf(feature.getMonth3_cnt_features().getCvr()).getBytes());
+
+
+        // creative 维度  creativeid
+        // 1 day statistic
+        creative_day1_cnt_features = new HashMap<String, byte[]>();
+        creative_day1_cnt_features.put("view", String.valueOf(feature.getCreative_1day_cnt_features().getAdView()).getBytes());
+        creative_day1_cnt_features.put("click", String.valueOf(feature.getCreative_1day_cnt_features().getAdClick()).getBytes());
+        creative_day1_cnt_features.put("conversion", String.valueOf(feature.getCreative_1day_cnt_features().getAdConversion()).getBytes());
+        creative_day1_cnt_features.put("ctr", String.valueOf(feature.getCreative_1day_cnt_features().getCtr()).getBytes());
+        creative_day1_cnt_features.put("cvr", String.valueOf(feature.getCreative_1day_cnt_features().getCvr()).getBytes());
+
+        // 3 day statistic
+        creative_day3_cnt_features = new HashMap<String, byte[]>();
+        creative_day3_cnt_features.put("view", String.valueOf(feature.getDay3_cnt_features().getAdView()).getBytes());
+        creative_day3_cnt_features.put("click", String.valueOf(feature.getDay3_cnt_features().getAdClick()).getBytes());
+        creative_day3_cnt_features.put("conversion", String.valueOf(feature.getDay3_cnt_features().getAdConversion()).getBytes());
+        creative_day3_cnt_features.put("ctr", String.valueOf(feature.getDay3_cnt_features().getCtr()).getBytes());
+        creative_day3_cnt_features.put("cvr", String.valueOf(feature.getDay3_cnt_features().getCvr()).getBytes());
+
+        // 7 day statistic
+        creative_day7_cnt_features = new HashMap<String, byte[]>();
+        creative_day7_cnt_features.put("view", String.valueOf(feature.getDay7_cnt_features().getAdView()).getBytes());
+        creative_day7_cnt_features.put("click", String.valueOf(feature.getDay7_cnt_features().getAdClick()).getBytes());
+        creative_day7_cnt_features.put("conversion", String.valueOf(feature.getDay7_cnt_features().getAdConversion()).getBytes());
+        creative_day7_cnt_features.put("ctr", String.valueOf(feature.getDay7_cnt_features().getCtr()).getBytes());
+        creative_day7_cnt_features.put("cvr", String.valueOf(feature.getDay7_cnt_features().getCvr()).getBytes());
+
+
+        // 3 month statisic
+        creative_month3_cnt_features = new HashMap<String, byte[]>();
+        creative_month3_cnt_features.put("view", String.valueOf(feature.getMonth3_cnt_features().getAdView()).getBytes());
+        creative_month3_cnt_features.put("click", String.valueOf(feature.getMonth3_cnt_features().getAdClick()).getBytes());
+        creative_month3_cnt_features.put("conversion", String.valueOf(feature.getMonth3_cnt_features().getAdConversion()).getBytes());
+        creative_month3_cnt_features.put("ctr", String.valueOf(feature.getMonth3_cnt_features().getCtr()).getBytes());
+        creative_month3_cnt_features.put("cvr", String.valueOf(feature.getMonth3_cnt_features().getCvr()).getBytes());
+
+
+
+        // advertiser 维度  planid
+        // 1 day statistic
+        advertiser_day1_cnt_features = new HashMap<String, byte[]>();
+        advertiser_day1_cnt_features.put("view", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdView()).getBytes());
+        advertiser_day1_cnt_features.put("click", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdClick()).getBytes());
+        advertiser_day1_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdConversion()).getBytes());
+        advertiser_day1_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_1day_cnt_features().getCtr()).getBytes());
+        advertiser_day1_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_1day_cnt_features().getCvr()).getBytes());
+
+
+        // 3 day statistic
+        advertiser_day3_cnt_features = new HashMap<String, byte[]>();
+        advertiser_day3_cnt_features.put("view", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdView()).getBytes());
+        advertiser_day3_cnt_features.put("click", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdClick()).getBytes());
+        advertiser_day3_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdConversion()).getBytes());
+        advertiser_day3_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_3day_cnt_features().getCtr()).getBytes());
+        advertiser_day3_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_3day_cnt_features().getCvr()).getBytes());
+
+
+        // 7 day statistic
+        advertiser_day7_cnt_features = new HashMap<String, byte[]>();
+        advertiser_day7_cnt_features.put("view", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdView()).getBytes());
+        advertiser_day7_cnt_features.put("click", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdClick()).getBytes());
+        advertiser_day7_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdConversion()).getBytes());
+        advertiser_day7_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_7day_cnt_features().getCtr()).getBytes());
+        advertiser_day7_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_7day_cnt_features().getCvr()).getBytes());
+
+
+        // 3 month statisic
+        advertiser_month3_cnt_features = new HashMap<String, byte[]>();
+        advertiser_month3_cnt_features.put("view", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdView()).getBytes());
+        advertiser_month3_cnt_features.put("click", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdClick()).getBytes());
+        advertiser_month3_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdConversion()).getBytes());
+        advertiser_month3_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_3month_cnt_features().getCtr()).getBytes());
+        advertiser_month3_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_3month_cnt_features().getCvr()).getBytes());
+
+
+
+
+
+    }
+
+}

+ 2 - 1
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/model/AdItemFeature.java → recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemFeature.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.recommend.feature.model;
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
@@ -169,6 +169,7 @@ public class AdItemFeature {
 
     }
 
+
     public String getKey() {
         return this.creativeId;
     }

+ 40 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRankItem.java

@@ -0,0 +1,40 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Data
+public class AdRankItem implements Comparable<AdRankItem> {
+    public long adId;
+    private double score; // 记录最终的score
+
+    // 记录Item侧用到的特征
+    private AdItemFeature itemFeature;
+
+    public AdRankItem() {
+        //TODO
+    }
+
+    private Map<String, Double> rankerScore = new HashMap<>();
+    private Map<String, Integer> rankerIndex = new HashMap<>();
+
+
+    @Override
+    public int compareTo(AdRankItem o) {
+        if (o == null) {
+            return -1;
+        }
+        if (score > o.score) {
+            return -1;
+        } else if (score < o.score) {
+            return 1;
+        } else {
+            return 0;
+        }
+    }
+
+
+}

+ 98 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRequestContext.java

@@ -0,0 +1,98 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+public class AdRequestContext {
+
+    // 机型等信息
+    private String apptype="-1";
+    private String machineinfoBrand="-1";
+    private String machineinfoModel="-1";
+    private String machineinfoSdkversion="-1";
+    private String machineinfoWechatversion="-1";
+
+    // 时间等信息
+    private String day="-1";
+    private String week="-1";
+    private String hour="-1";
+    private String region="-1";
+    private String city="-1";
+
+    // position 信息
+    private String ownAdPositionId;
+
+
+
+    public void setApptype(String apptype) {
+        this.apptype = apptype;
+        if (apptype == null)
+            this.apptype = "-1";
+    }
+
+    public void setMachineinfoBrand(String machineinfoBrand) {
+        this.machineinfoBrand = machineinfoBrand;
+        if (machineinfoBrand == null)
+            this.machineinfoBrand = "-1";
+    }
+
+    public void setMachineinfoModel(String machineinfoModel) {
+        this.machineinfoModel = machineinfoModel;
+        if (machineinfoModel == null)
+            this.machineinfoModel = "-1";
+    }
+
+
+    public void setMachineinfoWchatversion(String machineinfo_wechatversion) {
+        this.machineinfoWechatversion = machineinfo_wechatversion;
+        if (machineinfo_wechatversion == null)
+            this.machineinfoWechatversion = "-1";
+    }
+
+
+    public void setMachineinfoSdkversion(String machineinfo_sdkversion) {
+        this.machineinfoSdkversion = machineinfo_sdkversion;
+        if (machineinfoSdkversion == null)
+            this.machineinfoSdkversion = "-1";
+    }
+
+
+
+    public void setHour(String hour) {
+        this.hour = hour;
+        if (hour == null)
+            this.hour = "-1";
+    }
+
+
+    public void setDay(String day) {
+        this.day = day;
+        if (day == null)
+            this.day = "-1";
+    }
+
+    public void setWeek(String week) {
+        this.week = week;
+        if (week == null)
+            this.week = "-1";
+    }
+
+
+    public void setRegion(String region) {
+        this.region = region;
+        if (region == null)
+            this.region = "-1";
+    }
+
+
+    public void setCity(String city) {
+        this.city = city;
+        if (city == null)
+            this.city = "-1";
+    }
+
+
+}

+ 41 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdRequestContextBytesFeature.java

@@ -0,0 +1,41 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+
+import lombok.Data;
+
+@Data
+public class AdRequestContextBytesFeature {
+    private final byte[] apptype;
+    private final byte[] machineinfo_brand;
+    private final byte[] machineinfo_model;
+    private final byte[] machineinfo_sdkversion;
+    private final byte[] machineinfo_wechatversion;
+
+    // 时间等信息
+    private final byte[] day;
+    private final byte[] week;
+    private final byte[] hour;
+    private final byte[] region;
+    private final byte[] city;
+
+
+    public AdRequestContextBytesFeature(AdRequestContext requestContext) {
+        apptype = requestContext.getApptype().getBytes();
+        machineinfo_brand = requestContext.getMachineinfoBrand().getBytes();
+        machineinfo_model = requestContext.getMachineinfoModel().getBytes();
+        machineinfo_sdkversion = requestContext.getMachineinfoSdkversion().getBytes();
+        machineinfo_wechatversion = requestContext.getMachineinfoWechatversion().getBytes();
+
+        day = requestContext.getDay().getBytes();
+        week = requestContext.getWeek().getBytes();
+        hour = requestContext.getHour().getBytes();
+        region = requestContext.getRegion().getBytes();
+        city = requestContext.getCity().getBytes();
+
+        // headVideoId = requestContext.getHeadVideoId().getBytes();
+        // pageSource = requestContext.getPageSource().getBytes();
+        // ownAdPositionId = requestContext.getOwnAdPositionId().getBytes();
+    }
+
+
+}

+ 64 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdBytesFeature.java

@@ -0,0 +1,64 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class UserAdBytesFeature {
+
+    private final byte[] mid;
+
+    // 当天统计量信息
+    private Map<String, byte[]> day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> month3_cnt_features;
+
+
+    public UserAdBytesFeature(UserAdFeature feature) {
+        this.mid = feature.getMid().getBytes();
+
+
+        // 1 day statistic
+        day1_cnt_features = new HashMap<String, byte[]>();
+        day1_cnt_features.put("view", String.valueOf(feature.getDay1_cnt_features().getAdView()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(feature.getDay1_cnt_features().getAdClick()).getBytes());
+        day1_cnt_features.put("conversion", String.valueOf(feature.getDay1_cnt_features().getAdConversion()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(feature.getDay1_cnt_features().getCtr()).getBytes());
+        day1_cnt_features.put("cvr", String.valueOf(feature.getDay1_cnt_features().getCvr()).getBytes());
+
+
+
+        // 3 day statistic
+        day3_cnt_features = new HashMap<String, byte[]>();
+        day3_cnt_features.put("view", String.valueOf(feature.getDay3_cnt_features().getAdView()).getBytes());
+        day3_cnt_features.put("click", String.valueOf(feature.getDay3_cnt_features().getAdClick()).getBytes());
+        day3_cnt_features.put("conversion", String.valueOf(feature.getDay3_cnt_features().getAdConversion()).getBytes());
+        day3_cnt_features.put("ctr", String.valueOf(feature.getDay3_cnt_features().getCtr()).getBytes());
+        day3_cnt_features.put("cvr", String.valueOf(feature.getDay3_cnt_features().getCvr()).getBytes());
+
+
+        // 7 day statistic
+        day7_cnt_features = new HashMap<String, byte[]>();
+        day7_cnt_features.put("view", String.valueOf(feature.getDay7_cnt_features().getAdView()).getBytes());
+        day7_cnt_features.put("click", String.valueOf(feature.getDay7_cnt_features().getAdClick()).getBytes());
+        day7_cnt_features.put("conversion", String.valueOf(feature.getDay7_cnt_features().getAdConversion()).getBytes());
+        day7_cnt_features.put("ctr", String.valueOf(feature.getDay7_cnt_features().getCtr()).getBytes());
+        day7_cnt_features.put("cvr", String.valueOf(feature.getDay7_cnt_features().getCvr()).getBytes());
+
+
+        // 3 month statisic
+        month3_cnt_features = new HashMap<String, byte[]>();
+        month3_cnt_features.put("view", String.valueOf(feature.getMonth3_cnt_features().getAdView()).getBytes());
+        month3_cnt_features.put("click", String.valueOf(feature.getMonth3_cnt_features().getAdClick()).getBytes());
+        month3_cnt_features.put("conversion", String.valueOf(feature.getMonth3_cnt_features().getAdConversion()).getBytes());
+        month3_cnt_features.put("ctr", String.valueOf(feature.getMonth3_cnt_features().getCtr()).getBytes());
+        month3_cnt_features.put("cvr", String.valueOf(feature.getMonth3_cnt_features().getCvr()).getBytes());
+
+    }
+}

+ 62 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdFeature.java

@@ -0,0 +1,62 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.base;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+
+@Getter
+@NoArgsConstructor
+@Setter
+public class UserAdFeature {
+
+    private String mid = "0";
+
+
+    // 当天统计量信息
+    private AdActionFeature day1_cnt_features = new AdActionFeature();
+    // 3天内统计量
+    private AdActionFeature day3_cnt_features = new AdActionFeature();
+    // 7天内统计量
+    private AdActionFeature day7_cnt_features = new AdActionFeature();
+    // 3个月统计量
+    private AdActionFeature month3_cnt_features = new AdActionFeature();
+
+
+    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);
+    }
+
+}

+ 162 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/enums/VlogAdFeatureGroup.java

@@ -0,0 +1,162 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.enums;
+
+public enum VlogAdFeatureGroup {
+    MID,
+    MACHINEINFO_BRAND,
+    MACHINEINFO_MODEL,
+    MACHINEINFO_PLATFORM,
+    MACHINEINFO_SDKVERSION,
+    MACHINEINFO_WECHATVERSION,
+
+
+    DAY,
+    WEEK,
+    HOUR,
+    REGION,
+    CITY,
+
+    // AD info
+    ADID,
+    CREATIVE,
+    ADVERID,
+    CAMPAIGIN,
+
+    //City
+    CREATIVE_AND_CITY,
+    ADVERID_AND_CITY,
+
+
+    USER_1DAY_EXP,
+    USER_1DAY_CLICK,
+    USER_1DAY_CTR,
+    USER_1DAY_CVR,
+
+    USER_3DAY_EXP,
+    USER_3DAY_CLICK,
+    USER_3DAY_CTR,
+    USER_3DAY_CVR,
+
+    USER_7DAY_EXP,
+    USER_7DAY_CLICK,
+    USER_7DAY_CTR,
+    USER_7DAY_CVR,
+
+    USER_3MONTH_EXP,
+    USER_3MONTH_CLICK,
+    USER_3MONTH_CTR,
+    USER_3MONTH_CVR,
+
+
+    ITEM_1DAY_EXP,
+    ITEM_1DAY_CLICK,
+    ITEM_1DAY_CTR,
+    ITEM_1DAY_CVR,
+
+    ITEM_3DAY_EXP,
+    ITEM_3DAY_CLICK,
+    ITEM_3DAY_CTR,
+    ITEM_3DAY_CVR,
+
+    ITEM_7DAY_EXP,
+    ITEM_7DAY_CLICK,
+    ITEM_7DAY_CTR,
+    ITEM_7DAY_CVR,
+
+    ITEM_3MONTH_EXP,
+    ITEM_3MONTH_CLICK,
+    ITEM_3MONTH_CTR,
+    ITEM_3MONTH_CVR,
+
+
+    CREATIVE_1DAY_EXP,
+    CREATIVE_1DAY_CLICK,
+    CREATIVE_1DAY_CTR,
+    CREATIVE_1DAY_CVR,
+
+    CREATIVE_3DAY_EXP,
+    CREATIVE_3DAY_CLICK,
+    CREATIVE_3DAY_CTR,
+    CREATIVE_3DAY_CVR,
+
+    CREATIVE_7DAY_EXP,
+    CREATIVE_7DAY_CLICK,
+    CREATIVE_7DAY_CTR,
+    CREATIVE_7DAY_CVR,
+
+    CREATIVE_3MONTH_EXP,
+    CREATIVE_3MONTH_CLICK,
+    CREATIVE_3MONTH_CTR,
+    CREATIVE_3MONTH_CVR,
+
+
+
+    ADVERID_1DAY_EXP,
+    ADVERID_1DAY_CLICK,
+    ADVERID_1DAY_CTR,
+    ADVERID_1DAY_CVR,
+
+    ADVERID_3DAY_EXP,
+    ADVERID_3DAY_CLICK,
+    ADVERID_3DAY_CTR,
+    ADVERID_3DAY_CVR,
+
+    ADVERID_7DAY_EXP,
+    ADVERID_7DAY_CLICK,
+    ADVERID_7DAY_CTR,
+    ADVERID_7DAY_CVR,
+
+    ADVERID_3MONTH_EXP,
+    ADVERID_3MONTH_CLICK,
+    ADVERID_3MONTH_CTR,
+    ADVERID_3MONTH_CVR,
+
+
+    // cross feature
+    CREATIVE_AND_HOUR,
+    ADVERID_AND_HOUR,
+    CREATIVE_AND_REGION,
+    ADVERID_AND_REGION,
+    CREATIVE_AND_MACHINEINFO_MODEL,
+    ADVERID_AND_MACHINEINFO_MODEL,
+
+    CREATIVE_AND_MACHINEINFO_BRAND,
+    ADVERID_AND_MACHINEINFO_BRAND,
+
+    CREATIVE_AND_MACHINEINFO_SDK,
+    ADVERID_AND_MACHINEINFO_SDK,
+
+    CREATIVE_AND_USER_3MONTH_CTR,
+    ADVERID_AND_USER_3MONTH_CTR,
+
+    USER_3MONTH_CTR_AND_ITEM_7DAY_CTR,
+    USER_3MONTH_CTR_AND_ITEM_3DAY_CTR,
+
+
+    ;
+
+
+    private final byte[] idBytes;
+    private final byte[] nameBytes;
+
+    VlogAdFeatureGroup() {
+        this.nameBytes = name().toLowerCase().getBytes();
+        this.idBytes = String.valueOf(ordinal()).getBytes();
+    }
+
+    public final int getId() {
+        return ordinal();
+    }
+
+    public final String getGroupName() {
+        return name().toLowerCase();
+    }
+
+    public final byte[] getGroupNameBytes() {
+        return getGroupName().getBytes();
+    }
+
+    public final byte[] getIdBytes() {
+        return idBytes;
+    }
+
+}

+ 35 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/BytesGroup.java

@@ -0,0 +1,35 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.feature;
+
+
+public class BytesGroup {
+    private int id;
+    private String name;
+    private byte[] nameBytes;
+    private byte[] buffer;
+
+    public BytesGroup(int id, String name, byte[] nameBytes) {
+        this.id = id;
+        this.name = name;
+        this.nameBytes = nameBytes;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public byte[] getNameBytes() {
+        return nameBytes;
+    }
+
+    public byte[] getBuffer() {
+        return buffer;
+    }
+
+    public void setBuffer(byte[] buffer) {
+        this.buffer = buffer;
+    }
+}

+ 192 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/BytesUtils.java

@@ -0,0 +1,192 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.feature;
+
+
+import com.tzld.piaoquan.recommend.feature.model.sample.BaseFeature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Extract features from user, item & context info. Returns 64-bit murmurhash of feature string as results.
+ */
+public class BytesUtils {
+    private static final byte[] SEPARATOR = "_".getBytes();
+    private static final byte[] FEATURE_SEPARATOR = "#".getBytes();
+    private static final int MAX_FEATURE_BYTES_LENGTH = 512;
+    private static final long SEED = 11L;
+    private BytesGroup[] groups;
+
+    /**
+     * 一个种特殊的List,在尝试写入null的时候回默默地扔掉.
+     * @param <E> List的元素类型.
+     */
+    public static class NullRejectingArrayList<E> extends ArrayList<E> {
+        public NullRejectingArrayList(int capacity) {
+            super(capacity);
+        }
+
+        public NullRejectingArrayList() {
+            super();
+        }
+
+        @Override
+        public boolean add(E e) {
+            return e != null && super.add(e);
+        }
+    }
+
+    public BytesUtils(BytesGroup[] groups) {
+        this.groups = groups;
+        for (BytesGroup g : groups) {
+            byte[] buffer = prepareBuffer(g.getName(), g.getNameBytes());
+            groups[g.getId()].setBuffer(buffer);
+        }
+    }
+
+    public byte[] prepareBuffer(String name, byte[] nameBytes) {
+
+        byte[] buffer = new byte[MAX_FEATURE_BYTES_LENGTH];
+        System.arraycopy(nameBytes, 0, buffer, 0, nameBytes.length);
+        System.arraycopy(FEATURE_SEPARATOR, 0, buffer, nameBytes.length, 1);
+        return buffer;
+    }
+
+    public BaseFeature baseFea(byte[] buffer, int length) {
+        long hash = FeatureHash.MurmurHash64(buffer, 0, length, SEED);
+
+        // debug中查看 String fea = new String(buffer, 0, length);
+        // 初始化protobuf并赋值
+        BaseFeature.Builder tmp = BaseFeature.newBuilder();
+        tmp.setIdentifier(hash);
+        return tmp.build();
+    }
+
+    public BaseFeature makeFea(int id, byte[] value) {
+        byte[] buffer = groups[id].getBuffer();
+        if (buffer == null || value == null) {
+            return null;
+        }
+
+        final int nameLength = groups[id].getNameBytes().length + 1;
+        final int length = nameLength + value.length;
+        System.arraycopy(value, 0, buffer, nameLength, value.length);
+        return baseFea(buffer, length);
+    }
+
+    public BaseFeature makeFea(int id, final byte[] p1, final byte[] p2) {
+        byte[] buffer = groups[id].getBuffer();
+        if (buffer == null || p1 == null || p2 == null) {
+            return null;
+        }
+
+        final int nameLength = groups[id].getNameBytes().length + 1;
+        final int length = nameLength + p1.length + 1 + p2.length;
+
+        System.arraycopy(p1, 0, buffer, nameLength, p1.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length, 1);
+        System.arraycopy(p2, 0, buffer, nameLength + p1.length + 1, p2.length);
+        return baseFea(buffer, length);
+    }
+
+    public BaseFeature makeFea(int id, final byte[] p1, final byte[] p2, final byte[] p3) {
+        byte[] buffer = groups[id].getBuffer();
+        if (buffer == null || p1 == null || p2 == null || p3 == null) {
+            return null;
+        }
+
+        final int nameLength = groups[id].getNameBytes().length + 1;
+        final int length = nameLength + p1.length + 1 + p2.length + 1 + p3.length;
+        System.arraycopy(p1, 0, buffer, nameLength, p1.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length, 1);
+        System.arraycopy(p2, 0, buffer, nameLength + p1.length + 1, p2.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length + 1 + p2.length, 1);
+        System.arraycopy(p3, 0, buffer, nameLength + p1.length + 1 + p2.length + 1, p3.length);
+
+        return baseFea(buffer, length);
+    }
+
+    public BaseFeature makeFea(int id, final byte[] p1, final byte[] p2, final byte[] p3, final byte[] p4) {
+        byte[] buffer = groups[id].getBuffer();
+        if (buffer == null || p1 == null || p2 == null || p3 == null || p4 == null) {
+            return null;
+        }
+
+        final int nameLength = groups[id].getNameBytes().length + 1;
+        final int length = nameLength + p1.length + 1 + p2.length + 1 + p3.length + 1 + p4.length;
+        System.arraycopy(p1, 0, buffer, nameLength, p1.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length, 1);
+        System.arraycopy(p2, 0, buffer, nameLength + p1.length + 1, p2.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length + 1 + p2.length, 1);
+        System.arraycopy(p3, 0, buffer, nameLength + p1.length + 1 + p2.length + 1, p3.length);
+        System.arraycopy(SEPARATOR, 0, buffer, nameLength + p1.length + 1 + p2.length + 1 + p3.length, 1);
+        System.arraycopy(p4, 0, buffer, nameLength + p1.length + 1 + p2.length + 1 + p3.length + 1, p4.length);
+
+        return baseFea(buffer, length);
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[][] list) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(list.length);
+        for (byte[] t: list) {
+            result.add(makeFea(id, t));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[][] left, byte[] right) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(left.length);
+        for (byte[] l: left) {
+            result.add(makeFea(id, l, right));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[][] left, byte[] right1, byte[] right2) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(left.length);
+        for (byte[] l: left) {
+            result.add(makeFea(id, l, right1, right2));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[][] left, byte[] right1, byte[] right2, byte[] right3) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(left.length);
+        for (byte[] l: left) {
+            result.add(makeFea(id, l, right1, right2, right3));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[] left, byte[][] right) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(right.length);
+        for (byte[] r : right) {
+            result.add(makeFea(id, left, r));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[] left1, byte[] left2, byte[][] right) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(right.length);
+        for (byte[] r : right) {
+            result.add(makeFea(id, left1, left2, r));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[] left1, byte[] left2, byte[] left3, byte[][] right) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(right.length);
+        for (byte[] r : right) {
+            result.add(makeFea(id, left1, left2, left3, r));
+        }
+        return result;
+    }
+
+    public List<BaseFeature> makeFea(int id, byte[][] left, byte[][] right) {
+        List<BaseFeature> result = new NullRejectingArrayList<BaseFeature>(left.length * right.length);
+        for (byte[] l: left) {
+            for (byte[] r: right) {
+                result.add(makeFea(id, l, r));
+            }
+        }
+        return result;
+    }
+}

+ 230 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/FeatureHash.java

@@ -0,0 +1,230 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.feature;
+
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class FeatureHash {
+    public static Charset CharSetUTF8 = Charset.forName("UTF-8");
+
+    public static long getUInt32(byte a, byte b, byte c, byte d) {
+        return (d << 24 | (c & 0xFF) << 16 | (b & 0xFF) << 8 | (a & 0xFF));
+    }
+
+    public static long hash64(byte[] data) {
+        return MurmurHash64A(ByteBuffer.wrap(data), 0, data.length, 11L);
+    }
+
+    public static long MurmurHash64A(ByteBuffer buffer, int from, int len, long seed) {
+        final long m = 0xc6a4a7935bd1e995L;
+        final int r = 47;
+
+        long h = (seed) ^ (len * m);
+        int longLength = len / 8;
+
+        for (int i = 0; i < longLength; ++i) {
+            final int bytePos = from + i * 8;
+            long k = buffer.getLong(bytePos);
+
+            k *= m;
+            k ^= k >> r;
+            k *= m;
+            h ^= k;
+            h *= m;
+        }
+
+        final int remainingPos = len & ~7;
+        switch (len % 8) {
+            case 7: h ^= (long)(buffer.get(remainingPos + 6) & 0xFF) << 48;
+            case 6: h ^= (long)(buffer.get(remainingPos + 5) & 0xFF) << 40;
+            case 5: h ^= (long)(buffer.get(remainingPos + 4) & 0xFF) << 32;
+            case 4: h ^= (long)(buffer.get(remainingPos + 3) & 0xFF) << 24;
+            case 3: h ^= (long)(buffer.get(remainingPos + 2) & 0xFF) << 16;
+            case 2: h ^= (long)(buffer.get(remainingPos + 1) & 0xFF) << 8;
+            case 1:
+                h ^= (long)(buffer.get(remainingPos) & 0xFF);
+                h *= m;
+        }
+
+        h ^= h >>> r;
+        h *= m;
+        h ^= h >>> r;
+        return h;
+    }
+
+    public static long MurmurHash32(byte data[], int len, long seed) {
+        long m = 0x5bd1e995L;
+        int r = 24;
+
+        long h = seed ^ len;
+
+        int offset = 0;
+        while (len >= 4) {
+            long k = getUInt32(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
+
+            k *= m;
+            k &= 0xFFFFFFFFL;
+            k ^= k >> r;
+            k *= m;
+            k &= 0xFFFFFFFFL;
+
+            h *= m;
+            h &= 0xFFFFFFFFL;
+            h ^= k;
+
+            offset += 4;
+            len -= 4;
+        }
+
+        // Handle the last few bytes of the input array
+        switch (len) {
+            case 3: h ^= data[offset + 2] << 16;
+            case 2: h ^= data[offset + 1] << 8;
+            case 1: h ^= data[offset];
+                h *= m;
+                h &= 0xFFFFFFFFL;
+        } ;
+
+        // Do a few final mixes of the hash to ensure the last few
+        // bytes are well-incorporated.
+
+        h ^= h >> 13;
+        h *= m;
+        h &= 0xFFFFFFFFL;
+        h ^= h >> 15;
+
+        return h;
+    }
+
+    // 64-bit hash for 32-bit platforms
+    public static long MurmurHash64(byte[] buffer, int start, int len, long seed) {
+        final long m = 0x5bd1e995L;
+        final int r = 24;
+        final int original = len;
+
+        long h1 = (seed) ^ len;
+        long h2 = (seed >> 32);
+
+        int offset = start;
+        while (len >= 8) {
+            long k1 = getUInt32(buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]);
+            // long k1 = buffer.getInt(offset);
+
+            k1 *= m; k1 &= 0xFFFFFFFFL; k1 ^= k1 >> r; k1 *= m; k1 &= 0xFFFFFFFFL;
+            h1 *= m; h1 &= 0xFFFFFFFFL; h1 ^= k1;
+            offset += 4;
+
+            long k2 = getUInt32(buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]);
+            // long k2 = buffer.getInt(offset);
+            k2 *= m; k2 &= 0xFFFFFFFFL; k2 ^= k2 >> r; k2 *= m; k2 &= 0xFFFFFFFFL;
+            h2 *= m; h2 &= 0xFFFFFFFFL; h2 ^= k2;
+
+            offset += 4;
+            len -= 8;
+        }
+
+        if (len >= 4) {
+            long k1 = getUInt32(buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]);
+            // long k1 = buffer.getInt(offset);
+            k1 *= m; k1 &= 0xFFFFFFFFL; k1 ^= k1 >> r; k1 *= m; k1 &= 0xFFFFFFFFL;
+            h1 *= m; h1 &= 0xFFFFFFFFL; h1 ^= k1;
+            offset += 4;
+            len -= 4;
+        }
+
+        switch (len) {
+            case 3: h2 ^= (buffer[offset + 2] & 0xFF) << 16;
+            case 2: h2 ^= (buffer[offset + 1] & 0xFF) << 8;
+            case 1: h2 ^= (buffer[offset] & 0xFF);
+                h2 *= m;
+                h2 &= 0xFFFFFFFFL;
+        } ;
+
+        h1 ^= h2 >> 18;
+        h1 *= m; h1 &= 0xFFFFFFFFL;
+        h2 ^= h1 >> 22;
+        h2 *= m; h2 &= 0xFFFFFFFFL;
+        h1 ^= h2 >> 17;
+        h1 *= m; h1 &= 0xFFFFFFFFL;
+        h2 ^= h1 >> 19;
+        h2 *= m; h2 &= 0xFFFFFFFFL;
+
+        /*BigInteger ans = BigInteger.valueOf(h1).shiftLeft(32).or(BigInteger.valueOf(h2));
+        return ans.longValue();*/
+        //System.err.println("feature: " + new String(buffer, 0, original) + " length: " + original + " hash: " + (h1 << 32 | h2) + " daze");
+        return h1 << 32 | h2;
+    }
+
+    // 64-bit hash for 32-bit platforms
+    public static BigInteger MurmurHash64(byte data[], int len, long seed) {
+        long m = 0x5bd1e995L;
+        int r = 24;
+
+        long h1 = (seed) ^ len;
+        long h2 = (seed >> 32);
+
+        int offset = 0;
+        while (len >= 8) {
+            long k1 = getUInt32(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
+            k1 *= m; k1 &= 0xFFFFFFFFL; k1 ^= k1 >> r; k1 *= m; k1 &= 0xFFFFFFFFL;
+            h1 *= m; h1 &= 0xFFFFFFFFL; h1 ^= k1;
+
+            long k2 = getUInt32(data[offset + 4], data[offset + 5], data[offset + 6], data[offset + 7]);
+            k2 *= m; k2 &= 0xFFFFFFFFL; k2 ^= k2 >> r; k2 *= m; k2 &= 0xFFFFFFFFL;
+            h2 *= m; h2 &= 0xFFFFFFFFL; h2 ^= k2;
+
+            offset += 8;
+            len -= 8;
+        }
+
+        if (len >= 4) {
+            long k1 = getUInt32(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);
+            k1 *= m; k1 &= 0xFFFFFFFFL; k1 ^= k1 >> r; k1 *= m; k1 &= 0xFFFFFFFFL;
+            h1 *= m; h1 &= 0xFFFFFFFFL; h1 ^= k1;
+            offset += 4;
+            len -= 4;
+        }
+
+        switch (len) {
+            case 3: h2 ^= (data[offset + 2] & 0xFF) << 16;
+            case 2: h2 ^= (data[offset + 1] & 0xFF) << 8;
+            case 1: h2 ^= (data[offset] & 0xFF);
+                h2 *= m;
+                h2 &= 0xFFFFFFFFL;
+        } ;
+
+        h1 ^= h2 >> 18;
+        h1 *= m; h1 &= 0xFFFFFFFFL;
+        h2 ^= h1 >> 22;
+        h2 *= m; h2 &= 0xFFFFFFFFL;
+        h1 ^= h2 >> 17;
+        h1 *= m; h1 &= 0xFFFFFFFFL;
+        h2 ^= h1 >> 19;
+        h2 *= m; h2 &= 0xFFFFFFFFL;
+
+        BigInteger ans = BigInteger.valueOf(h1).shiftLeft(32).or(BigInteger.valueOf(h2));
+        return ans;
+    }
+
+    public static String hash(String input) {
+        byte[] tt = input.getBytes(CharSetUTF8);
+        return MurmurHash64(tt, tt.length, 11L).toString();
+    }
+
+    public static Long hashToLong(String input) {
+        byte[] tt = input.getBytes(CharSetUTF8);
+        return MurmurHash64(tt, tt.length, 11L).longValue();
+    }
+
+    /** the constant 2^64 */
+    private static final BigInteger TWO_64 = BigInteger.ONE.shiftLeft(64);
+
+    public static String asUnsignedLongString(long l) {
+        BigInteger b = BigInteger.valueOf(l);
+        if (b.signum() < 0) {
+            b = b.add(TWO_64);
+        }
+        return b.toString();
+    }
+}

+ 76 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/LRBytesFeatureExtractorBase.java

@@ -0,0 +1,76 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.feature;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdItemBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContextBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.enums.VlogAdFeatureGroup;
+import com.tzld.piaoquan.recommend.feature.model.sample.BaseFeature;
+import com.tzld.piaoquan.recommend.feature.model.sample.FeatureGroup;
+import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
+
+import java.util.List;
+
+
+public abstract class LRBytesFeatureExtractorBase {
+    private static final double DEFAULT_USER_CTR_GROUP = 10.0;
+    private static final double DEFAULT_ARTICLE_CTR_GROUP = 100.0;
+
+
+    private BytesUtils utils;
+    //Feature Group & Features
+    ListMultimap<FeatureGroup, BaseFeature> features = ArrayListMultimap.create();
+    int groupCount;
+
+
+    LRBytesFeatureExtractorBase() {
+        groupCount = VlogAdFeatureGroup.values().length;
+        BytesGroup[] groups = new BytesGroup[groupCount];
+        for (VlogAdFeatureGroup g: VlogAdFeatureGroup.values()) {
+            groups[g.ordinal()] = new BytesGroup(g.ordinal(),
+                    g.getGroupName(), g.getGroupNameBytes());
+        }
+        utils = new BytesUtils(groups);
+    }
+
+    private FeatureGroup makeGroup(VlogAdFeatureGroup group){
+        FeatureGroup.Builder g = FeatureGroup.newBuilder();
+        g.setType("1");
+        g.setName(group.getGroupName());
+        g.setId(group.ordinal());
+        return g.build();
+    };
+
+
+    void makeFea(VlogAdFeatureGroup group, byte[] value) {
+        FeatureGroup featureGroup = makeGroup(group);
+        BaseFeature feature = utils.makeFea(group.ordinal(), value);
+        features.put(featureGroup, feature);
+    }
+
+    void makeFea(VlogAdFeatureGroup group, byte[][] list) {
+        FeatureGroup g = makeGroup(group);
+        List<BaseFeature> featureList = utils.makeFea(group.ordinal(), list);
+        features.putAll(g, featureList);
+    }
+
+    // 增加交叉特征的方法
+    void makeFea(VlogAdFeatureGroup group, final byte[] left, final byte[] right) {
+        FeatureGroup g = makeGroup(group);
+        BaseFeature feature = utils.makeFea(group.ordinal(), left, right);
+        features.put(g, feature);
+    }
+
+
+
+    public ListMultimap<FeatureGroup, BaseFeature> getFeatures() {
+        return features;
+    }
+
+    public abstract LRSamples single(UserAdBytesFeature userBytesFeature,
+                                     AdItemBytesFeature videoBytesFeature,
+                                     AdRequestContextBytesFeature requestContextBytesFeature);
+
+
+}

+ 216 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/feature/VlogAdCtrLRFeatureExtractor.java

@@ -0,0 +1,216 @@
+package com.tzld.piaoquan.recommend.feature.domain.ad.feature;
+
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdItemBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContextBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdBytesFeature;
+import com.tzld.piaoquan.recommend.feature.domain.ad.enums.VlogAdFeatureGroup;
+import com.tzld.piaoquan.recommend.feature.model.sample.FeatureGroup;
+import com.tzld.piaoquan.recommend.feature.model.sample.GroupedFeature;
+import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
+import com.tzld.piaoquan.recommend.feature.model.sample.BaseFeature;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VlogAdCtrLRFeatureExtractor extends LRBytesFeatureExtractorBase {
+
+    public VlogAdCtrLRFeatureExtractor() {
+        super();
+    }
+
+    // TODO
+    // 补充待抽取的context feature
+    public void getContextFeatures(AdRequestContextBytesFeature requestContextBytes) {
+
+        makeFea(VlogAdFeatureGroup.MACHINEINFO_BRAND, requestContextBytes.getMachineinfo_brand());
+        makeFea(VlogAdFeatureGroup.MACHINEINFO_MODEL, requestContextBytes.getMachineinfo_model());
+        makeFea(VlogAdFeatureGroup.MACHINEINFO_SDKVERSION, requestContextBytes.getMachineinfo_sdkversion());
+        makeFea(VlogAdFeatureGroup.MACHINEINFO_WECHATVERSION, requestContextBytes.getMachineinfo_wechatversion());
+
+
+        makeFea(VlogAdFeatureGroup.DAY, requestContextBytes.getWeek());
+        makeFea(VlogAdFeatureGroup.WEEK, requestContextBytes.getWeek());
+        makeFea(VlogAdFeatureGroup.HOUR, requestContextBytes.getHour());
+        makeFea(VlogAdFeatureGroup.REGION, requestContextBytes.getRegion());
+        makeFea(VlogAdFeatureGroup.CITY, requestContextBytes.getCity());
+    }
+
+    //TODO
+    public void getUserFeatures(UserAdBytesFeature userAdBytesFeature) {
+
+        // 1day features
+        makeFea(VlogAdFeatureGroup.USER_1DAY_EXP, userAdBytesFeature.getDay1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.USER_1DAY_CLICK, userAdBytesFeature.getDay1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.USER_1DAY_CTR, userAdBytesFeature.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_1DAY_CVR, userAdBytesFeature.getDay1_cnt_features().get("cvr"));
+
+        // 3day features
+        makeFea(VlogAdFeatureGroup.USER_3DAY_EXP, userAdBytesFeature.getDay3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.USER_3DAY_CLICK, userAdBytesFeature.getDay3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.USER_3DAY_CTR, userAdBytesFeature.getDay3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_3DAY_CVR, userAdBytesFeature.getDay3_cnt_features().get("cvr"));
+
+        // 7day features
+        makeFea(VlogAdFeatureGroup.USER_7DAY_EXP, userAdBytesFeature.getDay7_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.USER_7DAY_CLICK, userAdBytesFeature.getDay7_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.USER_7DAY_CTR, userAdBytesFeature.getDay7_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_7DAY_CVR, userAdBytesFeature.getDay7_cnt_features().get("cvr"));
+
+        // 3month features
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_EXP, userAdBytesFeature.getMonth3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CLICK, userAdBytesFeature.getMonth3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CTR, userAdBytesFeature.getMonth3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CVR, userAdBytesFeature.getMonth3_cnt_features().get("cvr"));
+
+
+    }
+
+    public void getItemFeature(AdItemBytesFeature item) {
+
+        // Vdieo
+        makeFea(VlogAdFeatureGroup.ADID, item.getAdId());
+        makeFea(VlogAdFeatureGroup.CREATIVE, item.getCreative());
+        makeFea(VlogAdFeatureGroup.CAMPAIGIN, item.getCampaignId());
+        makeFea(VlogAdFeatureGroup.ADVERID, item.getAdvertiserId());
+
+        // 1day features
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_EXP, item.getDay1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_CLICK, item.getDay1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_CVR, item.getDay1_cnt_features().get("cvr"));
+
+        // 3day features
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_EXP, item.getDay1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_CLICK, item.getDay1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_CVR, item.getDay1_cnt_features().get("cvr"));
+
+
+        // 7day features
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_EXP, item.getDay1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_CLICK, item.getDay1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_CVR, item.getDay1_cnt_features().get("cvr"));
+
+
+        // 3month features
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_EXP, item.getMonth3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CLICK, item.getMonth3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CTR, item.getMonth3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CVR, item.getMonth3_cnt_features().get("cvr"));
+
+
+        // creativeid 维度
+        // 1day features
+        makeFea(VlogAdFeatureGroup.CREATIVE_1DAY_CTR, item.getCreative_day1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_1DAY_CLICK, item.getCreative_day1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_1DAY_CTR, item.getCreative_day1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_1DAY_CVR, item.getCreative_day1_cnt_features().get("cvr"));
+
+        // 3day features
+        makeFea(VlogAdFeatureGroup.CREATIVE_3DAY_EXP, item.getCreative_day3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3DAY_CLICK, item.getCreative_day3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3DAY_CTR, item.getCreative_day3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3DAY_CVR, item.getCreative_day3_cnt_features().get("cvr"));
+
+        // 7day features
+        makeFea(VlogAdFeatureGroup.CREATIVE_7DAY_EXP, item.getCreative_day7_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_7DAY_CLICK, item.getCreative_day7_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_7DAY_CTR, item.getCreative_day7_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_7DAY_CVR, item.getCreative_day7_cnt_features().get("cvr"));
+
+        // 3month features
+        makeFea(VlogAdFeatureGroup.CREATIVE_3MONTH_EXP, item.getCreative_month3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3MONTH_CLICK, item.getCreative_month3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3MONTH_CTR, item.getCreative_month3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.CREATIVE_3MONTH_CVR, item.getCreative_month3_cnt_features().get("cvr"));
+
+
+        // advertiserid 维度
+        // 1day features
+        makeFea(VlogAdFeatureGroup.ADVERID_1DAY_EXP, item.getAdvertiser_day1_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ADVERID_1DAY_CLICK, item.getAdvertiser_day1_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ADVERID_1DAY_CTR, item.getAdvertiser_day1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ADVERID_1DAY_CVR, item.getAdvertiser_day1_cnt_features().get("cvr"));
+
+        // 3day features
+        makeFea(VlogAdFeatureGroup.ADVERID_3DAY_EXP, item.getAdvertiser_day3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3DAY_CLICK, item.getAdvertiser_day3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3DAY_CTR, item.getAdvertiser_day3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3DAY_CVR, item.getAdvertiser_day3_cnt_features().get("cvr"));
+
+        // 7day features
+        makeFea(VlogAdFeatureGroup.ADVERID_7DAY_EXP, item.getAdvertiser_day7_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ADVERID_7DAY_CLICK, item.getAdvertiser_day7_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ADVERID_7DAY_CTR, item.getAdvertiser_day7_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ADVERID_7DAY_CVR, item.getAdvertiser_day7_cnt_features().get("cvr"));
+
+        // 3month features
+        makeFea(VlogAdFeatureGroup.ADVERID_3MONTH_EXP, item.getAdvertiser_month3_cnt_features().get("view"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3MONTH_CLICK, item.getAdvertiser_month3_cnt_features().get("click"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3MONTH_CTR, item.getAdvertiser_month3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ADVERID_3MONTH_CVR, item.getAdvertiser_month3_cnt_features().get("cvr"));
+
+
+    }
+
+    // 增加广告交叉特征
+    public void getCrossFeature(AdItemBytesFeature itemBytesFeature, AdRequestContextBytesFeature requestContextByte, UserAdBytesFeature userAdBytesFeature) {
+        // creative and hour
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_HOUR, itemBytesFeature.getCreative(), requestContextByte.getHour());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_HOUR, itemBytesFeature.getAdvertiserId(), requestContextByte.getHour());
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_REGION, itemBytesFeature.getCreative(), requestContextByte.getRegion());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_REGION, itemBytesFeature.getAdvertiserId(), requestContextByte.getRegion());
+
+        //add city feature
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_CITY, itemBytesFeature.getCreative(), requestContextByte.getCity());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_CITY, itemBytesFeature.getAdvertiserId(), requestContextByte.getCity());
+
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_MACHINEINFO_MODEL, itemBytesFeature.getCreative(), requestContextByte.getMachineinfo_model());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_MACHINEINFO_MODEL, itemBytesFeature.getAdvertiserId(), requestContextByte.getMachineinfo_model());
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_MACHINEINFO_BRAND, itemBytesFeature.getCreative(), requestContextByte.getMachineinfo_brand());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_MACHINEINFO_BRAND, itemBytesFeature.getAdvertiserId(), requestContextByte.getMachineinfo_brand());
+
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_MACHINEINFO_SDK, itemBytesFeature.getCreative(), requestContextByte.getMachineinfo_sdkversion());
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_MACHINEINFO_SDK, itemBytesFeature.getAdvertiserId(), requestContextByte.getMachineinfo_sdkversion());
+        makeFea(VlogAdFeatureGroup.CREATIVE_AND_USER_3MONTH_CTR, itemBytesFeature.getCreative(), userAdBytesFeature.getMonth3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ADVERID_AND_USER_3MONTH_CTR, itemBytesFeature.getAdvertiserId(), userAdBytesFeature.getMonth3_cnt_features().get("ctr"));
+
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CTR_AND_ITEM_7DAY_CTR, userAdBytesFeature.getMonth3_cnt_features().get("ctr"), itemBytesFeature.getCreative_day7_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CTR_AND_ITEM_3DAY_CTR, userAdBytesFeature.getMonth3_cnt_features().get("ctr"), itemBytesFeature.getCreative_day3_cnt_features().get("ctr"));
+
+
+    }
+
+
+    @Override
+    public synchronized LRSamples single(UserAdBytesFeature userAdBytesFeature,
+                                         AdItemBytesFeature videoBytesFeature,
+                                         AdRequestContextBytesFeature requestContextBytesFeature) {
+        features.clear();
+        // extract features
+        getUserFeatures(userAdBytesFeature);
+        getContextFeatures(requestContextBytesFeature);
+        getItemFeature(videoBytesFeature);
+        getCrossFeature(videoBytesFeature, requestContextBytesFeature, userAdBytesFeature);
+
+        LRSamples.Builder lr = LRSamples.newBuilder();
+        lr.setGroupNum(groupCount);
+        List<FeatureGroup> keys = new ArrayList<>(features.keySet());
+        int count = 0;
+        for (FeatureGroup group : keys) {
+            List<BaseFeature> fea = features.get(group);
+            GroupedFeature.Builder gf = GroupedFeature.newBuilder();
+            gf.setGroup(group);
+            gf.setCount(fea.size());
+            gf.addAllFeatures(fea);
+            count += fea.size();
+            lr.addFeatures(gf);
+        }
+        lr.setCount(count);
+        return lr.build();
+    }
+
+
+}

+ 56 - 75
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java

@@ -148,80 +148,61 @@ 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(" +
-      "\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\"\342\006\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\0229\n\032cr" +
-      "eative_1day_cnt_features\030\r \001(\0132\025.AdActio" +
-      "nFeatureProto\0229\n\032creative_3day_cnt_featu" +
-      "res\030\016 \001(\0132\025.AdActionFeatureProto\0229\n\032crea" +
-      "tive_7day_cnt_features\030\017 \001(\0132\025.AdActionF" +
-      "eatureProto\022;\n\034creative_3month_cnt_featu" +
-      "res\030\020 \001(\0132\025.AdActionFeatureProto\022;\n\034adve" +
-      "rtiser_1day_cnt_features\030\021 \001(\0132\025.AdActio" +
-      "nFeatureProto\022;\n\034advertiser_3day_cnt_fea" +
-      "tures\030\022 \001(\0132\025.AdActionFeatureProto\022;\n\034ad" +
-      "vertiser_7day_cnt_features\030\023 \001(\0132\025.AdAct" +
-      "ionFeatureProto\022=\n\036advertiser_3month_cnt" +
-      "_features\030\024 \001(\0132\025.AdActionFeatureProto\"(" +
-      "\n\027GetAdItemFeatureRequest\022\r\n\005ad_id\030\001 \001(\t" +
-      "\"a\n\030GetAdItemFeatureResponse\022\027\n\006result\030\001" +
-      " \001(\0132\007.Result\022,\n\017ad_item_feature\030\002 \001(\0132\023" +
-      ".AdItemFeatureProto\"+\n\032GetAllAdItemFeatu" +
-      "reRequest\022\r\n\005ad_id\030\001 \003(\t\"d\n\033GetAllAdItem" +
-      "FeatureResponse\022\027\n\006result\030\001 \001(\0132\007.Result" +
-      "\022,\n\017ad_item_feature\030\002 \003(\0132\023.AdItemFeatur" +
-      "eProto2\314\003\n\016FeatureService\022G\n\020GetUserAdFe" +
-      "ature\022\030.GetUserAdFeatureRequest\032\031.GetUse" +
-      "rAdFeatureResponse\022G\n\020GetAdItemFeature\022\030" +
-      ".GetAdItemFeatureRequest\032\031.GetAdItemFeat" +
-      "ureResponse\022P\n\023GetAllAdItemFeature\022\033.Get" +
-      "AllAdItemFeatureRequest\032\034.GetAllAdItemFe" +
-      "atureResponse\022A\n\016GetUserFeature\022\026.GetUse" +
-      "rFeatureRequest\032\027.GetUserFeatureResponse" +
-      "\022D\n\017GetVideoFeature\022\027.GetVideoFeatureReq" +
-      "uest\032\030.GetVideoFeatureResponse\022M\n\022GetAll" +
-      "VideoFeature\022\032.GetAllVideoFeatureRequest" +
-      "\032\033.GetAllVideoFeatureResponseB8\n1com.tzl" +
-      "d.piaoquan.recommend.feature.model.featu" +
-      "reP\001\210\001\001b\006proto3"
+      "\001\"\353\001\n\022UserAdFeatureProto\022\013\n\003mid\030\001 \001(\t\0220\n" +
+      "\021day1_cnt_features\030% \001(\0132\025.AdActionFeatu" +
+      "reProto\0220\n\021day3_cnt_features\030& \001(\0132\025.AdA" +
+      "ctionFeatureProto\0220\n\021day7_cnt_features\030\'" +
+      " \001(\0132\025.AdActionFeatureProto\0222\n\023month3_cn" +
+      "t_features\030( \001(\0132\025.AdActionFeatureProto\"" +
+      "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\027GetUserAdFea" +
+      "tureRequest\022\013\n\003mid\030\001 \001(\t\"a\n\030GetUserAdFea" +
+      "tureResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n" +
+      "\017user_ad_feature\030\002 \001(\0132\023.UserAdFeaturePr" +
+      "oto\"\342\006\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\ncampaignId\030\005 \001" +
+      "(\t\022\024\n\014campaignCode\030\006 \001(\t\022\022\n\ncreativeId\030\007" +
+      " \001(\t\022\024\n\014creativeCode\030\010 \001(\t\0220\n\021day1_cnt_f" +
+      "eatures\030\t \001(\0132\025.AdActionFeatureProto\0220\n\021" +
+      "day3_cnt_features\030\n \001(\0132\025.AdActionFeatur" +
+      "eProto\0220\n\021day7_cnt_features\030\013 \001(\0132\025.AdAc" +
+      "tionFeatureProto\0222\n\023month3_cnt_features\030" +
+      "\014 \001(\0132\025.AdActionFeatureProto\0229\n\032creative" +
+      "_1day_cnt_features\030\r \001(\0132\025.AdActionFeatu" +
+      "reProto\0229\n\032creative_3day_cnt_features\030\016 " +
+      "\001(\0132\025.AdActionFeatureProto\0229\n\032creative_7" +
+      "day_cnt_features\030\017 \001(\0132\025.AdActionFeature" +
+      "Proto\022;\n\034creative_3month_cnt_features\030\020 " +
+      "\001(\0132\025.AdActionFeatureProto\022;\n\034advertiser" +
+      "_1day_cnt_features\030\021 \001(\0132\025.AdActionFeatu" +
+      "reProto\022;\n\034advertiser_3day_cnt_features\030" +
+      "\022 \001(\0132\025.AdActionFeatureProto\022;\n\034advertis" +
+      "er_7day_cnt_features\030\023 \001(\0132\025.AdActionFea" +
+      "tureProto\022=\n\036advertiser_3month_cnt_featu" +
+      "res\030\024 \001(\0132\025.AdActionFeatureProto\"(\n\027GetA" +
+      "dItemFeatureRequest\022\r\n\005ad_id\030\001 \001(\t\"a\n\030Ge" +
+      "tAdItemFeatureResponse\022\027\n\006result\030\001 \001(\0132\007" +
+      ".Result\022,\n\017ad_item_feature\030\002 \001(\0132\023.AdIte" +
+      "mFeatureProto\"+\n\032GetAllAdItemFeatureRequ" +
+      "est\022\r\n\005ad_id\030\001 \003(\t\"d\n\033GetAllAdItemFeatur" +
+      "eResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n\017ad" +
+      "_item_feature\030\002 \003(\0132\023.AdItemFeatureProto" +
+      "2\314\003\n\016FeatureService\022G\n\020GetUserAdFeature\022" +
+      "\030.GetUserAdFeatureRequest\032\031.GetUserAdFea" +
+      "tureResponse\022G\n\020GetAdItemFeature\022\030.GetAd" +
+      "ItemFeatureRequest\032\031.GetAdItemFeatureRes" +
+      "ponse\022P\n\023GetAllAdItemFeature\022\033.GetAllAdI" +
+      "temFeatureRequest\032\034.GetAllAdItemFeatureR" +
+      "esponse\022A\n\016GetUserFeature\022\026.GetUserFeatu" +
+      "reRequest\032\027.GetUserFeatureResponse\022D\n\017Ge" +
+      "tVideoFeature\022\027.GetVideoFeatureRequest\032\030" +
+      ".GetVideoFeatureResponse\022M\n\022GetAllVideoF" +
+      "eature\022\032.GetAllVideoFeatureRequest\032\033.Get" +
+      "AllVideoFeatureResponseB8\n1com.tzld.piao" +
+      "quan.recommend.feature.model.featureP\001\210\001" +
+      "\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -288,7 +269,7 @@ public final class Feature {
     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", });
+        new java.lang.String[] { "Mid", "Day1CntFeatures", "Day3CntFeatures", "Day7CntFeatures", "Month3CntFeatures", });
     internal_static_AdActionFeatureProto_descriptor =
       getDescriptor().getMessageTypes().get(10);
     internal_static_AdActionFeatureProto_fieldAccessorTable = new

+ 412 - 5242
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/UserAdFeatureProto.java

@@ -17,41 +17,6 @@ private static final long serialVersionUID = 0L;
   }
   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
@@ -90,216 +55,6 @@ private static final long serialVersionUID = 0L;
             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) {
@@ -422,5189 +177,604 @@ private static final long serialVersionUID = 0L;
     }
   }
 
-  public static final int GENDER_FIELD_NUMBER = 2;
-  private volatile java.lang.Object gender_;
+  public static final int DAY1_CNT_FEATURES_FIELD_NUMBER = 37;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day1CntFeatures_;
   /**
-   * <code>string gender = 2;</code>
-   * @return The gender.
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return Whether the day1CntFeatures field is set.
    */
   @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;
-    }
+  public boolean hasDay1CntFeatures() {
+    return day1CntFeatures_ != null;
   }
   /**
-   * <code>string gender = 2;</code>
-   * @return The bytes for gender.
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
+   * @return The day1CntFeatures.
    */
   @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 com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay1CntFeatures() {
+    return day1CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day1CntFeatures_;
   }
-
-  public static final int USER_TYPE_FIELD_NUMBER = 3;
-  private volatile java.lang.Object userType_;
   /**
-   * <code>string user_type = 3;</code>
-   * @return The userType.
+   * <code>.AdActionFeatureProto day1_cnt_features = 37;</code>
    */
   @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;
-    }
+  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>string user_type = 3;</code>
-   * @return The bytes for userType.
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return Whether the day3CntFeatures field is set.
    */
   @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 boolean hasDay3CntFeatures() {
+    return day3CntFeatures_ != null;
   }
-
-  public static final int GMT_CREATE_FIELD_NUMBER = 4;
-  private volatile java.lang.Object gmtCreate_;
   /**
-   * <code>string gmt_create = 4;</code>
-   * @return The gmtCreate.
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
+   * @return The day3CntFeatures.
    */
   @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;
-    }
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay3CntFeatures() {
+    return day3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day3CntFeatures_;
   }
   /**
-   * <code>string gmt_create = 4;</code>
-   * @return The bytes for gmtCreate.
+   * <code>.AdActionFeatureProto day3_cnt_features = 38;</code>
    */
   @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 com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay3CntFeaturesOrBuilder() {
+    return getDay3CntFeatures();
   }
 
-  public static final int TAGS_FIELD_NUMBER = 5;
-  private volatile java.lang.Object tags_;
+  public static final int DAY7_CNT_FEATURES_FIELD_NUMBER = 39;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto day7CntFeatures_;
   /**
-   * <code>string tags = 5;</code>
-   * @return The tags.
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return Whether the day7CntFeatures field is set.
    */
   @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;
-    }
+  public boolean hasDay7CntFeatures() {
+    return day7CntFeatures_ != null;
   }
   /**
-   * <code>string tags = 5;</code>
-   * @return The bytes for tags.
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
+   * @return The day7CntFeatures.
    */
   @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 com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getDay7CntFeatures() {
+    return day7CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : day7CntFeatures_;
   }
-
-  public static final int CATEGORY_NAME_FIELD_NUMBER = 6;
-  private volatile java.lang.Object categoryName_;
   /**
-   * <code>string category_name = 6;</code>
-   * @return The categoryName.
+   * <code>.AdActionFeatureProto day7_cnt_features = 39;</code>
    */
   @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 com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getDay7CntFeaturesOrBuilder() {
+    return getDay7CntFeatures();
   }
 
-  public static final int ISVIP_FIELD_NUMBER = 7;
-  private volatile java.lang.Object isvip_;
+  public static final int MONTH3_CNT_FEATURES_FIELD_NUMBER = 40;
+  private com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto month3CntFeatures_;
   /**
-   * <code>string isvip = 7;</code>
-   * @return The isvip.
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return Whether the month3CntFeatures field is set.
    */
   @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;
-    }
+  public boolean hasMonth3CntFeatures() {
+    return month3CntFeatures_ != null;
   }
   /**
-   * <code>string isvip = 7;</code>
-   * @return The bytes for isvip.
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
+   * @return The month3CntFeatures.
    */
   @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 com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto getMonth3CntFeatures() {
+    return month3CntFeatures_ == null ? com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProto.getDefaultInstance() : month3CntFeatures_;
   }
-
-  public static final int ISREWARD_FIELD_NUMBER = 8;
-  private volatile java.lang.Object isreward_;
   /**
-   * <code>string isreward = 8;</code>
-   * @return The isreward.
+   * <code>.AdActionFeatureProto month3_cnt_features = 40;</code>
    */
   @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;
-    }
+  public com.tzld.piaoquan.recommend.feature.model.feature.AdActionFeatureProtoOrBuilder getMonth3CntFeaturesOrBuilder() {
+    return getMonth3CntFeatures();
   }
-  /**
-   * <code>string isreward = 8;</code>
-   * @return The bytes for isreward.
-   */
+
+  private byte memoizedIsInitialized = -1;
   @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 final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
   }
 
-  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;
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getMidBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mid_);
     }
-  }
-  /**
-   * <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;
+    if (day1CntFeatures_ != null) {
+      output.writeMessage(37, getDay1CntFeatures());
     }
-  }
-
-  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;
+    if (day3CntFeatures_ != null) {
+      output.writeMessage(38, getDay3CntFeatures());
     }
-  }
-  /**
-   * <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;
+    if (day7CntFeatures_ != null) {
+      output.writeMessage(39, getDay7CntFeatures());
+    }
+    if (month3CntFeatures_ != null) {
+      output.writeMessage(40, getMonth3CntFeatures());
     }
+    unknownFields.writeTo(output);
   }
 
-  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;
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getMidBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, mid_);
     }
-  }
-  /**
-   * <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;
+    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;
   }
 
-  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;
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
     }
-  }
-  /**
-   * <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;
+    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;
 
-  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;
+    if (!getMid()
+        .equals(other.getMid())) return false;
+    if (hasDay1CntFeatures() != other.hasDay1CntFeatures()) return false;
+    if (hasDay1CntFeatures()) {
+      if (!getDay1CntFeatures()
+          .equals(other.getDay1CntFeatures())) return false;
     }
-  }
-  /**
-   * <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;
+    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;
   }
 
-  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;
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
     }
-  }
-  /**
-   * <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;
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + MID_FIELD_NUMBER;
+    hash = (53 * hash) + getMid().hashCode();
+    if (hasDay1CntFeatures()) {
+      hash = (37 * hash) + DAY1_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay1CntFeatures().hashCode();
     }
-  }
-
-  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;
+    if (hasDay3CntFeatures()) {
+      hash = (37 * hash) + DAY3_CNT_FEATURES_FIELD_NUMBER;
+      hash = (53 * hash) + getDay3CntFeatures().hashCode();
     }
-  }
-  /**
-   * <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;
+    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 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;
-    }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
   }
-  /**
-   * <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 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 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;
-    }
+  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);
   }
-  /**
-   * <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 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);
   }
 
-  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;
-    }
+  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);
   }
-  /**
-   * <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 Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
   }
 
-  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;
-    }
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
   }
   /**
-   * <code>string total_reward = 19;</code>
-   * @return The bytes for totalReward.
+   * Protobuf type {@code UserAdFeatureProto}
    */
-  @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 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;
     }
-  }
 
-  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;
+    @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);
     }
 
-    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;
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
     }
 
-    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;
-      }
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
     }
-    /**
-     * <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;
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
       }
     }
-    /**
-     * <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;
-    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      mid_ = "";
 
-    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;
+      if (day1CntFeaturesBuilder_ == null) {
+        day1CntFeatures_ = null;
       } else {
-        return (java.lang.String) ref;
+        day1CntFeatures_ = null;
+        day1CntFeaturesBuilder_ = null;
       }
-    }
-    /**
-     * <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;
+      if (day3CntFeaturesBuilder_ == null) {
+        day3CntFeatures_ = null;
       } else {
-        return (com.google.protobuf.ByteString) ref;
+        day3CntFeatures_ = null;
+        day3CntFeaturesBuilder_ = null;
       }
-    }
-    /**
-     * <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;
+      if (day7CntFeaturesBuilder_ == null) {
+        day7CntFeatures_ = null;
       } else {
-        return (java.lang.String) ref;
+        day7CntFeatures_ = null;
+        day7CntFeaturesBuilder_ = null;
       }
-    }
-    /**
-     * <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;
+      if (month3CntFeaturesBuilder_ == null) {
+        month3CntFeatures_ = null;
       } else {
-        return (com.google.protobuf.ByteString) ref;
+        month3CntFeatures_ = null;
+        month3CntFeaturesBuilder_ = null;
       }
-    }
-    /**
-     * <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;
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_UserAdFeatureProto_descriptor;
     }
-    /**
-     * <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;
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.UserAdFeatureProto.getDefaultInstance();
     }
 
-    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;
+    @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;
     }
-    /**
-     * <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;
+
+    @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_;
+      if (day1CntFeaturesBuilder_ == null) {
+        result.day1CntFeatures_ = day1CntFeatures_;
       } else {
-        return (com.google.protobuf.ByteString) ref;
+        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;
     }
-    /**
-     * <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;
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
     }
-    /**
-     * <code>string country = 34;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearCountry() {
-      
-      country_ = getDefaultInstance().getCountry();
-      onChanged();
-      return this;
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
     }
-    /**
-     * <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;
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
     }
-
-    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;
-      }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
     }
-    /**
-     * <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;
+    @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 {
-        return (com.google.protobuf.ByteString) ref;
+        super.mergeFrom(other);
+        return this;
       }
     }
-    /**
-     * <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;
+
+    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.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;
     }
-    /**
-     * <code>string province = 35;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearProvince() {
-      
-      province_ = getDefaultInstance().getProvince();
-      onChanged();
-      return this;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
     }
-    /**
-     * <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();
+
+    @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 city_ = "";
+    private java.lang.Object mid_ = "";
     /**
-     * <code>string city = 36;</code>
-     * @return The city.
+     * <code>string mid = 1;</code>
+     * @return The mid.
      */
-    public java.lang.String getCity() {
-      java.lang.Object ref = city_;
+    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();
-        city_ = s;
+        mid_ = s;
         return s;
       } else {
         return (java.lang.String) ref;
       }
     }
     /**
-     * <code>string city = 36;</code>
-     * @return The bytes for city.
+     * <code>string mid = 1;</code>
+     * @return The bytes for mid.
      */
     public com.google.protobuf.ByteString
-        getCityBytes() {
-      java.lang.Object ref = city_;
+        getMidBytes() {
+      java.lang.Object ref = mid_;
       if (ref instanceof String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        city_ = b;
+        mid_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
       }
     }
     /**
-     * <code>string city = 36;</code>
-     * @param value The city to set.
+     * <code>string mid = 1;</code>
+     * @param value The mid to set.
      * @return This builder for chaining.
      */
-    public Builder setCity(
+    public Builder setMid(
         java.lang.String value) {
       if (value == null) {
     throw new NullPointerException();
   }
   
-      city_ = value;
+      mid_ = value;
       onChanged();
       return this;
     }
     /**
-     * <code>string city = 36;</code>
+     * <code>string mid = 1;</code>
      * @return This builder for chaining.
      */
-    public Builder clearCity() {
+    public Builder clearMid() {
       
-      city_ = getDefaultInstance().getCity();
+      mid_ = getDefaultInstance().getMid();
       onChanged();
       return this;
     }
     /**
-     * <code>string city = 36;</code>
-     * @param value The bytes for city to set.
+     * <code>string mid = 1;</code>
+     * @param value The bytes for mid to set.
      * @return This builder for chaining.
      */
-    public Builder setCityBytes(
+    public Builder setMidBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
       
-      city_ = value;
+      mid_ = value;
       onChanged();
       return this;
     }

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

@@ -19,426 +19,6 @@ public interface UserAdFeatureProtoOrBuilder extends
   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.

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

@@ -76,41 +76,6 @@ 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;

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

@@ -1,113 +0,0 @@
-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);
-    }
-
-}