def get_following_user_id_set(cls, from_user_id): # cache set in Redis name = FOLLOWINGS_PATTERN.format(user_id=from_user_id) user_id_set = RedisHelper.get_all_members_from_set(name) # cache hit, need to change b'123' -> 123 if user_id_set is not None: user_id_set_new = set([]) for user_id in user_id_set: if isinstance(user_id, bytes): user_id = user_id.decode('utf-8') user_id_set_new.add(int(user_id)) return user_id_set_new # cache miss if not GateKeeper.is_switch_on('switch_friendship_to_hbase'): friendships = Friendship.objects.filter(from_user_id=from_user_id) else: friendships = HBaseFollowing.filter(prefix=(from_user_id, None)) user_id_set = set([ fs.to_user_id for fs in friendships ]) # push in Redis RedisHelper.add_id_to_set(name, user_id_set) return user_id_set
def get_following_user_id_set(cls, from_user_id): # <todo> cache in redis set if not GateKeeper.is_switch_on('switch_friendship_to_hbase'): friendships = Friendship.objects.filter(from_user_id=from_user_id) else: friendships = HBaseFollowing.filter(prefix=(from_user_id, None)) user_id_set = set([fs.to_user_id for fs in friendships]) return user_id_set
def get_following_user_id_set(cls, from_user_id): # <TODO> cache in redis set if not GateKeeper.is_switched_on('switch_friendship_to_hbase'): friendships = Friendship.objects.filter(from_user_id=from_user_id) else: friendships = HBaseFollowing.filter(prefix=(from_user_id, None)) # we use a set to hold a data because it is fast to check whether an elements exists there user_id_set = set([fs.to_user_id for fs in friendships]) return user_id_set
def test_filter(self): HBaseFollowing.create(from_user_id=1, to_user_id=2, created_at=self.ts_now) HBaseFollowing.create(from_user_id=1, to_user_id=3, created_at=self.ts_now) HBaseFollowing.create(from_user_id=1, to_user_id=4, created_at=self.ts_now) followings = HBaseFollowing.filter(prefix=(1, None, None)) self.assertEqual(3, len(followings)) self.assertEqual(followings[0].from_user_id, 1) self.assertEqual(followings[0].to_user_id, 2) self.assertEqual(followings[1].from_user_id, 1) self.assertEqual(followings[1].to_user_id, 3) self.assertEqual(followings[2].from_user_id, 1) self.assertEqual(followings[2].to_user_id, 4) # test limit results = HBaseFollowing.filter(prefix=(1, None, None), limit=1) self.assertEqual(len(results), 1) self.assertEqual(results[0].to_user_id, 2) results = HBaseFollowing.filter(prefix=(1, None, None), limit=2) self.assertEqual(len(results), 2) self.assertEqual(results[0].to_user_id, 2) self.assertEqual(results[1].to_user_id, 3) results = HBaseFollowing.filter(prefix=(1, None, None), limit=4) self.assertEqual(len(results), 3) self.assertEqual(results[0].to_user_id, 2) self.assertEqual(results[1].to_user_id, 3) self.assertEqual(results[2].to_user_id, 4) results = HBaseFollowing.filter(start=(1, results[1].created_at, None), limit=2) self.assertEqual(len(results), 2) self.assertEqual(results[0].to_user_id, 3) self.assertEqual(results[1].to_user_id, 4) # test reverse results = HBaseFollowing.filter(prefix=(1, None, None), limit=2, reverse=True) self.assertEqual(len(results), 2) self.assertEqual(results[0].to_user_id, 4) self.assertEqual(results[1].to_user_id, 3) results = HBaseFollowing.filter(start=(1, results[1].created_at, None), limit=2, reverse=True) self.assertEqual(len(results), 2) self.assertEqual(results[0].to_user_id, 3) self.assertEqual(results[1].to_user_id, 2)
def get_follow_instance(cls, from_user_id, to_user_id): followings = HBaseFollowing.filter(prefix=(from_user_id, None)) for follow in followings: if follow.to_user_id == to_user_id: return follow return None
def get_following_count(cls, from_user_id): if not GateKeeper.is_switched_on('switch_friendship_to_hbase'): return Friendship.objects.filter(from_user_id=from_user_id).count() followings = HBaseFollowing.filter(prefix=(from_user_id, None)) return len(followings)