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:
Shawn O. Pearce
2009-08-12 19:00:42 -07:00
parent 572afee082
commit 54c91ec438
15 changed files with 1386 additions and 1 deletions

View File

@@ -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();
}
}