Migrate part of ChangeIndex FieldDefs to the new format SchemaFields Similar to change 339337, change 342163 this change starts migrating part of ChangeIndex fields to a new format. The change index has a large number of fields, to minimize the risk, the replacement will be done in small batches. We rely on the test coverage in AbstractQueryChangesTest. Change-Id: Ife04abe38f255f487286c3bc0995893adbcea67e Release-Notes: skip
diff --git a/java/com/google/gerrit/index/testing/AbstractFakeIndex.java b/java/com/google/gerrit/index/testing/AbstractFakeIndex.java index 50efef0..086ad90 100644 --- a/java/com/google/gerrit/index/testing/AbstractFakeIndex.java +++ b/java/com/google/gerrit/index/testing/AbstractFakeIndex.java
@@ -265,7 +265,7 @@ protected ChangeData valueFor(Map<String, Object> doc) { ChangeData cd = changeDataFactory.create( - Project.nameKey((String) doc.get(ChangeField.PROJECT.getName())), + Project.nameKey((String) doc.get(ChangeField.PROJECT_SPEC.getName())), Change.id(Integer.valueOf((String) doc.get(ChangeField.LEGACY_ID_STR.getName())))); for (SchemaField<ChangeData, ?> field : getSchema().getSchemaFields().values()) { field.setIfPossible(cd, new FakeStoredValue(doc.get(field.getName())));
diff --git a/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/java/com/google/gerrit/lucene/LuceneChangeIndex.java index 1e34b4f..6419468 100644 --- a/java/com/google/gerrit/lucene/LuceneChangeIndex.java +++ b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -18,7 +18,7 @@ import static com.google.gerrit.lucene.AbstractLuceneIndex.sortFieldName; import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE; import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID_STR; -import static com.google.gerrit.server.index.change.ChangeField.PROJECT; +import static com.google.gerrit.server.index.change.ChangeField.PROJECT_SPEC; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES; import static java.util.Objects.requireNonNull; @@ -536,7 +536,7 @@ Change.Id id = Change.id(Integer.valueOf(f.stringValue())); // IndexUtils#changeFields ensures either CHANGE or PROJECT is always present. - IndexableField project = doc.get(PROJECT.getName()).iterator().next(); + IndexableField project = doc.get(PROJECT_SPEC.getName()).iterator().next(); cd = changeDataFactory.create(Project.nameKey(project.stringValue()), id); }
diff --git a/java/com/google/gerrit/server/index/IndexUtils.java b/java/com/google/gerrit/server/index/IndexUtils.java index 80cc463..7d40c00 100644 --- a/java/com/google/gerrit/server/index/IndexUtils.java +++ b/java/com/google/gerrit/server/index/IndexUtils.java
@@ -16,7 +16,7 @@ import static com.google.gerrit.server.index.change.ChangeField.CHANGE; import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID_STR; -import static com.google.gerrit.server.index.change.ChangeField.PROJECT; +import static com.google.gerrit.server.index.change.ChangeField.PROJECT_SPEC; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; @@ -81,10 +81,10 @@ // A Change is always sufficient. return fs; } - if (fs.contains(PROJECT.getName()) && fs.contains(LEGACY_ID_STR.getName())) { + if (fs.contains(PROJECT_SPEC.getName()) && fs.contains(LEGACY_ID_STR.getName())) { return fs; } - return Sets.union(fs, ImmutableSet.of(LEGACY_ID_STR.getName(), PROJECT.getName())); + return Sets.union(fs, ImmutableSet.of(LEGACY_ID_STR.getName(), PROJECT_SPEC.getName())); } /**
diff --git a/java/com/google/gerrit/server/index/change/ChangeField.java b/java/com/google/gerrit/server/index/change/ChangeField.java index c334c98..4c38346 100644 --- a/java/com/google/gerrit/server/index/change/ChangeField.java +++ b/java/com/google/gerrit/server/index/change/ChangeField.java
@@ -62,6 +62,7 @@ import com.google.gerrit.entities.converter.PatchSetProtoConverter; import com.google.gerrit.entities.converter.ProtoConverter; import com.google.gerrit.index.FieldDef; +import com.google.gerrit.index.IndexedField; import com.google.gerrit.index.RefState; import com.google.gerrit.index.SchemaFieldDefs; import com.google.gerrit.index.SchemaUtil; @@ -128,39 +129,63 @@ prefix(ChangeQueryBuilder.FIELD_CHANGE_ID).build(changeGetter(c -> c.getKey().get())); /** Change status string, in the same format as {@code status:}. */ - public static final FieldDef<ChangeData, String> STATUS = - exact(ChangeQueryBuilder.FIELD_STATUS) + public static final IndexedField<ChangeData, String> STATUS_FIELD = + IndexedField.<ChangeData>stringBuilder("Status") + .required() + .size(20) .build(changeGetter(c -> ChangeStatusPredicate.canonicalize(c.getStatus()))); + public static final IndexedField<ChangeData, String>.SearchSpec STATUS_SPEC = + STATUS_FIELD.exact(ChangeQueryBuilder.FIELD_STATUS); + /** Project containing the change. */ - public static final FieldDef<ChangeData, String> PROJECT = - exact(ChangeQueryBuilder.FIELD_PROJECT) + public static final IndexedField<ChangeData, String> PROJECT_FIELD = + IndexedField.<ChangeData>stringBuilder("Project") + .required() .stored() + .size(200) .build(changeGetter(c -> c.getProject().get())); + public static final IndexedField<ChangeData, String>.SearchSpec PROJECT_SPEC = + PROJECT_FIELD.exact(ChangeQueryBuilder.FIELD_PROJECT); + /** Project containing the change, as a prefix field. */ - public static final FieldDef<ChangeData, String> PROJECTS = - prefix(ChangeQueryBuilder.FIELD_PROJECTS).build(changeGetter(c -> c.getProject().get())); + public static final IndexedField<ChangeData, String>.SearchSpec PROJECTS_SPEC = + PROJECT_FIELD.prefix(ChangeQueryBuilder.FIELD_PROJECTS); /** Reference (aka branch) the change will submit onto. */ - public static final FieldDef<ChangeData, String> REF = - exact(ChangeQueryBuilder.FIELD_REF).build(changeGetter(c -> c.getDest().branch())); + public static final IndexedField<ChangeData, String> REF_FIELD = + IndexedField.<ChangeData>stringBuilder("Ref") + .required() + .size(300) + .build(changeGetter(c -> c.getDest().branch())); + + public static final IndexedField<ChangeData, String>.SearchSpec REF_SPEC = + REF_FIELD.exact(ChangeQueryBuilder.FIELD_REF); /** Topic, a short annotation on the branch. */ - public static final FieldDef<ChangeData, String> EXACT_TOPIC = - exact("topic4").build(ChangeField::getTopic); + public static final IndexedField<ChangeData, String> TOPIC_FIELD = + IndexedField.<ChangeData>stringBuilder("Topic").size(500).build(ChangeField::getTopic); + + public static final IndexedField<ChangeData, String>.SearchSpec EXACT_TOPIC = + TOPIC_FIELD.exact("topic4"); /** Topic, a short annotation on the branch. */ - public static final FieldDef<ChangeData, String> FUZZY_TOPIC = - fullText("topic5").build(ChangeField::getTopic); + public static final IndexedField<ChangeData, String>.SearchSpec FUZZY_TOPIC = + TOPIC_FIELD.fullText("topic5"); /** Topic, a short annotation on the branch. */ - public static final FieldDef<ChangeData, String> PREFIX_TOPIC = - prefix("topic6").build(ChangeField::getTopic); + public static final IndexedField<ChangeData, String>.SearchSpec PREFIX_TOPIC = + TOPIC_FIELD.prefix("topic6"); - /** Submission id assigned by MergeOp. */ - public static final FieldDef<ChangeData, String> SUBMISSIONID = - exact(ChangeQueryBuilder.FIELD_SUBMISSIONID).build(changeGetter(Change::getSubmissionId)); + /** {@link com.google.gerrit.entities.SubmissionId} assigned by MergeOp. */ + public static final IndexedField<ChangeData, String> SUBMISSIONID_FIELD = + IndexedField.<ChangeData>stringBuilder("SubmissionId") + .size(500) + .build(changeGetter(Change::getSubmissionId)); + + public static final IndexedField<ChangeData, String>.SearchSpec SUBMISSIONID_SPEC = + SUBMISSIONID_FIELD.exact(ChangeQueryBuilder.FIELD_SUBMISSIONID); /** Last update time since January 1, 1970. */ // TODO(issue-15518): Migrate type for timestamp index fields from Timestamp to Instant
diff --git a/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java index 6116f5a..0ce08b8 100644 --- a/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java +++ b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
@@ -16,6 +16,7 @@ import static com.google.gerrit.index.SchemaUtil.schema; +import com.google.common.collect.ImmutableList; import com.google.gerrit.index.Schema; import com.google.gerrit.index.SchemaDefinitions; import com.google.gerrit.server.query.change.ChangeData; @@ -32,79 +33,87 @@ static final Schema<ChangeData> V74 = schema( /* version= */ 74, - ChangeField.ADDED, - ChangeField.APPROVAL, - ChangeField.ASSIGNEE, - ChangeField.ATTENTION_SET_FULL, - ChangeField.ATTENTION_SET_USERS, - ChangeField.ATTENTION_SET_USERS_COUNT, - ChangeField.AUTHOR, - ChangeField.CHANGE, - ChangeField.CHERRY_PICK, - ChangeField.CHERRY_PICK_OF_CHANGE, - ChangeField.CHERRY_PICK_OF_PATCHSET, - ChangeField.COMMENT, - ChangeField.COMMENTBY, - ChangeField.COMMIT, - ChangeField.COMMIT_MESSAGE, - ChangeField.COMMITTER, - ChangeField.DELETED, - ChangeField.DELTA, - ChangeField.DIRECTORY, - ChangeField.DRAFTBY, - ChangeField.EDITBY, - ChangeField.EXACT_AUTHOR, - ChangeField.EXACT_COMMIT, - ChangeField.EXACT_COMMITTER, - ChangeField.EXACT_TOPIC, - ChangeField.EXTENSION, - ChangeField.FILE_PART, - ChangeField.FOOTER, - ChangeField.FUZZY_HASHTAG, - ChangeField.FUZZY_TOPIC, - ChangeField.GROUP, - ChangeField.HASHTAG, - ChangeField.HASHTAG_CASE_AWARE, - ChangeField.ID, - ChangeField.IS_PURE_REVERT, - ChangeField.IS_SUBMITTABLE, - ChangeField.LABEL, - ChangeField.LEGACY_ID_STR, - ChangeField.MERGE, - ChangeField.MERGEABLE, - ChangeField.MERGED_ON, - ChangeField.ONLY_EXTENSIONS, - ChangeField.OWNER, - ChangeField.PATCH_SET, - ChangeField.PATH, - ChangeField.PENDING_REVIEWER, - ChangeField.PENDING_REVIEWER_BY_EMAIL, - ChangeField.PRIVATE, - ChangeField.PROJECT, - ChangeField.PROJECTS, - ChangeField.REF, - ChangeField.REF_STATE, - ChangeField.REF_STATE_PATTERN, - ChangeField.REVERT_OF, - ChangeField.REVIEWEDBY, - ChangeField.REVIEWER, - ChangeField.REVIEWER_BY_EMAIL, - ChangeField.STAR, - ChangeField.STARBY, - ChangeField.STARTED, - ChangeField.STATUS, - ChangeField.STORED_SUBMIT_RECORD_LENIENT, - ChangeField.STORED_SUBMIT_RECORD_STRICT, - ChangeField.STORED_SUBMIT_REQUIREMENTS, - ChangeField.SUBMISSIONID, - ChangeField.SUBMIT_RECORD, - ChangeField.SUBMIT_RULE_RESULT, - ChangeField.TOTAL_COMMENT_COUNT, - ChangeField.TR, - ChangeField.UNRESOLVED_COMMENT_COUNT, - ChangeField.UPDATED, - ChangeField.UPLOADER, - ChangeField.WIP); + ImmutableList.of( + ChangeField.ADDED, + ChangeField.APPROVAL, + ChangeField.ASSIGNEE, + ChangeField.ATTENTION_SET_FULL, + ChangeField.ATTENTION_SET_USERS, + ChangeField.ATTENTION_SET_USERS_COUNT, + ChangeField.AUTHOR, + ChangeField.CHANGE, + ChangeField.CHERRY_PICK, + ChangeField.CHERRY_PICK_OF_CHANGE, + ChangeField.CHERRY_PICK_OF_PATCHSET, + ChangeField.COMMENT, + ChangeField.COMMENTBY, + ChangeField.COMMIT, + ChangeField.COMMIT_MESSAGE, + ChangeField.COMMITTER, + ChangeField.DELETED, + ChangeField.DELTA, + ChangeField.DIRECTORY, + ChangeField.DRAFTBY, + ChangeField.EDITBY, + ChangeField.EXACT_AUTHOR, + ChangeField.EXACT_COMMIT, + ChangeField.EXACT_COMMITTER, + ChangeField.EXTENSION, + ChangeField.FILE_PART, + ChangeField.FOOTER, + ChangeField.FUZZY_HASHTAG, + ChangeField.GROUP, + ChangeField.HASHTAG, + ChangeField.HASHTAG_CASE_AWARE, + ChangeField.ID, + ChangeField.IS_PURE_REVERT, + ChangeField.IS_SUBMITTABLE, + ChangeField.LABEL, + ChangeField.LEGACY_ID_STR, + ChangeField.MERGE, + ChangeField.MERGEABLE, + ChangeField.MERGED_ON, + ChangeField.ONLY_EXTENSIONS, + ChangeField.OWNER, + ChangeField.PATCH_SET, + ChangeField.PATH, + ChangeField.PENDING_REVIEWER, + ChangeField.PENDING_REVIEWER_BY_EMAIL, + ChangeField.PRIVATE, + ChangeField.REF_STATE, + ChangeField.REF_STATE_PATTERN, + ChangeField.REVERT_OF, + ChangeField.REVIEWEDBY, + ChangeField.REVIEWER, + ChangeField.REVIEWER_BY_EMAIL, + ChangeField.STAR, + ChangeField.STARBY, + ChangeField.STARTED, + ChangeField.STORED_SUBMIT_RECORD_LENIENT, + ChangeField.STORED_SUBMIT_RECORD_STRICT, + ChangeField.STORED_SUBMIT_REQUIREMENTS, + ChangeField.SUBMIT_RECORD, + ChangeField.SUBMIT_RULE_RESULT, + ChangeField.TOTAL_COMMENT_COUNT, + ChangeField.TR, + ChangeField.UNRESOLVED_COMMENT_COUNT, + ChangeField.UPDATED, + ChangeField.UPLOADER, + ChangeField.WIP), + ImmutableList.of( + ChangeField.SUBMISSIONID_FIELD, + ChangeField.STATUS_FIELD, + ChangeField.PROJECT_FIELD, + ChangeField.REF_FIELD, + ChangeField.TOPIC_FIELD), + ImmutableList.of( + ChangeField.EXACT_TOPIC, + ChangeField.FUZZY_TOPIC, + ChangeField.SUBMISSIONID_SPEC, + ChangeField.STATUS_SPEC, + ChangeField.PROJECT_SPEC, + ChangeField.PROJECTS_SPEC, + ChangeField.REF_SPEC)); /** * Added new field {@link ChangeField#PREFIX_HASHTAG} and {@link ChangeField#PREFIX_TOPIC} to @@ -115,7 +124,7 @@ new Schema.Builder<ChangeData>() .add(V74) .add(ChangeField.PREFIX_HASHTAG) - .add(ChangeField.PREFIX_TOPIC) + .addSearchSpecs(ChangeField.PREFIX_TOPIC) .build(); /** Added new field {@link ChangeField#FOOTER_NAME}. */
diff --git a/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java b/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java index 339d7bb..76610f3 100644 --- a/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java +++ b/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
@@ -16,7 +16,7 @@ import static com.google.common.base.Preconditions.checkState; import static com.google.gerrit.server.index.change.ChangeField.CHANGE; -import static com.google.gerrit.server.index.change.ChangeField.PROJECT; +import static com.google.gerrit.server.index.change.ChangeField.PROJECT_SPEC; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; @@ -69,9 +69,9 @@ int limit, Set<String> fields) { // Always include project since it is needed to load the change from NoteDb. - if (!fields.contains(CHANGE.getName()) && !fields.contains(PROJECT.getName())) { + if (!fields.contains(CHANGE.getName()) && !fields.contains(PROJECT_SPEC.getName())) { fields = new HashSet<>(fields); - fields.add(PROJECT.getName()); + fields.add(PROJECT_SPEC.getName()); } return QueryOptions.create(config, start, pageSize, pageSizeMultiplier, limit, fields); }
diff --git a/java/com/google/gerrit/server/query/change/ChangePredicates.java b/java/com/google/gerrit/server/query/change/ChangePredicates.java index 3363ad7..7dad123 100644 --- a/java/com/google/gerrit/server/query/change/ChangePredicates.java +++ b/java/com/google/gerrit/server/query/change/ChangePredicates.java
@@ -170,12 +170,12 @@ * com.google.gerrit.entities.Project.NameKey}. */ public static Predicate<ChangeData> project(Project.NameKey id) { - return new ChangeIndexPredicate(ChangeField.PROJECT, id.get()); + return new ChangeIndexPredicate(ChangeField.PROJECT_SPEC, id.get()); } /** Returns a predicate that matches changes targeted at the provided {@code refName}. */ public static Predicate<ChangeData> ref(String refName) { - return new ChangeIndexPredicate(ChangeField.REF, refName); + return new ChangeIndexPredicate(ChangeField.REF_SPEC, refName); } /** Returns a predicate that matches changes in the provided {@code topic}. */ @@ -195,7 +195,7 @@ /** Returns a predicate that matches changes submitted in the provided {@code changeSet}. */ public static Predicate<ChangeData> submissionId(String changeSet) { - return new ChangeIndexPredicate(ChangeField.SUBMISSIONID, changeSet); + return new ChangeIndexPredicate(ChangeField.SUBMISSIONID_SPEC, changeSet); } /** Returns a predicate that matches changes that modified the provided {@code path}. */ @@ -308,7 +308,7 @@ * its name. */ public static Predicate<ChangeData> projectPrefix(String prefix) { - return new ChangeIndexPredicate(ChangeField.PROJECTS, prefix); + return new ChangeIndexPredicate(ChangeField.PROJECTS_SPEC, prefix); } /**
diff --git a/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java index 9aff0c5..0dc923f 100644 --- a/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java +++ b/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
@@ -104,7 +104,7 @@ @Nullable private final Change.Status status; private ChangeStatusPredicate(@Nullable Change.Status status) { - super(ChangeField.STATUS, status != null ? canonicalize(status) : INVALID_STATUS); + super(ChangeField.STATUS_SPEC, status != null ? canonicalize(status) : INVALID_STATUS); this.status = status; }
diff --git a/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java b/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java index bbdfc66..a51dcc4 100644 --- a/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java +++ b/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java
@@ -24,7 +24,7 @@ protected final RunAutomaton pattern; public RegexProjectPredicate(String re) { - super(ChangeField.PROJECT, re); + super(ChangeField.PROJECT_SPEC, re); if (re.startsWith("^")) { re = re.substring(1);
diff --git a/java/com/google/gerrit/server/query/change/RegexRefPredicate.java b/java/com/google/gerrit/server/query/change/RegexRefPredicate.java index b2dba72..cc556ba 100644 --- a/java/com/google/gerrit/server/query/change/RegexRefPredicate.java +++ b/java/com/google/gerrit/server/query/change/RegexRefPredicate.java
@@ -24,7 +24,7 @@ protected final RunAutomaton pattern; public RegexRefPredicate(String re) throws QueryParseException { - super(ChangeField.REF, re); + super(ChangeField.REF_SPEC, re); if (re.startsWith("^")) { re = re.substring(1);
diff --git a/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java b/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java index f70c97a..451126c 100644 --- a/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java +++ b/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java
@@ -16,6 +16,7 @@ import static com.google.gerrit.index.SchemaUtil.schema; +import com.google.common.collect.ImmutableList; import com.google.gerrit.entities.Change; import com.google.gerrit.index.QueryOptions; import com.google.gerrit.index.Schema; @@ -29,10 +30,19 @@ @Ignore public class FakeChangeIndex implements ChangeIndex { - static final Schema<ChangeData> V1 = schema(1, ChangeField.STATUS); + static final Schema<ChangeData> V1 = + schema( + 1, + ImmutableList.of(), + ImmutableList.of(ChangeField.STATUS_FIELD), + ImmutableList.of(ChangeField.STATUS_SPEC)); static final Schema<ChangeData> V2 = - schema(2, ChangeField.STATUS, ChangeField.PATH, ChangeField.UPDATED); + schema( + 2, + ImmutableList.of(ChangeField.PATH, ChangeField.UPDATED), + ImmutableList.of(ChangeField.STATUS_FIELD), + ImmutableList.of(ChangeField.STATUS_SPEC)); private static class Source implements ChangeDataSource { private final Predicate<ChangeData> p;