Try harder to choose index queries as a data source
AndSource should be choosing which child as the primary data source based on its cost, in order to make the cheapest query. This improves the chances of a partial-index query actually being answered from the index, because the query builder adds at least one top-level index predicate (sortkey) to any query. If we treat the cost of an index query as 0, this means that of a top-level AndSource it should choose that rather than a non-index predicate. This also papers over an issue where the index rewriter fails to wrap a non-indexable predicate (e.g. ownerin) in a ChangeDataSource. Change-Id: I56d9781743fe31e5cf8c309d62cd93fe0d886219
This commit is contained in:
		@@ -126,7 +126,10 @@ public class IndexedChangeQuery extends Predicate<ChangeData>
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public int getCost() {
 | 
			
		||||
    return pred.getCost();
 | 
			
		||||
    // Index queries are assumed to be cheaper than any other type of query, so
 | 
			
		||||
    // so try to make sure they get picked. Note that pred's cost may be higher
 | 
			
		||||
    // because it doesn't know whether it's being used in an index query or not.
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -162,12 +162,15 @@ public class AndSource extends AndPredicate<ChangeData>
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ChangeDataSource source() {
 | 
			
		||||
    int minCost = Integer.MAX_VALUE;
 | 
			
		||||
    Predicate<ChangeData> s = null;
 | 
			
		||||
    for (Predicate<ChangeData> p : getChildren()) {
 | 
			
		||||
      if (p instanceof ChangeDataSource) {
 | 
			
		||||
        return (ChangeDataSource) p;
 | 
			
		||||
      if (p instanceof ChangeDataSource && p.getCost() < minCost) {
 | 
			
		||||
        s = p;
 | 
			
		||||
        minCost = p.getCost();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
    return (ChangeDataSource) s;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user