summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java54
1 files changed, 37 insertions, 17 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
index 9c16777773..155b0165de 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
@@ -14,16 +14,20 @@
package com.google.gerrit.server.query.change;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.query.Predicate;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.query.Predicate;
-import com.google.gerrit.server.query.QueryParseException;
import com.google.gwtorm.server.OrmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
+import java.util.Objects;
import java.util.TreeMap;
/**
@@ -36,6 +40,9 @@ import java.util.TreeMap;
* <p>Status names are looked up by prefix case-insensitively.
*/
public final class ChangeStatusPredicate extends ChangeIndexPredicate {
+ private static final String INVALID_STATUS = "__invalid__";
+ private static final Predicate<ChangeData> NONE = new ChangeStatusPredicate(null);
+
private static final TreeMap<String, Predicate<ChangeData>> PREDICATES;
private static final Predicate<ChangeData> CLOSED;
private static final Predicate<ChangeData> OPEN;
@@ -46,8 +53,14 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate {
List<Predicate<ChangeData>> closed = new ArrayList<>();
for (Change.Status s : Change.Status.values()) {
- ChangeStatusPredicate p = new ChangeStatusPredicate(s);
- PREDICATES.put(canonicalize(s), p);
+ ChangeStatusPredicate p = forStatus(s);
+ String str = canonicalize(s);
+ checkState(
+ !INVALID_STATUS.equals(str),
+ "invalid status sentinel %s cannot match canonicalized status string %s",
+ INVALID_STATUS,
+ str);
+ PREDICATES.put(str, p);
(s.isOpen() ? open : closed).add(p);
}
@@ -63,7 +76,7 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate {
return status.name().toLowerCase();
}
- public static Predicate<ChangeData> parse(String value) throws QueryParseException {
+ public static Predicate<ChangeData> parse(String value) {
String lower = value.toLowerCase();
NavigableMap<String, Predicate<ChangeData>> head = PREDICATES.tailMap(lower, true);
if (!head.isEmpty()) {
@@ -73,7 +86,7 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate {
return e.getValue();
}
}
- throw new QueryParseException("invalid change status: " + value);
+ return NONE;
}
public static Predicate<ChangeData> open() {
@@ -84,21 +97,31 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate {
return CLOSED;
}
- private final Change.Status status;
+ public static ChangeStatusPredicate forStatus(Change.Status status) {
+ return new ChangeStatusPredicate(checkNotNull(status));
+ }
- ChangeStatusPredicate(Change.Status status) {
- super(ChangeField.STATUS, canonicalize(status));
+ @Nullable private final Change.Status status;
+
+ private ChangeStatusPredicate(@Nullable Change.Status status) {
+ super(ChangeField.STATUS, status != null ? canonicalize(status) : INVALID_STATUS);
this.status = status;
}
+ /**
+ * Get the status for this predicate.
+ *
+ * @return the status, or null if this predicate is intended to never match any changes.
+ */
+ @Nullable
public Change.Status getStatus() {
return status;
}
@Override
- public boolean match(final ChangeData object) throws OrmException {
+ public boolean match(ChangeData object) throws OrmException {
Change change = object.change();
- return change != null && status.equals(change.getStatus());
+ return change != null && Objects.equals(status, change.getStatus());
}
@Override
@@ -108,16 +131,13 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate {
@Override
public int hashCode() {
- return status.hashCode();
+ return Objects.hashCode(status);
}
@Override
public boolean equals(Object other) {
- if (other instanceof ChangeStatusPredicate) {
- final ChangeStatusPredicate p = (ChangeStatusPredicate) other;
- return status.equals(p.status);
- }
- return false;
+ return (other instanceof ChangeStatusPredicate)
+ && Objects.equals(status, ((ChangeStatusPredicate) other).status);
}
@Override