Remove all references to deleted change fields

We had lots of hard-coded logic to do slightly different things
depending on which version of a particular field was present in a
schema. For every field that has now been completely removed, we can
remove references including these bits of extra logic.

The difference is especially striking in the sortkey query path. Note
that queries containing sortkeys have already been failing since
servers upgraded to schema version 8 (2.9), which no longer uses this
field.

Change-Id: Ib1fbc9f3aa45bf068b7869ca3aada40dbe4cb1bb
This commit is contained in:
Dave Borowitz
2014-12-18 14:32:29 -08:00
parent 6a2fe90923
commit 90ee0cb3f2
18 changed files with 60 additions and 547 deletions

View File

@@ -51,8 +51,6 @@ import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeDataSource;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.SortKeyPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
@@ -259,7 +257,7 @@ public class LuceneChangeIndex implements ChangeIndex {
CustomMappingAnalyzer analyzer =
new CustomMappingAnalyzer(new StandardAnalyzer(CharArraySet.EMPTY_SET),
CUSTOM_CHAR_MAPPING);
queryBuilder = new QueryBuilder(schema, analyzer);
queryBuilder = new QueryBuilder(analyzer);
BooleanQuery.setMaxClauseCount(cfg.getInt("index", "defaultMaxClauseCount",
BooleanQuery.getMaxClauseCount()));
@@ -352,7 +350,7 @@ public class LuceneChangeIndex implements ChangeIndex {
indexes.add(closedIndex);
}
return new QuerySource(indexes, queryBuilder.toQuery(p), start, limit,
getSort(schema, p));
getSort());
}
@Override
@@ -360,22 +358,12 @@ public class LuceneChangeIndex implements ChangeIndex {
setReady(sitePaths, schema.getVersion(), ready);
}
@SuppressWarnings("deprecation")
private static Sort getSort(Schema<ChangeData> schema,
Predicate<ChangeData> p) {
// Standard order is descending by sort key, unless reversed due to a
// sortkey_before predicate.
if (SortKeyPredicate.hasSortKeyField(schema)) {
boolean reverse = ChangeQueryBuilder.hasNonTrivialSortKeyAfter(schema, p);
return new Sort(new SortField(
ChangeField.SORTKEY.getName(), SortField.Type.LONG, !reverse));
} else {
return new Sort(
new SortField(
ChangeField.UPDATED.getName(), SortField.Type.LONG, true),
new SortField(
ChangeField.LEGACY_ID.getName(), SortField.Type.INT, true));
}
private static Sort getSort() {
return new Sort(
new SortField(
ChangeField.UPDATED.getName(), SortField.Type.LONG, true),
new SortField(
ChangeField.LEGACY_ID.getName(), SortField.Type.INT, true));
}
private class QuerySource implements ChangeDataSource {
@@ -530,17 +518,8 @@ public class LuceneChangeIndex implements ChangeIndex {
doc.add(new LongField(name, (Long) value, store));
}
} else if (type == FieldType.TIMESTAMP) {
@SuppressWarnings("deprecation")
boolean legacy = values.getField() == ChangeField.LEGACY_UPDATED;
if (legacy) {
for (Object value : values.getValues()) {
int t = queryBuilder.toIndexTimeInMinutes((Timestamp) value);
doc.add(new IntField(name, t, store));
}
} else {
for (Object value : values.getValues()) {
doc.add(new LongField(name, ((Timestamp) value).getTime(), store));
}
for (Object value : values.getValues()) {
doc.add(new LongField(name, ((Timestamp) value).getTime(), store));
}
} else if (type == FieldType.EXACT
|| type == FieldType.PREFIX) {

View File

@@ -25,7 +25,6 @@ import com.google.gerrit.server.index.FieldType;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.index.IntegerRangePredicate;
import com.google.gerrit.server.index.RegexPredicate;
import com.google.gerrit.server.index.Schema;
import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gerrit.server.query.AndPredicate;
import com.google.gerrit.server.query.NotPredicate;
@@ -33,7 +32,6 @@ import com.google.gerrit.server.query.OrPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.SortKeyPredicate;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
@@ -61,11 +59,9 @@ public class QueryBuilder {
return intTerm(ID_FIELD, id.get());
}
private final Schema<ChangeData> schema;
private final org.apache.lucene.util.QueryBuilder queryBuilder;
public QueryBuilder(Schema<ChangeData> schema, Analyzer analyzer) {
this.schema = schema;
public QueryBuilder(Analyzer analyzer) {
queryBuilder = new org.apache.lucene.util.QueryBuilder(analyzer);
}
@@ -151,8 +147,6 @@ public class QueryBuilder {
return prefixQuery(p);
} else if (p.getType() == FieldType.FULL_TEXT) {
return fullTextQuery(p);
} else if (p instanceof SortKeyPredicate) {
return sortKeyQuery((SortKeyPredicate) p);
} else {
throw badFieldType(p.getType());
}
@@ -199,56 +193,28 @@ public class QueryBuilder {
throw new QueryParseException("not an integer range: " + p);
}
private Query sortKeyQuery(SortKeyPredicate p) {
long min = p.getMinValue(schema);
long max = p.getMaxValue(schema);
return NumericRangeQuery.newLongRange(
p.getField().getName(),
min != Long.MIN_VALUE ? min : null,
max != Long.MAX_VALUE ? max : null,
false, false);
}
@SuppressWarnings("deprecation")
private Query timestampQuery(IndexPredicate<ChangeData> p)
throws QueryParseException {
if (p instanceof TimestampRangePredicate) {
TimestampRangePredicate<ChangeData> r =
(TimestampRangePredicate<ChangeData>) p;
if (r.getField() == ChangeField.LEGACY_UPDATED) {
return NumericRangeQuery.newIntRange(
r.getField().getName(),
toIndexTimeInMinutes(r.getMinTimestamp()),
toIndexTimeInMinutes(r.getMaxTimestamp()),
true, true);
} else {
return NumericRangeQuery.newLongRange(
r.getField().getName(),
r.getMinTimestamp().getTime(),
r.getMaxTimestamp().getTime(),
true, true);
}
return NumericRangeQuery.newLongRange(
r.getField().getName(),
r.getMinTimestamp().getTime(),
r.getMaxTimestamp().getTime(),
true, true);
}
throw new QueryParseException("not a timestamp: " + p);
}
@SuppressWarnings("deprecation")
private Query notTimestamp(TimestampRangePredicate<ChangeData> r)
throws QueryParseException {
if (r.getMinTimestamp().getTime() == 0) {
if (r.getField() == ChangeField.LEGACY_UPDATED) {
return NumericRangeQuery.newIntRange(
r.getField().getName(),
toIndexTimeInMinutes(r.getMaxTimestamp()),
null,
true, true);
} else {
return NumericRangeQuery.newLongRange(
r.getField().getName(),
r.getMaxTimestamp().getTime(),
null,
true, true);
}
return NumericRangeQuery.newLongRange(
r.getField().getName(),
r.getMaxTimestamp().getTime(),
null,
true, true);
}
throw new QueryParseException("cannot negate: " + r);
}