override def setFeatures()

in home-mixer/server/src/main/scala/com/twitter/home_mixer/product/scored_tweets/feature_hydrator/adapters/earlybird/EarlybirdAdapter.scala [141:456]


  override def setFeatures(
    ebFeatures: Option[sc.ThriftTweetFeatures],
    richDataRecord: RichDataRecord
  ): Unit = {
    if (ebFeatures.nonEmpty) {
      val features = ebFeatures.get
      richDataRecord.setFeatureValue[JDouble](
        RecapFeatures.PREV_USER_TWEET_ENGAGEMENT,
        features.prevUserTweetEngagement.toDouble
      )
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_SENSITIVE, features.isSensitiveContent)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.HAS_MULTIPLE_MEDIA, features.hasMultipleMedia)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_AUTHOR_PROFILE_EGG, features.isAuthorProfileEgg)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_AUTHOR_NEW, features.isAuthorNew)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.NUM_MENTIONS, features.numMentions.toDouble)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_MENTION, features.numMentions > 0)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.NUM_HASHTAGS, features.numHashtags.toDouble)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_HASHTAG, features.numHashtags > 0)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.LINK_LANGUAGE, features.linkLanguage.toDouble)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_AUTHOR_NSFW, features.isAuthorNSFW)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_AUTHOR_SPAM, features.isAuthorSpam)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_AUTHOR_BOT, features.isAuthorBot)
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.LANGUAGE,
        features.language.map(_.getValue.toLong))
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.SIGNATURE,
        features.signature.map(_.toLong))
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.FROM_INACTIVE_USER, features.fromInActiveUser)
      richDataRecord
        .setFeatureValue[JBoolean](
          RecapFeatures.PROBABLY_FROM_FOLLOWED_AUTHOR,
          features.probablyFromFollowedAuthor)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.FROM_MUTUAL_FOLLOW, features.fromMutualFollow)
      richDataRecord.setFeatureValue[JBoolean](
        RecapFeatures.FROM_VERIFIED_ACCOUNT,
        features.fromVerifiedAccount)
      richDataRecord.setFeatureValue[JDouble](RecapFeatures.USER_REP, features.userRep)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.IS_BUSINESS_SCORE, features.isBusinessScore)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.HAS_CONSUMER_VIDEO, features.hasConsumerVideo)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_PRO_VIDEO, features.hasProVideo)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_VINE, features.hasVine)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_PERISCOPE, features.hasPeriscope)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.HAS_NATIVE_VIDEO, features.hasNativeVideo)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.HAS_NATIVE_IMAGE, features.hasNativeImage)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_CARD, features.hasCard)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_IMAGE, features.hasImage)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_NEWS, features.hasNews)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_VIDEO, features.hasVideo)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.CONTAINS_MEDIA, features.containsMedia)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.RETWEET_SEARCHER, features.retweetSearcher)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.REPLY_SEARCHER, features.replySearcher)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.MENTION_SEARCHER, features.mentionSearcher)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.REPLY_OTHER, features.replyOther)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.RETWEET_OTHER, features.retweetOther)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_REPLY, features.isReply)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_RETWEET, features.isRetweet)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.IS_OFFENSIVE, features.isOffensive)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.MATCH_UI_LANG, features.matchesUILang)
      richDataRecord
        .setFeatureValue[JBoolean](
          RecapFeatures.MATCH_SEARCHER_MAIN_LANG,
          features.matchesSearcherMainLang)
      richDataRecord.setFeatureValue[JBoolean](
        RecapFeatures.MATCH_SEARCHER_LANGS,
        features.matchesSearcherLangs)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.BIDIRECTIONAL_FAV_COUNT,
          features.bidirectionalFavCount)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.UNIDIRECTIONAL_FAV_COUNT,
          features.unidirectionalFavCount)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.BIDIRECTIONAL_REPLY_COUNT,
          features.bidirectionalReplyCount)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.UNIDIRECTIONAL_REPLY_COUNT,
          features.unidirectionalReplyCount)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.BIDIRECTIONAL_RETWEET_COUNT,
          features.bidirectionalRetweetCount)
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.UNIDIRECTIONAL_RETWEET_COUNT,
          features.unidirectionalRetweetCount)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.CONVERSATIONAL_COUNT, features.conversationCount)
      richDataRecord.setFeatureValue[JDouble](
        RecapFeatures.TWEET_COUNT_FROM_USER_IN_SNAPSHOT,
        features.tweetCountFromUserInSnapshot
      )
      richDataRecord
        .setFeatureValue[JBoolean](
          RecapFeatures.IS_RETWEETER_PROFILE_EGG,
          features.isRetweeterProfileEgg)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_RETWEETER_NEW, features.isRetweeterNew)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_RETWEETER_BOT, features.isRetweeterBot)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_RETWEETER_NSFW, features.isRetweeterNSFW)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_RETWEETER_SPAM, features.isRetweeterSpam)
      richDataRecord
        .setFeatureValue[JBoolean](
          RecapFeatures.RETWEET_OF_MUTUAL_FOLLOW,
          features.retweetOfMutualFollow)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.SOURCE_AUTHOR_REP, features.sourceAuthorRep)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.IS_RETWEET_OF_REPLY, features.isRetweetOfReply)
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.RETWEET_DIRECTED_AT_USER_IN_FIRST_DEGREE,
        features.retweetDirectedAtUserInFirstDegree
      )
      richDataRecord
        .setFeatureValue[JDouble](
          RecapFeatures.EMBEDS_IMPRESSION_COUNT,
          features.embedsImpressionCount.toDouble)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.EMBEDS_URL_COUNT, features.embedsUrlCount.toDouble)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.VIDEO_VIEW_COUNT, features.videoViewCount.toDouble)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.REPLY_COUNT, features.replyCount.toDouble)
      richDataRecord
        .setFeatureValue[JDouble](RecapFeatures.RETWEET_COUNT, features.retweetCount.toDouble)
      richDataRecord.setFeatureValue[JDouble](RecapFeatures.FAV_COUNT, features.favCount.toDouble)
      richDataRecord.setFeatureValue[JDouble](RecapFeatures.BLENDER_SCORE, features.blenderScore)
      richDataRecord.setFeatureValue[JDouble](RecapFeatures.TEXT_SCORE, features.textScore)
      richDataRecord
        .setFeatureValue[JBoolean](RecapFeatures.HAS_VISIBLE_LINK, features.hasVisibleLink)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_LINK, features.hasLink)
      richDataRecord.setFeatureValue[JBoolean](RecapFeatures.HAS_TREND, features.hasTrend)
      richDataRecord.setFeatureValue[JBoolean](
        RecapFeatures.HAS_MULTIPLE_HASHTAGS_OR_TRENDS,
        features.hasMultipleHashtagsOrTrends
      )
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.FAV_COUNT_V2,
        features.favCountV2.map(_.toDouble))
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.RETWEET_COUNT_V2,
        features.retweetCountV2.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.REPLY_COUNT_V2,
        features.replyCountV2.map(_.toDouble))
      richDataRecord.setFeatureValueFromOption(
        RecapFeatures.MENTIONED_SCREEN_NAMES,
        features.mentionsList.map(_.toSet.asJava)
      )
      val urls = features.urlsList.getOrElse(Seq.empty)
      richDataRecord.setFeatureValue(
        RecapFeatures.URL_DOMAINS,
        urls.toSet.flatMap(UrlExtractorUtil.extractDomain).asJava)
      richDataRecord.setFeatureValue[JDouble](RecapFeatures.LINK_COUNT, urls.size.toDouble)
      // shared features
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.WEIGHTED_FAV_COUNT,
        features.weightedFavoriteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.WEIGHTED_RETWEET_COUNT,
        features.weightedRetweetCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.WEIGHTED_REPLY_COUNT,
        features.weightedReplyCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.WEIGHTED_QUOTE_COUNT,
        features.weightedQuoteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.EMBEDS_IMPRESSION_COUNT_V2,
        features.embedsImpressionCountV2.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.EMBEDS_URL_COUNT_V2,
        features.embedsUrlCountV2.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.DECAYED_FAVORITE_COUNT,
        features.decayedFavoriteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.DECAYED_RETWEET_COUNT,
        features.decayedRetweetCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.DECAYED_REPLY_COUNT,
        features.decayedReplyCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.DECAYED_QUOTE_COUNT,
        features.decayedQuoteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.FAKE_FAVORITE_COUNT,
        features.fakeFavoriteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.FAKE_RETWEET_COUNT,
        features.fakeRetweetCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.FAKE_REPLY_COUNT,
        features.fakeReplyCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.FAKE_QUOTE_COUNT,
        features.fakeQuoteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.QUOTE_COUNT,
        features.quoteCount.map(_.toDouble)
      )
      richDataRecord.setFeatureValue[JDouble](
        TimelinesSharedFeatures.EARLYBIRD_SCORE,
        features.earlybirdScore
      )
      // safety features
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_ABUSIVE_FLAG,
        features.labelAbusiveFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_ABUSIVE_HI_RCL_FLAG,
        features.labelAbusiveHiRclFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_DUP_CONTENT_FLAG,
        features.labelDupContentFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_NSFW_HI_PRC_FLAG,
        features.labelNsfwHiPrcFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_NSFW_HI_RCL_FLAG,
        features.labelNsfwHiRclFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_SPAM_FLAG,
        features.labelSpamFlag
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.LABEL_SPAM_HI_RCL_FLAG,
        features.labelSpamHiRclFlag
      )
      // periscope features
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PERISCOPE_EXISTS,
        features.periscopeExists
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PERISCOPE_IS_LIVE,
        features.periscopeIsLive
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PERISCOPE_HAS_BEEN_FEATURED,
        features.periscopeHasBeenFeatured
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PERISCOPE_IS_CURRENTLY_FEATURED,
        features.periscopeIsCurrentlyFeatured
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PERISCOPE_IS_FROM_QUALITY_SOURCE,
        features.periscopeIsFromQualitySource
      )
      // misc features
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.VISIBLE_TOKEN_RATIO,
        features.visibleTokenRatio.map(_.toDouble)
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.HAS_QUOTE,
        features.hasQuote
      )
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.IS_COMPOSER_SOURCE_CAMERA,
        features.isComposerSourceCamera
      )
      // health scores
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.PREPORTED_TWEET_SCORE,
        features.pReportedTweetScore
      )
      // media
      richDataRecord.setFeatureValueFromOption(
        TimelinesSharedFeatures.CLASSIFICATION_LABELS,
        features.mediaClassificationInfo.map(_.toMap.asJava.asInstanceOf[JMap[String, JDouble]])
      )
    }
  }