package com.twitter.timelines.prediction.features.common import com.twitter.dal.personal_data.thriftjava.PersonalDataType._ import com.twitter.ml.api.Feature import com.twitter.ml.api.FeatureType import com.twitter.ml.api.Feature.Binary import java.lang.{Boolean => JBoolean} import scala.collection.JavaConverters._ object CombinedFeatures { val IS_CLICKED = new Binary("timelines.engagement.is_clicked", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_DWELLED = new Binary("timelines.engagement.is_dwelled", Set(TweetsViewed, EngagementsPrivate).asJava) val IS_DWELLED_IN_BOUNDS_V1 = new Binary( "timelines.engagement.is_dwelled_in_bounds_v1", Set(TweetsViewed, EngagementsPrivate).asJava) val IS_FAVORITED = new Binary( "timelines.engagement.is_favorited", Set(PublicLikes, PrivateLikes, EngagementsPrivate, EngagementsPublic).asJava) val IS_FOLLOWED = new Binary( "timelines.engagement.is_followed", Set(EngagementsPrivate, EngagementsPublic, Follow).asJava) val IS_IMPRESSED = new Binary("timelines.engagement.is_impressed", Set(TweetsViewed, EngagementsPrivate).asJava) val IS_OPEN_LINKED = new Binary( "timelines.engagement.is_open_linked", Set(EngagementsPrivate, LinksClickedOn).asJava) val IS_PHOTO_EXPANDED = new Binary( "timelines.engagement.is_photo_expanded", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_PROFILE_CLICKED = new Binary( "timelines.engagement.is_profile_clicked", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_QUOTED = new Binary( "timelines.engagement.is_quoted", Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava) val IS_REPLIED = new Binary( "timelines.engagement.is_replied", Set(PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava) val IS_RETWEETED = new Binary( "timelines.engagement.is_retweeted", Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava) val IS_RETWEETED_WITHOUT_QUOTE = new Binary( "timelines.enagagement.is_retweeted_without_quote", Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava) val IS_SHARE_DM_CLICKED = new Binary("timelines.engagement.is_tweet_share_dm_clicked", Set(EngagementsPrivate).asJava) val IS_SHARE_DM_SENT = new Binary("timelines.engagement.is_tweet_share_dm_sent", Set(EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_25 = new Binary( "timelines.engagement.is_video_playback_25", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_50 = new Binary( "timelines.engagement.is_video_playback_50", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_75 = new Binary( "timelines.engagement.is_video_playback_75", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_95 = new Binary( "timelines.engagement.is_video_playback_95", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_COMPLETE = new Binary( "timelines.engagement.is_video_playback_complete", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_PLAYBACK_START = new Binary( "timelines.engagement.is_video_playback_start", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_VIEWED = new Binary( "timelines.engagement.is_video_viewed", Set(MediaEngagementActivities, EngagementsPrivate).asJava) val IS_VIDEO_QUALITY_VIEWED = new Binary( "timelines.engagement.is_video_quality_viewed", Set(MediaEngagementActivities, EngagementsPrivate).asJava ) // v1: post click engagements: fav, reply val IS_GOOD_CLICKED_CONVO_DESC_V1 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_favorited_or_replied", Set( TweetsClicked, PublicLikes, PrivateLikes, PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava) // v2: post click engagements: click val IS_GOOD_CLICKED_CONVO_DESC_V2 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_v2", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_GOOD_CLICKED_WITH_DWELL_SUM_GTE_60S = new Binary( "timelines.engagement.is_good_clicked_convo_desc_favorited_or_replied_or_dwell_sum_gte_60_secs", Set( TweetsClicked, PublicLikes, PrivateLikes, PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_FAVORITED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_favorited", Set(PublicLikes, PrivateLikes, EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_REPLIED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_replied", Set(PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_RETWEETED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_retweeted", Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_CLICKED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_clicked", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_GOOD_CLICKED_CONVO_DESC_FOLLOWED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_followed", Set(EngagementsPrivate).asJava) val IS_GOOD_CLICKED_CONVO_DESC_SHARE_DM_CLICKED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_share_dm_clicked", Set(EngagementsPrivate).asJava) val IS_GOOD_CLICKED_CONVO_DESC_PROFILE_CLICKED = new Binary( "timelines.engagement.is_good_clicked_convo_desc_profile_clicked", Set(EngagementsPrivate).asJava) val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_0 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_uam_gt_0", Set(EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_1 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_uam_gt_1", Set(EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_2 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_uam_gt_2", Set(EngagementsPrivate, EngagementsPublic).asJava) val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_3 = new Binary( "timelines.engagement.is_good_clicked_convo_desc_uam_gt_3", Set(EngagementsPrivate, EngagementsPublic).asJava) val IS_TWEET_DETAIL_DWELLED = new Binary( "timelines.engagement.is_tweet_detail_dwelled", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_TWEET_DETAIL_DWELLED_8_SEC = new Binary( "timelines.engagement.is_tweet_detail_dwelled_8_sec", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_TWEET_DETAIL_DWELLED_15_SEC = new Binary( "timelines.engagement.is_tweet_detail_dwelled_15_sec", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_TWEET_DETAIL_DWELLED_25_SEC = new Binary( "timelines.engagement.is_tweet_detail_dwelled_25_sec", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_TWEET_DETAIL_DWELLED_30_SEC = new Binary( "timelines.engagement.is_tweet_detail_dwelled_30_sec", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_PROFILE_DWELLED = new Binary( "timelines.engagement.is_profile_dwelled", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_DWELLED_10_SEC = new Binary( "timelines.engagement.is_profile_dwelled_10_sec", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_DWELLED_20_SEC = new Binary( "timelines.engagement.is_profile_dwelled_20_sec", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_DWELLED_30_SEC = new Binary( "timelines.engagement.is_profile_dwelled_30_sec", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_FULLSCREEN_VIDEO_DWELLED = new Binary( "timelines.engagement.is_fullscreen_video_dwelled", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_FULLSCREEN_VIDEO_DWELLED_5_SEC = new Binary( "timelines.engagement.is_fullscreen_video_dwelled_5_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_FULLSCREEN_VIDEO_DWELLED_10_SEC = new Binary( "timelines.engagement.is_fullscreen_video_dwelled_10_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_FULLSCREEN_VIDEO_DWELLED_20_SEC = new Binary( "timelines.engagement.is_fullscreen_video_dwelled_20_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_FULLSCREEN_VIDEO_DWELLED_30_SEC = new Binary( "timelines.engagement.is_fullscreen_video_dwelled_30_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_LINK_DWELLED_15_SEC = new Binary( "timelines.engagement.is_link_dwelled_15_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_LINK_DWELLED_30_SEC = new Binary( "timelines.engagement.is_link_dwelled_30_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_LINK_DWELLED_60_SEC = new Binary( "timelines.engagement.is_link_dwelled_60_sec", Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava) val IS_HOME_LATEST_VISITED = new Binary("timelines.engagement.is_home_latest_visited", Set(EngagementsPrivate).asJava) val IS_BOOKMARKED = new Binary("timelines.engagement.is_bookmarked", Set(EngagementsPrivate).asJava) val IS_SHARED = new Binary("timelines.engagement.is_shared", Set(EngagementsPrivate).asJava) val IS_SHARE_MENU_CLICKED = new Binary("timelines.engagement.is_share_menu_clicked", Set(EngagementsPrivate).asJava) // Negative engagements val IS_DONT_LIKE = new Binary("timelines.engagement.is_dont_like", Set(EngagementsPrivate).asJava) val IS_BLOCK_CLICKED = new Binary( "timelines.engagement.is_block_clicked", Set(Blocks, TweetsClicked, EngagementsPrivate, EngagementsPublic).asJava) val IS_BLOCK_DIALOG_BLOCKED = new Binary( "timelines.engagement.is_block_dialog_blocked", Set(Blocks, EngagementsPrivate, EngagementsPublic).asJava) val IS_MUTE_CLICKED = new Binary( "timelines.engagement.is_mute_clicked", Set(Mutes, TweetsClicked, EngagementsPrivate).asJava) val IS_MUTE_DIALOG_MUTED = new Binary("timelines.engagement.is_mute_dialog_muted", Set(Mutes, EngagementsPrivate).asJava) val IS_REPORT_TWEET_CLICKED = new Binary( "timelines.engagement.is_report_tweet_clicked", Set(TweetsClicked, EngagementsPrivate).asJava) val IS_CARET_CLICKED = new Binary("timelines.engagement.is_caret_clicked", Set(EngagementsPrivate).asJava) val IS_NOT_ABOUT_TOPIC = new Binary("timelines.engagement.is_not_about_topic", Set(EngagementsPrivate).asJava) val IS_NOT_RECENT = new Binary("timelines.engagement.is_not_recent", Set(EngagementsPrivate).asJava) val IS_NOT_RELEVANT = new Binary("timelines.engagement.is_not_relevant", Set(EngagementsPrivate).asJava) val IS_SEE_FEWER = new Binary("timelines.engagement.is_see_fewer", Set(EngagementsPrivate).asJava) val IS_UNFOLLOW_TOPIC = new Binary("timelines.engagement.is_unfollow_topic", Set(EngagementsPrivate).asJava) val IS_FOLLOW_TOPIC = new Binary("timelines.engagement.is_follow_topic", Set(EngagementsPrivate).asJava) val IS_NOT_INTERESTED_IN_TOPIC = new Binary("timelines.engagement.is_not_interested_in_topic", Set(EngagementsPrivate).asJava) val IS_NEGATIVE_FEEDBACK = new Binary("timelines.engagement.is_negative_feedback", Set(EngagementsPrivate).asJava) val IS_IMPLICIT_POSITIVE_FEEDBACK_UNION = new Binary( "timelines.engagement.is_implicit_positive_feedback_union", Set(EngagementsPrivate).asJava) val IS_EXPLICIT_POSITIVE_FEEDBACK_UNION = new Binary( "timelines.engagement.is_explicit_positive_feedback_union", Set(EngagementsPrivate).asJava) val IS_ALL_NEGATIVE_FEEDBACK_UNION = new Binary( "timelines.engagement.is_all_negative_feedback_union", Set(EngagementsPrivate).asJava) // Reciprocal engagements for reply forward engagement val IS_REPLIED_REPLY_IMPRESSED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_impressed_by_author", Set(EngagementsPrivate).asJava) val IS_REPLIED_REPLY_FAVORITED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_favorited_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateLikes, PublicLikes).asJava) val IS_REPLIED_REPLY_QUOTED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_quoted_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava) val IS_REPLIED_REPLY_REPLIED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_replied_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateReplies, PublicReplies).asJava) val IS_REPLIED_REPLY_RETWEETED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_retweeted_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava) val IS_REPLIED_REPLY_BLOCKED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_blocked_by_author", Set(Blocks, EngagementsPrivate, EngagementsPublic).asJava) val IS_REPLIED_REPLY_FOLLOWED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_followed_by_author", Set(EngagementsPrivate, EngagementsPublic, Follow).asJava) val IS_REPLIED_REPLY_UNFOLLOWED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_unfollowed_by_author", Set(EngagementsPrivate, EngagementsPublic).asJava) val IS_REPLIED_REPLY_MUTED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_muted_by_author", Set(Mutes, EngagementsPrivate).asJava) val IS_REPLIED_REPLY_REPORTED_BY_AUTHOR = new Binary( "timelines.engagement.is_replied_reply_reported_by_author", Set(EngagementsPrivate).asJava) // Reciprocal engagements for fav forward engagement val IS_FAVORITED_FAV_FAVORITED_BY_AUTHOR = new Binary( "timelines.engagement.is_favorited_fav_favorited_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateLikes, PublicLikes).asJava ) val IS_FAVORITED_FAV_REPLIED_BY_AUTHOR = new Binary( "timelines.engagement.is_favorited_fav_replied_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateReplies, PublicReplies).asJava ) val IS_FAVORITED_FAV_RETWEETED_BY_AUTHOR = new Binary( "timelines.engagement.is_favorited_fav_retweeted_by_author", Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava ) val IS_FAVORITED_FAV_FOLLOWED_BY_AUTHOR = new Binary( "timelines.engagement.is_favorited_fav_followed_by_author", Set(EngagementsPrivate, EngagementsPublic).asJava ) // define good profile click by considering following engagements (follow, fav, reply, retweet, etc.) at profile page val IS_PROFILE_CLICKED_AND_PROFILE_FOLLOW = new Binary( "timelines.engagement.is_profile_clicked_and_profile_follow", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, Follow).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_FAV = new Binary( "timelines.engagement.is_profile_clicked_and_profile_fav", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, PrivateLikes, PublicLikes).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_REPLY = new Binary( "timelines.engagement.is_profile_clicked_and_profile_reply", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, PrivateReplies, PublicReplies).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_RETWEET = new Binary( "timelines.engagement.is_profile_clicked_and_profile_retweet", Set( ProfilesViewed, ProfilesClicked, EngagementsPrivate, PrivateRetweets, PublicRetweets).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_TWEET_CLICK = new Binary( "timelines.engagement.is_profile_clicked_and_profile_tweet_click", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, TweetsClicked).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_SHARE_DM_CLICK = new Binary( "timelines.engagement.is_profile_clicked_and_profile_share_dm_click", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) // This derived label is the union of all binary features above val IS_PROFILE_CLICKED_AND_PROFILE_ENGAGED = new Binary( "timelines.engagement.is_profile_clicked_and_profile_engaged", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, EngagementsPublic).asJava) // define bad profile click by considering following engagements (user report, tweet report, mute, block, etc) at profile page val IS_PROFILE_CLICKED_AND_PROFILE_USER_REPORT_CLICK = new Binary( "timelines.engagement.is_profile_clicked_and_profile_user_report_click", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_TWEET_REPORT_CLICK = new Binary( "timelines.engagement.is_profile_clicked_and_profile_tweet_report_click", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_MUTE = new Binary( "timelines.engagement.is_profile_clicked_and_profile_mute", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_PROFILE_CLICKED_AND_PROFILE_BLOCK = new Binary( "timelines.engagement.is_profile_clicked_and_profile_block", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) // This derived label is the union of bad profile click engagements and existing negative feedback val IS_NEGATIVE_FEEDBACK_V2 = new Binary( "timelines.engagement.is_negative_feedback_v2", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) val IS_NEGATIVE_FEEDBACK_UNION = new Binary( "timelines.engagement.is_negative_feedback_union", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) // don't like, mute or profile page -> mute val IS_WEAK_NEGATIVE_FEEDBACK = new Binary( "timelines.engagement.is_weak_negative_feedback", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) // report, block or profile page -> report, block val IS_STRONG_NEGATIVE_FEEDBACK = new Binary( "timelines.engagement.is_strong_negative_feedback", Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava) // engagement for following user from any surface area val IS_FOLLOWED_FROM_ANY_SURFACE_AREA = new Binary( "timelines.engagement.is_followed_from_any_surface_area", Set(EngagementsPublic, EngagementsPrivate).asJava) val IS_RELEVANCE_PROMPT_YES_CLICKED = new Binary( "timelines.engagement.is_relevance_prompt_yes_clicked", Set(EngagementsPublic, EngagementsPrivate).asJava) // Reply downvote engagements val IS_REPLY_DOWNVOTED = new Binary("timelines.engagement.is_reply_downvoted", Set(EngagementsPrivate).asJava) val IS_REPLY_DOWNVOTE_REMOVED = new Binary("timelines.engagement.is_reply_downvote_removed", Set(EngagementsPrivate).asJava) /** * Contains all engagements that are used/consumed by real-time * aggregates summingbird jobs. These engagements need to be * extractable from [[ClientEvent]]. */ val EngagementsRealTime: Set[Feature[JBoolean]] = Set( IS_CLICKED, IS_DWELLED, IS_FAVORITED, IS_FOLLOWED, IS_OPEN_LINKED, IS_PHOTO_EXPANDED, IS_PROFILE_CLICKED, IS_QUOTED, IS_REPLIED, IS_RETWEETED, IS_RETWEETED_WITHOUT_QUOTE, IS_SHARE_DM_CLICKED, IS_SHARE_DM_SENT, IS_VIDEO_PLAYBACK_50, IS_VIDEO_VIEWED, IS_VIDEO_QUALITY_VIEWED ) val NegativeEngagementsRealTime: Set[Feature[JBoolean]] = Set( IS_REPORT_TWEET_CLICKED, IS_BLOCK_CLICKED, IS_MUTE_CLICKED ) val NegativeEngagementsRealTimeDontLike: Set[Feature[JBoolean]] = Set( IS_DONT_LIKE ) val NegativeEngagementsSecondary: Set[Feature[JBoolean]] = Set( IS_NOT_INTERESTED_IN_TOPIC, IS_NOT_ABOUT_TOPIC, IS_NOT_RECENT, IS_NOT_RELEVANT, IS_SEE_FEWER, IS_UNFOLLOW_TOPIC ) val PrivateEngagements: Set[Feature[JBoolean]] = Set( IS_CLICKED, IS_DWELLED, IS_OPEN_LINKED, IS_PHOTO_EXPANDED, IS_PROFILE_CLICKED, IS_QUOTED, IS_VIDEO_PLAYBACK_50, IS_VIDEO_QUALITY_VIEWED ) val ImpressedEngagements: Set[Feature[JBoolean]] = Set( IS_IMPRESSED ) val PrivateEngagementsV2: Set[Feature[JBoolean]] = Set( IS_CLICKED, IS_OPEN_LINKED, IS_PHOTO_EXPANDED, IS_PROFILE_CLICKED, IS_VIDEO_PLAYBACK_50, IS_VIDEO_QUALITY_VIEWED ) ++ ImpressedEngagements val CoreEngagements: Set[Feature[JBoolean]] = Set( IS_FAVORITED, IS_REPLIED, IS_RETWEETED ) val DwellEngagements: Set[Feature[JBoolean]] = Set( IS_DWELLED ) val PrivateCoreEngagements: Set[Feature[JBoolean]] = Set( IS_CLICKED, IS_OPEN_LINKED, IS_PHOTO_EXPANDED, IS_VIDEO_PLAYBACK_50, IS_VIDEO_QUALITY_VIEWED ) val ConditionalEngagements: Set[Feature[JBoolean]] = Set( IS_GOOD_CLICKED_CONVO_DESC_V1, IS_GOOD_CLICKED_CONVO_DESC_V2, IS_GOOD_CLICKED_WITH_DWELL_SUM_GTE_60S ) val ShareEngagements: Set[Feature[JBoolean]] = Set( IS_SHARED, IS_SHARE_MENU_CLICKED ) val BookmarkEngagements: Set[Feature[JBoolean]] = Set( IS_BOOKMARKED ) val TweetDetailDwellEngagements: Set[Feature[JBoolean]] = Set( IS_TWEET_DETAIL_DWELLED, IS_TWEET_DETAIL_DWELLED_8_SEC, IS_TWEET_DETAIL_DWELLED_15_SEC, IS_TWEET_DETAIL_DWELLED_25_SEC, IS_TWEET_DETAIL_DWELLED_30_SEC ) val ProfileDwellEngagements: Set[Feature[JBoolean]] = Set( IS_PROFILE_DWELLED, IS_PROFILE_DWELLED_10_SEC, IS_PROFILE_DWELLED_20_SEC, IS_PROFILE_DWELLED_30_SEC ) val FullscreenVideoDwellEngagements: Set[Feature[JBoolean]] = Set( IS_FULLSCREEN_VIDEO_DWELLED, IS_FULLSCREEN_VIDEO_DWELLED_5_SEC, IS_FULLSCREEN_VIDEO_DWELLED_10_SEC, IS_FULLSCREEN_VIDEO_DWELLED_20_SEC, IS_FULLSCREEN_VIDEO_DWELLED_30_SEC ) // Please do not add new engagements here until having estimated the impact // to capacity requirements. User-author real-time aggregates have a very // large key space. val UserAuthorEngagements: Set[Feature[JBoolean]] = CoreEngagements ++ DwellEngagements ++ Set( IS_CLICKED, IS_PROFILE_CLICKED, IS_PHOTO_EXPANDED, IS_VIDEO_PLAYBACK_50, IS_NEGATIVE_FEEDBACK_UNION ) val ImplicitPositiveEngagements: Set[Feature[JBoolean]] = Set( IS_CLICKED, IS_DWELLED, IS_OPEN_LINKED, IS_PROFILE_CLICKED, IS_QUOTED, IS_VIDEO_PLAYBACK_50, IS_VIDEO_QUALITY_VIEWED, IS_TWEET_DETAIL_DWELLED, IS_GOOD_CLICKED_CONVO_DESC_V1, IS_GOOD_CLICKED_CONVO_DESC_V2, IS_SHARED, IS_SHARE_MENU_CLICKED, IS_SHARE_DM_SENT, IS_SHARE_DM_CLICKED ) val ExplicitPositiveEngagements: Set[Feature[JBoolean]] = CoreEngagements ++ Set( IS_FOLLOWED, IS_QUOTED ) val AllNegativeEngagements: Set[Feature[JBoolean]] = NegativeEngagementsRealTime ++ NegativeEngagementsRealTimeDontLike ++ Set( IS_NOT_RECENT, IS_NOT_RELEVANT, IS_SEE_FEWER ) }