ChangeField: Use ImmutableTable.Builder to build tables
Creating a whole empty hash-based Table is a lot of garbage memory when we just copy it into an ImmutableTable, particularly since it special-cases zero- and one-element tables to save memory. Instead, use ImmutableTable.Builder, which collects its entries as a list rather than a Table. The only semantic change is this will reject duplicate cells instead of silently ignoring them. However considering that the index field was populated from a Table, there shouldn't be duplicates anyway. Change-Id: I76b5435d6bfc484cd61fb750e0802223af8756e2
This commit is contained in:
		@@ -20,9 +20,9 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 | 
			
		||||
import com.google.common.annotations.VisibleForTesting;
 | 
			
		||||
import com.google.common.base.Function;
 | 
			
		||||
import com.google.common.base.Splitter;
 | 
			
		||||
import com.google.common.collect.HashBasedTable;
 | 
			
		||||
import com.google.common.collect.ImmutableList;
 | 
			
		||||
import com.google.common.collect.ImmutableSet;
 | 
			
		||||
import com.google.common.collect.ImmutableTable;
 | 
			
		||||
import com.google.common.collect.Iterables;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
import com.google.common.collect.Sets;
 | 
			
		||||
@@ -351,8 +351,8 @@ public class ChangeField {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static ReviewerSet parseReviewerFieldValues(Iterable<String> values) {
 | 
			
		||||
    Table<ReviewerStateInternal, Account.Id, Timestamp> table =
 | 
			
		||||
        HashBasedTable.create();
 | 
			
		||||
    ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
 | 
			
		||||
        ImmutableTable.builder();
 | 
			
		||||
    for (String v : values) {
 | 
			
		||||
      int f = v.indexOf(',');
 | 
			
		||||
      if (f < 0) {
 | 
			
		||||
@@ -362,12 +362,12 @@ public class ChangeField {
 | 
			
		||||
      if (l == f) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      table.put(
 | 
			
		||||
      b.put(
 | 
			
		||||
          ReviewerStateInternal.valueOf(v.substring(0, f)),
 | 
			
		||||
          Account.Id.parse(v.substring(f + 1, l)),
 | 
			
		||||
          new Timestamp(Long.valueOf(v.substring(l + 1, v.length()))));
 | 
			
		||||
    }
 | 
			
		||||
    return ReviewerSet.fromTable(table);
 | 
			
		||||
    return ReviewerSet.fromTable(b.build());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** Commit ID of any patch set on the change, using prefix match. */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user