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
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index e0236cd..e8825c5 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -51,8 +51,6 @@
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 @@
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 @@
indexes.add(closedIndex);
}
return new QuerySource(indexes, queryBuilder.toQuery(p), start, limit,
- getSort(schema, p));
+ getSort());
}
@Override
@@ -360,22 +358,12 @@
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 @@
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) {
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
index 28a8315..28af057 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
@@ -25,7 +25,6 @@
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.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 @@
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 @@
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 @@
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);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
index 2e2959c..d8fb7db 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
@@ -27,7 +27,6 @@
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeData.ChangedLines;
@@ -120,18 +119,6 @@
}
};
- @Deprecated
- /** Topic, a short annotation on the branch. */
- public static final FieldDef<ChangeData, String> LEGACY_TOPIC =
- new FieldDef.Single<ChangeData, String>(
- ChangeQueryBuilder.FIELD_TOPIC, FieldType.EXACT, false) {
- @Override
- public String get(ChangeData input, FillArgs args)
- throws OrmException {
- return input.change().getTopic();
- }
- };
-
/** Topic, a short annotation on the branch. */
public static final FieldDef<ChangeData, String> TOPIC =
new FieldDef.Single<ChangeData, String>(
@@ -143,20 +130,6 @@
}
};
- // Same value as UPDATED, but implementations truncated to minutes.
- @Deprecated
- /** Last update time since January 1, 1970. */
- public static final FieldDef<ChangeData, Timestamp> LEGACY_UPDATED =
- new FieldDef.Single<ChangeData, Timestamp>(
- "updated", FieldType.TIMESTAMP, true) {
- @Override
- public Timestamp get(ChangeData input, FillArgs args)
- throws OrmException {
- return input.change().getLastUpdatedOn();
- }
- };
-
-
/** Last update time since January 1, 1970. */
public static final FieldDef<ChangeData, Timestamp> UPDATED =
new FieldDef.Single<ChangeData, Timestamp>(
@@ -168,43 +141,6 @@
}
};
- @Deprecated
- public static long legacyParseSortKey(String sortKey) {
- if ("z".equals(sortKey)) {
- return Long.MAX_VALUE;
- }
- return Long.parseLong(sortKey.substring(0, 8), 16);
- }
-
- /** Legacy sort key field. */
- @Deprecated
- public static final FieldDef<ChangeData, Long> LEGACY_SORTKEY =
- new FieldDef.Single<ChangeData, Long>(
- "sortkey", FieldType.LONG, true) {
- @Override
- public Long get(ChangeData input, FillArgs args)
- throws OrmException {
- return legacyParseSortKey(input.change().getSortKey());
- }
- };
-
- /**
- * Sort key field.
- * <p>
- * Redundant with {@link #UPDATED} and {@link #LEGACY_ID}, but secondary index
- * implementations may not be able to search over tuples of values.
- */
- @Deprecated
- public static final FieldDef<ChangeData, Long> SORTKEY =
- new FieldDef.Single<ChangeData, Long>(
- "sortkey2", FieldType.LONG, true) {
- @Override
- public Long get(ChangeData input, FillArgs args)
- throws OrmException {
- return ChangeUtil.parseSortKey(input.change().getSortKey());
- }
- };
-
/** List of full file paths modified in the current patch set. */
public static final FieldDef<ChangeData, Iterable<String>> PATH =
new FieldDef.Repeatable<ChangeData, String>(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
index cc36928..3b04f05 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
@@ -84,10 +84,7 @@
* @param start offset in results list at which to start returning results.
* @param limit maximum number of results to return.
* @return a source of documents matching the predicate. Documents must be
- * returned in descending sort key order, unless a {@code sortkey_after}
- * predicate (with a cut point not at {@link Long#MAX_VALUE}) is provided,
- * in which case the source should return documents in ascending sort key
- * order starting from the sort key cut point.
+ * returned in descending updated timestamp order.
*
* @throws QueryParseException if the predicate could not be converted to an
* indexed data source.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
index 1bdcf79..34d37d8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
@@ -14,18 +14,15 @@
package com.google.gerrit.server.index;
-import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
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.Paginated;
-import com.google.gerrit.server.query.change.SortKeyPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
@@ -44,40 +41,6 @@
public class IndexedChangeQuery extends Predicate<ChangeData>
implements ChangeDataSource, Paginated {
- /**
- * Replace all {@link SortKeyPredicate}s in a tree.
- * <p>
- * Strictly speaking this should replace only the {@link SortKeyPredicate} at
- * the top-level AND node, but this implementation is simpler, and the
- * behavior of having multiple sortkey operators is undefined anyway.
- *
- * @param p predicate to replace in.
- * @param newValue new cut value to replace all sortkey operators with.
- * @return a copy of {@code p} with all sortkey predicates replaced; or p
- * itself.
- */
- @VisibleForTesting
- static Predicate<ChangeData> replaceSortKeyPredicates(
- Predicate<ChangeData> p, String newValue) {
- if (p instanceof SortKeyPredicate) {
- return ((SortKeyPredicate) p).copy(newValue);
- } else if (p.getChildCount() > 0) {
- List<Predicate<ChangeData>> newChildren =
- Lists.newArrayListWithCapacity(p.getChildCount());
- boolean replaced = false;
- for (Predicate<ChangeData> c : p.getChildren()) {
- Predicate<ChangeData> nc = replaceSortKeyPredicates(c, newValue);
- newChildren.add(nc);
- if (nc != c) {
- replaced = true;
- }
- }
- return replaced ? p.copy(newChildren) : p;
- } else {
- return p;
- }
- }
-
private final ChangeIndex index;
private final int limit;
@@ -163,27 +126,13 @@
}
@Override
- public ResultSet<ChangeData> restart(ChangeData last) throws OrmException {
- pred = replaceSortKeyPredicates(pred, last.change().getSortKey());
- try {
- source = index.getSource(pred, 0, limit);
- } catch (QueryParseException e) {
- // Don't need to show this exception to the user; the only thing that
- // changed about pred was its SortKeyPredicates, and any other QPEs
- // that might happen should have already thrown from the constructor.
- throw new OrmException(e);
- }
- return read();
- }
-
- @Override
public ResultSet<ChangeData> restart(int start) throws OrmException {
try {
source = index.getSource(pred, start, limit);
} catch (QueryParseException e) {
// Don't need to show this exception to the user; the only thing that
- // changed about pred was its SortKeyPredicates, and any other QPEs
- // that might happen should have already thrown from the constructor.
+ // changed about pred was its start, and any other QPEs that might happen
+ // should have already thrown from the constructor.
throw new OrmException(e);
}
return read();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java
index f611052..8ba7df9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java
@@ -14,12 +14,7 @@
package com.google.gerrit.server.index;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.index.ChangeField.UPDATED;
-
import com.google.gerrit.server.query.QueryParseException;
-import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtjsonrpc.common.JavaSqlTimestampHelper;
import java.sql.Timestamp;
@@ -27,22 +22,6 @@
// TODO: Migrate this to IntegerRangePredicate
public abstract class TimestampRangePredicate<I> extends IndexPredicate<I> {
- @SuppressWarnings({"deprecation", "unchecked"})
- protected static FieldDef<ChangeData, Timestamp> updatedField(
- Schema<ChangeData> schema) {
- if (schema == null) {
- return ChangeField.LEGACY_UPDATED;
- }
- FieldDef<ChangeData, ?> f = schema.getFields().get(UPDATED.getName());
- if (f == null) {
- f = schema.getFields().get(ChangeField.LEGACY_UPDATED.getName());
- checkNotNull(f, "schema missing updated field, found: %s", schema);
- }
- checkArgument(f.getType() == FieldType.TIMESTAMP,
- "expected %s to be TIMESTAMP, found %s", f.getName(), f.getType());
- return (FieldDef<ChangeData, Timestamp>) f;
- }
-
protected static Timestamp parse(String value) throws QueryParseException {
try {
return JavaSqlTimestampHelper.parseTimestamp(value);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java
index cb0038c..aeb9619 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java
@@ -14,7 +14,7 @@
package com.google.gerrit.server.query.change;
-import com.google.gerrit.server.index.Schema;
+import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gwtorm.server.OrmException;
@@ -24,9 +24,8 @@
public class AfterPredicate extends TimestampRangePredicate<ChangeData> {
private final Date cut;
- AfterPredicate(Schema<ChangeData> schema, String value)
- throws QueryParseException {
- super(updatedField(schema), ChangeQueryBuilder.FIELD_BEFORE, value);
+ AfterPredicate(String value) throws QueryParseException {
+ super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_BEFORE, value);
cut = parse(value);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java
index cbce335..9a4ef19 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java
@@ -20,7 +20,7 @@
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.index.Schema;
+import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gwtorm.server.OrmException;
@@ -29,8 +29,8 @@
public class AgePredicate extends TimestampRangePredicate<ChangeData> {
private final long cut;
- AgePredicate(Schema<ChangeData> schema, String value) {
- super(updatedField(schema), ChangeQueryBuilder.FIELD_AGE, value);
+ AgePredicate(String value) {
+ super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value);
long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS);
long ms = MILLISECONDS.convert(s, SECONDS);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
index 55fd281..82260b4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
@@ -108,10 +108,6 @@
if (source == null) {
throw new OrmException("No ChangeDataSource: " + this);
}
- @SuppressWarnings("unchecked")
- Predicate<ChangeData> pred = (Predicate<ChangeData>) source;
- boolean useSortKey = ChangeQueryBuilder.hasSortKey(pred);
-
List<ChangeData> r = Lists.newArrayList();
ChangeData last = null;
int nextStart = 0;
@@ -133,12 +129,9 @@
//
Paginated p = (Paginated) source;
while (skipped && r.size() < p.limit() + start) {
- ChangeData lastBeforeRestart = last;
skipped = false;
last = null;
- ResultSet<ChangeData> next = useSortKey
- ? p.restart(lastBeforeRestart)
- : p.restart(nextStart);
+ ResultSet<ChangeData> next = p.restart(nextStart);
for (ChangeData data : buffer(source, next)) {
if (match(data)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java
index f724676..8f51476 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java
@@ -14,7 +14,7 @@
package com.google.gerrit.server.query.change;
-import com.google.gerrit.server.index.Schema;
+import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gwtorm.server.OrmException;
@@ -24,9 +24,8 @@
public class BeforePredicate extends TimestampRangePredicate<ChangeData> {
private final Date cut;
- BeforePredicate(Schema<ChangeData> schema, String value)
- throws QueryParseException {
- super(updatedField(schema), ChangeQueryBuilder.FIELD_BEFORE, value);
+ BeforePredicate(String value) throws QueryParseException {
+ super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_BEFORE, value);
cut = parse(value);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index b8d1241..0678775 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -37,7 +37,6 @@
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
-import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexCollection;
@@ -128,18 +127,6 @@
return ip != null ? ip.intValue() : null;
}
- public static boolean hasNonTrivialSortKeyAfter(Schema<ChangeData> schema,
- Predicate<ChangeData> p) {
- SortKeyPredicate after =
- find(p, SortKeyPredicate.class, "sortkey_after");
- return after != null && after.getMaxValue(schema) > 0;
- }
-
- public static boolean hasSortKey(Predicate<ChangeData> p) {
- return find(p, SortKeyPredicate.class, "sortkey_after") != null
- || find(p, SortKeyPredicate.class, "sortkey_before") != null;
- }
-
@VisibleForTesting
public static class Arguments {
final Provider<ReviewDb> db;
@@ -238,12 +225,12 @@
@Operator
public Predicate<ChangeData> age(String value) {
- return new AgePredicate(schema(args.indexes), value);
+ return new AgePredicate(value);
}
@Operator
public Predicate<ChangeData> before(String value) throws QueryParseException {
- return new BeforePredicate(schema(args.indexes), value);
+ return new BeforePredicate(value);
}
@Operator
@@ -253,7 +240,7 @@
@Operator
public Predicate<ChangeData> after(String value) throws QueryParseException {
- return new AfterPredicate(schema(args.indexes), value);
+ return new AfterPredicate(value);
}
@Operator
@@ -374,10 +361,7 @@
}
@Operator
- public Predicate<ChangeData> projects(String name) throws QueryParseException {
- if (!schema(args.indexes).hasField(ChangeField.PROJECTS)) {
- throw new QueryParseException("Unsupported operator: " + FIELD_PROJECTS);
- }
+ public Predicate<ChangeData> projects(String name) {
return new ProjectPrefixPredicate(name);
}
@@ -408,8 +392,8 @@
@Operator
public Predicate<ChangeData> topic(String name) {
if (name.startsWith("^"))
- return new RegexTopicPredicate(schema(args.indexes), name);
- return new TopicPredicate(schema(args.indexes), name);
+ return new RegexTopicPredicate(name);
+ return new TopicPredicate(name);
}
@Operator
@@ -673,25 +657,6 @@
return new LimitPredicate(limit);
}
- boolean supportsSortKey() {
- return SortKeyPredicate.hasSortKeyField(schema(args.indexes));
- }
-
- @Operator
- public Predicate<ChangeData> sortkey_after(String sortKey) {
- return new SortKeyPredicate.After(schema(args.indexes), args.db, sortKey);
- }
-
- @Operator
- public Predicate<ChangeData> sortkey_before(String sortKey) {
- return new SortKeyPredicate.Before(schema(args.indexes), args.db, sortKey);
- }
-
- @Operator
- public Predicate<ChangeData> resume_sortkey(String sortKey) {
- return sortkey_before(sortKey);
- }
-
@Operator
public Predicate<ChangeData> added(String value)
throws QueryParseException {
@@ -717,7 +682,7 @@
}
@Override
- protected Predicate<ChangeData> defaultField(String query) {
+ protected Predicate<ChangeData> defaultField(String query) throws QueryParseException {
if (query.startsWith("refs/")) {
return ref(query);
} else if (DEF_CHANGE.matcher(query).matches()) {
@@ -752,11 +717,7 @@
}
predicates.add(message(query));
predicates.add(comment(query));
- try {
- predicates.add(projects(query));
- } catch (QueryParseException e) {
- // Skip.
- }
+ predicates.add(projects(query));
predicates.add(ref(query));
predicates.add(branch(query));
predicates.add(topic(query));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/Paginated.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/Paginated.java
index e411cf9..7afd934 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/Paginated.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/Paginated.java
@@ -20,7 +20,5 @@
public interface Paginated {
int limit();
- ResultSet<ChangeData> restart(ChangeData last) throws OrmException;
-
ResultSet<ChangeData> restart(int start) throws OrmException;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
index 8945cb2..919c0f7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
@@ -63,23 +63,6 @@
options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16)));
}
- @Option(name = "-P", metaVar = "SORTKEY", usage = "Previous changes before SORTKEY")
- public void setSortKeyAfter(String key) {
- // Querying for the prior page of changes requires sortkey_after predicate.
- // Changes are shown most recent->least recent. The previous page of
- // results contains changes that were updated after the given key.
- imp.setSortkeyAfter(key);
- reverse = true;
- }
-
- @Option(name = "-N", metaVar = "SORTKEY", usage = "Next changes after SORTKEY")
- public void setSortKeyBefore(String key) {
- // Querying for the next page of changes requires sortkey_before predicate.
- // Changes are shown most recent->least recent. The next page contains
- // changes that were updated before the given key.
- imp.setSortkeyBefore(key);
- }
-
@Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", usage = "Number of changes to skip")
public void setStart(int start) {
imp.setStart(start);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
index d44de07..122c785 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
@@ -51,8 +51,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.Date;
import java.util.List;
@@ -60,30 +58,6 @@
private static final Logger log =
LoggerFactory.getLogger(QueryProcessor.class);
- private final Comparator<ChangeData> cmpAfter =
- new Comparator<ChangeData>() {
- @Override
- public int compare(ChangeData a, ChangeData b) {
- try {
- return a.change().getSortKey().compareTo(b.change().getSortKey());
- } catch (OrmException e) {
- return 0;
- }
- }
- };
-
- private final Comparator<ChangeData> cmpBefore =
- new Comparator<ChangeData>() {
- @Override
- public int compare(ChangeData a, ChangeData b) {
- try {
- return b.change().getSortKey().compareTo(a.change().getSortKey());
- } catch (OrmException e) {
- return 0;
- }
- }
- };
-
public static enum OutputFormat {
TEXT, JSON
}
@@ -102,8 +76,6 @@
private OutputFormat outputFormat = OutputFormat.TEXT;
private int limit;
private int start;
- private String sortkeyAfter;
- private String sortkeyBefore;
private boolean includePatchSets;
private boolean includeCurrentPatchSet;
private boolean includeApprovals;
@@ -146,14 +118,6 @@
start = n;
}
- void setSortkeyAfter(String sortkey) {
- sortkeyAfter = sortkey;
- }
-
- void setSortkeyBefore(String sortkey) {
- sortkeyBefore = sortkey;
- }
-
public void setIncludePatchSets(boolean on) {
includePatchSets = on;
}
@@ -217,7 +181,7 @@
* If a limit was specified using {@link #setLimit(int)} this method may
* return up to {@code limit + 1} results, allowing the caller to determine if
* there are more than {@code limit} matches and suggest to its own caller
- * that the query could be retried with {@link #setSortkeyBefore(String)}.
+ * that the query could be retried with {@link #setStart(int)}.
*/
public List<ChangeData> queryChanges(String queryString)
throws OrmException, QueryParseException {
@@ -230,7 +194,7 @@
* If a limit was specified using {@link #setLimit(int)} this method may
* return up to {@code limit + 1} results, allowing the caller to determine if
* there are more than {@code limit} matches and suggest to its own caller
- * that the query could be retried with {@link #setSortkeyBefore(String)}.
+ * that the query could be retried with {@link #setStart(int)}.
*/
public List<List<ChangeData>> queryChanges(List<String> queries)
throws OrmException, QueryParseException {
@@ -266,11 +230,6 @@
List<List<ChangeData>> out = Lists.newArrayListWithCapacity(cnt);
for (int i = 0; i < cnt; i++) {
List<ChangeData> results = matches.get(i).toList();
- if (sortkeyAfter != null) {
- Collections.sort(results, cmpAfter);
- } else if (sortkeyBefore != null) {
- Collections.sort(results, cmpBefore);
- }
if (results.size() > maxLimit) {
moreResults = true;
}
@@ -278,9 +237,6 @@
if (limit < results.size()) {
results = results.subList(0, limit);
}
- if (sortkeyAfter != null) {
- Collections.reverse(results);
- }
out.add(results);
}
return out;
@@ -417,17 +373,7 @@
private Predicate<ChangeData> parseQuery(String queryString,
final Predicate<ChangeData> visibleToMe) throws QueryParseException {
- Predicate<ChangeData> q = queryBuilder.parse(queryString);
- if (queryBuilder.supportsSortKey() && !ChangeQueryBuilder.hasSortKey(q)) {
- if (sortkeyBefore != null) {
- q = Predicate.and(q, queryBuilder.sortkey_before(sortkeyBefore));
- } else if (sortkeyAfter != null) {
- q = Predicate.and(q, queryBuilder.sortkey_after(sortkeyAfter));
- } else {
- q = Predicate.and(q, queryBuilder.sortkey_before("z"));
- }
- }
- return Predicate.and(q,
+ return Predicate.and(queryBuilder.parse(queryString),
queryBuilder.limit(limit > 0 ? Math.min(limit, maxLimit) + 1 : maxLimit),
visibleToMe);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
index 7d5f1dc..3a9604f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
@@ -15,8 +15,8 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
-import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
import dk.brics.automaton.RegExp;
@@ -25,8 +25,8 @@
class RegexTopicPredicate extends RegexPredicate<ChangeData> {
private final RunAutomaton pattern;
- RegexTopicPredicate(Schema<ChangeData> schema, String re) {
- super(TopicPredicate.topicField(schema), re);
+ RegexTopicPredicate(String re) {
+ super(ChangeField.TOPIC, re);
if (re.startsWith("^")) {
re = re.substring(1);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SortKeyPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SortKeyPredicate.java
deleted file mode 100644
index 6fa11fd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SortKeyPredicate.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2010 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.index.ChangeField.SORTKEY;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.index.ChangeField;
-import com.google.gerrit.server.index.FieldDef;
-import com.google.gerrit.server.index.IndexPredicate;
-import com.google.gerrit.server.index.Schema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-
-public abstract class SortKeyPredicate extends IndexPredicate<ChangeData> {
- public static boolean hasSortKeyField(Schema<ChangeData> schema) {
- return sortkeyFieldOrNull(schema) != null;
- }
-
- @SuppressWarnings("deprecation")
- private static long parseSortKey(Schema<ChangeData> schema, String value) {
- FieldDef<ChangeData, ?> field = schema.getFields().get(SORTKEY.getName());
- if (field == SORTKEY) {
- return ChangeUtil.parseSortKey(value);
- } else {
- return ChangeField.legacyParseSortKey(value);
- }
- }
-
- @SuppressWarnings("deprecation")
- private static FieldDef<ChangeData, ?> sortkeyFieldOrNull(
- Schema<ChangeData> schema) {
- if (schema == null) {
- return ChangeField.LEGACY_SORTKEY;
- }
- FieldDef<ChangeData, ?> f = schema.getFields().get(SORTKEY.getName());
- if (f != null) {
- return f;
- }
- return schema.getFields().get(ChangeField.LEGACY_SORTKEY.getName());
- }
-
- private static FieldDef<ChangeData, ?> sortkeyField(Schema<ChangeData> schema) {
- return checkNotNull(
- sortkeyFieldOrNull(schema),
- "schema missing sortkey field, found: %s", schema);
- }
-
- protected final Schema<ChangeData> schema;
- protected final Provider<ReviewDb> dbProvider;
-
- SortKeyPredicate(Schema<ChangeData> schema, Provider<ReviewDb> dbProvider,
- String name, String value) {
- super(sortkeyField(schema), name, value);
- this.schema = schema;
- this.dbProvider = dbProvider;
- }
-
- @Override
- public int getCost() {
- return 1;
- }
-
- public abstract long getMinValue(Schema<ChangeData> schema);
- public abstract long getMaxValue(Schema<ChangeData> schema);
- public abstract SortKeyPredicate copy(String newValue);
-
- public static class Before extends SortKeyPredicate {
- Before(@Nullable Schema<ChangeData> schema, Provider<ReviewDb> dbProvider,
- String value) {
- super(schema, dbProvider, "sortkey_before", value);
- }
-
- @Override
- public long getMinValue(Schema<ChangeData> schema) {
- return 0;
- }
-
- @Override
- public long getMaxValue(Schema<ChangeData> schema) {
- return parseSortKey(schema, getValue());
- }
-
- @Override
- public boolean match(ChangeData cd) throws OrmException {
- Change change = cd.change();
- return change != null && change.getSortKey().compareTo(getValue()) < 0;
- }
-
- @Override
- public Before copy(String newValue) {
- return new Before(schema, dbProvider, newValue);
- }
- }
-
- public static class After extends SortKeyPredicate {
- After(@Nullable Schema<ChangeData> schema, Provider<ReviewDb> dbProvider,
- String value) {
- super(schema, dbProvider, "sortkey_after", value);
- }
-
- @Override
- public long getMinValue(Schema<ChangeData> schema) {
- return parseSortKey(schema, getValue());
- }
-
- @Override
- public long getMaxValue(Schema<ChangeData> schema) {
- return Long.MAX_VALUE;
- }
-
- @Override
- public boolean match(ChangeData cd) throws OrmException {
- Change change = cd.change();
- return change != null && change.getSortKey().compareTo(getValue()) > 0;
- }
-
- @Override
- public After copy(String newValue) {
- return new After(schema, dbProvider, newValue);
- }
- }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
index 7196c9f..07a6714 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
@@ -18,26 +18,12 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.index.ChangeField;
-import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexPredicate;
-import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
class TopicPredicate extends IndexPredicate<ChangeData> {
- @SuppressWarnings("deprecation")
- static FieldDef<ChangeData, ?> topicField(Schema<ChangeData> schema) {
- if (schema == null) {
- return ChangeField.LEGACY_TOPIC;
- }
- FieldDef<ChangeData, ?> f = schema.getFields().get(TOPIC.getName());
- if (f != null) {
- return f;
- }
- return schema.getFields().get(ChangeField.LEGACY_TOPIC.getName());
- }
-
- TopicPredicate(Schema<ChangeData> schema, String topic) {
- super(topicField(schema), topic);
+ TopicPredicate(String topic) {
+ super(ChangeField.TOPIC, topic);
}
@Override
diff --git a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
index 2e998af..78f5265 100644
--- a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
+++ b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
@@ -41,8 +41,6 @@
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;
@@ -108,7 +106,7 @@
}
queryBuilder = new QueryBuilder(
- schema, new StandardAnalyzer(CharArraySet.EMPTY_SET));
+ new StandardAnalyzer(CharArraySet.EMPTY_SET));
base = Strings.nullToEmpty(base);
openIndex = new CloudSolrServer(url);
@@ -199,23 +197,15 @@
indexes.add(closedIndex);
}
return new QuerySource(indexes, queryBuilder.toQuery(p), start, limit,
- getSorts(schema, p));
+ getSorts());
}
- @SuppressWarnings("deprecation")
- private static List<SortClause> getSorts(Schema<ChangeData> schema,
- Predicate<ChangeData> p) {
- if (SortKeyPredicate.hasSortKeyField(schema)) {
- boolean reverse = ChangeQueryBuilder.hasNonTrivialSortKeyAfter(schema, p);
- return ImmutableList.of(new SortClause(ChangeField.SORTKEY.getName(),
- !reverse ? SolrQuery.ORDER.desc : SolrQuery.ORDER.asc));
- } else {
- return ImmutableList.of(
- new SortClause(
- ChangeField.UPDATED.getName(), SolrQuery.ORDER.desc),
- new SortClause(
- ChangeField.LEGACY_ID.getName(), SolrQuery.ORDER.desc));
- }
+ private static List<SortClause> getSorts() {
+ return ImmutableList.of(
+ new SortClause(
+ ChangeField.UPDATED.getName(), SolrQuery.ORDER.desc),
+ new SortClause(
+ ChangeField.LEGACY_ID.getName(), SolrQuery.ORDER.desc));
}
private void commit(SolrServer server) throws IOException {
@@ -319,17 +309,8 @@
doc.addField(name, value);
}
} 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.addField(name, t);
- }
- } else {
- for (Object value : values.getValues()) {
- doc.addField(name, ((Timestamp) value).getTime());
- }
+ for (Object value : values.getValues()) {
+ doc.addField(name, ((Timestamp) value).getTime());
}
} else if (type == FieldType.EXACT
|| type == FieldType.PREFIX