Define a simple query language for Gerrit
This is a draft of a basic query language for Gerrit, using a syntax that is very similar to Apache Lucene, Google web search, or Gmail. The current parser simply delimits expressions like "foo:bar that" into basic boolean tree, using a simple FieldPredicate for any of the operators present in the query. Invalid operators are caught and thrown back at the caller, so that they may be reported. The abstract QueryBuilder class can be used to create a custom query language which relies on the basic language parser for the syntax analysis, and conversion from ANTLR trees to the predicate format we will use elsewhere. The current rules supported by the ChangeListServiceImpl.searchQuery are codified in the new subclass ChangeQueryBuilder, but we really want to support a much richer set of operators in the near future. JUnit tests for most of the predicate logic are also defined. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
// Copyright (C) 2009 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;
|
||||
|
||||
import org.spearce.jgit.lib.AbbreviatedObjectId;
|
||||
import org.spearce.jgit.lib.ObjectId;
|
||||
|
||||
|
||||
/** Predicate for a field of {@link ObjectId}. */
|
||||
public final class ObjectIdPredicate extends OperatorPredicate {
|
||||
private final AbbreviatedObjectId id;
|
||||
|
||||
public ObjectIdPredicate(final String name, final AbbreviatedObjectId id) {
|
||||
super(name, id.name());
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public boolean isComplete() {
|
||||
return id.isComplete();
|
||||
}
|
||||
|
||||
public AbbreviatedObjectId abbreviated() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public ObjectId full() {
|
||||
return id.toObjectId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getOperator().hashCode() * 31 + id.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other instanceof ObjectIdPredicate) {
|
||||
final ObjectIdPredicate p = (ObjectIdPredicate) other;
|
||||
return getOperator().equals(p.getOperator()) && id.equals(p.id);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getOperator() + ":" + id.name();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user