| // Copyright (C) 2016 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.account; |
| |
| import static com.google.gerrit.server.index.account.AccountField.USERNAME_SPEC; |
| |
| import com.google.common.base.Ascii; |
| import com.google.common.collect.Lists; |
| import com.google.common.primitives.Ints; |
| import com.google.gerrit.entities.Account; |
| import com.google.gerrit.entities.Project; |
| import com.google.gerrit.index.Schema; |
| import com.google.gerrit.index.SchemaFieldDefs.SchemaField; |
| import com.google.gerrit.index.query.IndexPredicate; |
| import com.google.gerrit.index.query.Predicate; |
| import com.google.gerrit.index.query.QueryBuilder; |
| import com.google.gerrit.server.account.AccountState; |
| import com.google.gerrit.server.index.account.AccountField; |
| import com.google.gerrit.server.notedb.ChangeNotes; |
| import java.util.List; |
| |
| /** Utility class to create predicates for account index queries. */ |
| public class AccountPredicates { |
| public static boolean hasActive(Predicate<AccountState> p) { |
| return QueryBuilder.find(p, AccountPredicate.class, AccountField.ACTIVE_FIELD_SPEC.getName()) |
| != null; |
| } |
| |
| public static Predicate<AccountState> andActive(Predicate<AccountState> p) { |
| return Predicate.and(p, isActive()); |
| } |
| |
| public static Predicate<AccountState> defaultPredicate( |
| Schema<AccountState> schema, boolean canSeeSecondaryEmails, String query) { |
| // Adapt the capacity of this list when adding more default predicates. |
| List<Predicate<AccountState>> preds = Lists.newArrayListWithCapacity(3); |
| Integer id = Ints.tryParse(query); |
| if (id != null) { |
| preds.add(id(schema, Account.id(id))); |
| } |
| if (canSeeSecondaryEmails) { |
| preds.add(equalsNameIncludingSecondaryEmails(query)); |
| } else { |
| if (schema.hasField(AccountField.NAME_PART_NO_SECONDARY_EMAIL_SPEC)) { |
| preds.add(equalsName(query)); |
| } else { |
| preds.add(AccountPredicates.fullName(query)); |
| if (schema.hasField(AccountField.PREFERRED_EMAIL_LOWER_CASE_SPEC)) { |
| preds.add(AccountPredicates.preferredEmail(query)); |
| } |
| } |
| } |
| if (schema.hasField(USERNAME_SPEC)) { |
| preds.add(username(query)); |
| } |
| // Adapt the capacity of the "predicates" list when adding more default |
| // predicates. |
| return Predicate.or(preds); |
| } |
| |
| public static Predicate<AccountState> id(Schema<AccountState> schema, Account.Id accountId) { |
| return new AccountPredicate( |
| schema.hasField(AccountField.ID_FIELD_SPEC) |
| ? AccountField.ID_FIELD_SPEC |
| : AccountField.ID_STR_FIELD_SPEC, |
| AccountQueryBuilder.FIELD_ACCOUNT, |
| accountId.toString()); |
| } |
| |
| public static Predicate<AccountState> emailIncludingSecondaryEmails(String email) { |
| return new AccountPredicate( |
| AccountField.EMAIL_SPEC, AccountQueryBuilder.FIELD_EMAIL, Ascii.toLowerCase(email)); |
| } |
| |
| public static Predicate<AccountState> preferredEmail(String email) { |
| return new AccountPredicate( |
| AccountField.PREFERRED_EMAIL_LOWER_CASE_SPEC, |
| AccountQueryBuilder.FIELD_PREFERRED_EMAIL, |
| Ascii.toLowerCase(email)); |
| } |
| |
| public static Predicate<AccountState> preferredEmailExact(String email) { |
| return new AccountPredicate( |
| AccountField.PREFERRED_EMAIL_EXACT_SPEC, |
| AccountQueryBuilder.FIELD_PREFERRED_EMAIL_EXACT, |
| email); |
| } |
| |
| public static Predicate<AccountState> equalsNameIncludingSecondaryEmails(String name) { |
| return new AccountPredicate( |
| AccountField.NAME_PART_SPEC, AccountQueryBuilder.FIELD_NAME, Ascii.toLowerCase(name)); |
| } |
| |
| public static Predicate<AccountState> equalsName(String name) { |
| return new AccountPredicate( |
| AccountField.NAME_PART_NO_SECONDARY_EMAIL_SPEC, |
| AccountQueryBuilder.FIELD_NAME, |
| Ascii.toLowerCase(name)); |
| } |
| |
| public static Predicate<AccountState> externalIdIncludingSecondaryEmails(String externalId) { |
| return new AccountPredicate(AccountField.EXTERNAL_ID_FIELD_SPEC, externalId); |
| } |
| |
| public static Predicate<AccountState> fullName(String fullName) { |
| return new AccountPredicate(AccountField.FULL_NAME_SPEC, fullName); |
| } |
| |
| public static Predicate<AccountState> isActive() { |
| return new AccountPredicate(AccountField.ACTIVE_FIELD_SPEC, "1"); |
| } |
| |
| public static Predicate<AccountState> isNotActive() { |
| return new AccountPredicate(AccountField.ACTIVE_FIELD_SPEC, "0"); |
| } |
| |
| public static Predicate<AccountState> username(String username) { |
| return new AccountPredicate( |
| USERNAME_SPEC, AccountQueryBuilder.FIELD_USERNAME, Ascii.toLowerCase(username)); |
| } |
| |
| public static Predicate<AccountState> watchedProject(Project.NameKey project) { |
| return new AccountPredicate(AccountField.WATCHED_PROJECT_SPEC, project.get()); |
| } |
| |
| public static Predicate<AccountState> cansee( |
| AccountQueryBuilder.Arguments args, ChangeNotes changeNotes) { |
| return new CanSeeChangePredicate(args.permissionBackend, changeNotes); |
| } |
| |
| /** Predicate that is mapped to a field in the account index. */ |
| static class AccountPredicate extends IndexPredicate<AccountState> { |
| AccountPredicate(SchemaField<AccountState, ?> def, String value) { |
| super(def, value); |
| } |
| |
| AccountPredicate(SchemaField<AccountState, ?> def, String name, String value) { |
| super(def, name, value); |
| } |
| } |
| |
| private AccountPredicates() {} |
| } |