Revert DM support in HomeFeed#from_database
Fixes #1746 Queries could get prohibitively expensive.
This commit is contained in:
		
							parent
							
								
									d97fe5bb74
								
							
						
					
					
						commit
						7096e42392
					
				
					 2 changed files with 14 additions and 31 deletions
				
			
		| 
						 | 
				
			
			@ -44,10 +44,8 @@ class HomeFeed < Feed
 | 
			
		|||
  protected
 | 
			
		||||
 | 
			
		||||
  def from_database(limit, max_id, since_id, min_id)
 | 
			
		||||
    scope = Status.where(account: @account.following)
 | 
			
		||||
    scope = scope.left_outer_joins(:mentions)
 | 
			
		||||
    scope = scope.where(visibility: %i(public unlisted private)).or(scope.where(mentions: { account_id: @account.id })).group(Status.arel_table[:id])
 | 
			
		||||
    scope = scope.or(Status.where(account: @account))
 | 
			
		||||
    scope = Status.where(account: @account).or(Status.where(account: @account.following))
 | 
			
		||||
    scope = scope.where(visibility: %i(public unlisted private))
 | 
			
		||||
    scope
 | 
			
		||||
      .to_a_paginated_by_id(limit, min_id: min_id, max_id: max_id, since_id: since_id)
 | 
			
		||||
      .reject { |status| FeedManager.instance.filter?(:home, status, @account) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,32 +19,23 @@ RSpec.describe HomeFeed, type: :model do
 | 
			
		|||
      Fabricate(:status, account: other,    id: 11)
 | 
			
		||||
      Fabricate(:status, account: followed, id: 12, visibility: :private)
 | 
			
		||||
      Fabricate(:status, account: followed, id: 13, visibility: :direct)
 | 
			
		||||
      Fabricate(:status, account: account,  id: 14, visibility: :direct)
 | 
			
		||||
      dm = Fabricate(:status, account: followed, id: 15, visibility: :direct)
 | 
			
		||||
      Fabricate(:mention, account: account, status: dm)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when feed is generated' do
 | 
			
		||||
      before do
 | 
			
		||||
        FeedManager.instance.populate_home(account)
 | 
			
		||||
 | 
			
		||||
        # Add direct messages because populate_home does not do that
 | 
			
		||||
        Redis.current.zadd(
 | 
			
		||||
          FeedManager.instance.key(:home, account.id),
 | 
			
		||||
          [[14, 14], [15, 15]]
 | 
			
		||||
        )
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'gets statuses with ids in the range from redis with database' do
 | 
			
		||||
        results = subject.get(5)
 | 
			
		||||
        results = subject.get(3)
 | 
			
		||||
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10, 3]
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10, 3]
 | 
			
		||||
        expect(results.first.attributes.keys).to eq %w(id updated_at)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with since_id present' do
 | 
			
		||||
        results = subject.get(5, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10]
 | 
			
		||||
        results = subject.get(3, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with min_id present' do
 | 
			
		||||
| 
						 | 
				
			
			@ -57,25 +48,19 @@ RSpec.describe HomeFeed, type: :model do
 | 
			
		|||
      before do
 | 
			
		||||
        FeedManager.instance.populate_home(account)
 | 
			
		||||
 | 
			
		||||
        # Add direct messages because populate_home does not do that
 | 
			
		||||
        Redis.current.zadd(
 | 
			
		||||
          FeedManager.instance.key(:home, account.id),
 | 
			
		||||
          [[14, 14], [15, 15]]
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        Redis.current.zremrangebyrank(FeedManager.instance.key(:home, account.id), 0, -2)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'gets statuses with ids in the range from redis with database' do
 | 
			
		||||
        results = subject.get(5)
 | 
			
		||||
        results = subject.get(3)
 | 
			
		||||
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10, 3]
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10, 3]
 | 
			
		||||
        expect(results.first.attributes.keys).to eq %w(id updated_at)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with since_id present' do
 | 
			
		||||
        results = subject.get(5, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10]
 | 
			
		||||
        results = subject.get(3, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with min_id present' do
 | 
			
		||||
| 
						 | 
				
			
			@ -90,14 +75,14 @@ RSpec.describe HomeFeed, type: :model do
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns from database' do
 | 
			
		||||
        results = subject.get(5)
 | 
			
		||||
        results = subject.get(3)
 | 
			
		||||
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10, 3]
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10, 3]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with since_id present' do
 | 
			
		||||
        results = subject.get(5, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [15, 14, 12, 10]
 | 
			
		||||
        results = subject.get(3, nil, 3, nil)
 | 
			
		||||
        expect(results.map(&:id)).to eq [12, 10]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'with min_id present' do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue