Showing first 200 files as there are too many
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/ActionCondition.java
    skipped 2 lines
    3 3  import java.util.ArrayList;
    4 4  import java.util.List;
    5 5   
     6 +import javax.persistence.criteria.CriteriaBuilder;
     7 +import javax.persistence.criteria.CriteriaQuery;
     8 +import javax.persistence.criteria.From;
     9 +import javax.persistence.criteria.Predicate;
     10 + 
    6 11  import org.antlr.v4.runtime.BailErrorStrategy;
    7 12  import org.antlr.v4.runtime.BaseErrorListener;
    8 13  import org.antlr.v4.runtime.CharStream;
    skipped 182 lines
    191 196   @Override
    192 197   public String toStringWithoutParens() {
    193 198   return criteria.toStringWithoutParens();
     199 + }
     200 + 
     201 + @Override
     202 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     203 + throw new UnsupportedOperationException();
    194 204   }
    195 205  
    196 206  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/AlwaysCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class AlwaysCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 10 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/CancelledCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    skipped 9 lines
    15 20   @Override
    16 21   public String toStringWithoutParens() {
    17 22   return ActionCondition.getRuleName(ActionConditionLexer.Cancelled);
     23 + }
     24 + 
     25 + @Override
     26 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     27 + throw new UnsupportedOperationException();
    18 28   }
    19 29  
    20 30  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/FailedCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    skipped 4 lines
    10 15   @Override
    11 16   public boolean matches(Build build) {
    12 17   return build.getStatus() == Build.Status.FAILED;
     18 + }
     19 + 
     20 + @Override
     21 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     22 + throw new UnsupportedOperationException();
    13 23   }
    14 24  
    15 25   @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/LogCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.regex.Pattern;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.OneDev;
    6 11  import io.onedev.server.model.Build;
    7 12  import io.onedev.server.tasklog.JobLogManager;
    skipped 7 lines
    15 20  
    16 21   public LogCriteria(String value) {
    17 22   this.value = value;
     23 + }
     24 +
     25 + @Override
     26 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     27 + throw new UnsupportedOperationException();
    18 28   }
    19 29  
    20 30   @Override
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/OnBranchCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    skipped 5 lines
    11 16  
    12 17   public OnBranchCriteria(String branch) {
    13 18   this.branch = branch;
     19 + }
     20 +
     21 + @Override
     22 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     23 + throw new UnsupportedOperationException();
    14 24   }
    15 25  
    16 26   @Override
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/ParamCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.List;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.model.Build;
    6 11  import io.onedev.server.util.criteria.Criteria;
    7 12   
    skipped 8 lines
    16 21   public ParamCriteria(String name, String value) {
    17 22   this.name = name;
    18 23   this.value = value;
     24 + }
     25 + 
     26 + @Override
     27 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     28 + throw new UnsupportedOperationException();
    19 29   }
    20 30  
    21 31   @Override
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/ParamIsEmptyCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.List;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.model.Build;
    6 11  import io.onedev.server.util.criteria.Criteria;
    7 12   
    skipped 5 lines
    13 18  
    14 19   public ParamIsEmptyCriteria(String name) {
    15 20   this.name = name;
     21 + }
     22 + 
     23 + @Override
     24 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     25 + throw new UnsupportedOperationException();
    16 26   }
    17 27  
    18 28   @Override
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/PreviousIsCancelledCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class PreviousIsCancelledCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 11 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/PreviousIsFailedCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class PreviousIsFailedCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 11 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/PreviousIsSuccessfulCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class PreviousIsSuccessfulCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 11 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/PreviousIsTimedOutCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class PreviousIsTimedOutCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 11 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/PullRequestIsEmptyCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class PullRequestIsEmptyCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 10 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/SuccessfulCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class SuccessfulCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 10 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/action/condition/TimedOutCriteria.java
    1 1  package io.onedev.server.buildspec.job.action.condition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    skipped 9 lines
    15 20   @Override
    16 21   public String toStringWithoutParens() {
    17 22   return ActionCondition.getRuleName(ActionConditionLexer.TimedOut);
     23 + }
     24 + 
     25 + @Override
     26 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     27 + throw new UnsupportedOperationException();
    18 28   }
    19 29  
    20 30  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/retrycondition/LogCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.regex.Pattern;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.OneDev;
    6 11  import io.onedev.server.model.Build;
    7 12  import io.onedev.server.tasklog.JobLogManager;
    skipped 7 lines
    15 20  
    16 21   public LogCriteria(String value) {
    17 22   this.value = value;
     23 + }
     24 +
     25 + @Override
     26 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     27 + throw new UnsupportedOperationException();
    18 28   }
    19 29  
    20 30   @Override
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/retrycondition/NeverCriteria.java
    1 1  package io.onedev.server.buildspec.job.retrycondition;
    2 2   
     3 +import javax.persistence.criteria.CriteriaBuilder;
     4 +import javax.persistence.criteria.CriteriaQuery;
     5 +import javax.persistence.criteria.From;
     6 +import javax.persistence.criteria.Predicate;
     7 + 
    3 8  import io.onedev.server.model.Build;
    4 9  import io.onedev.server.util.criteria.Criteria;
    5 10   
    6 11  public class NeverCriteria extends Criteria<Build> {
    7 12   
    8 13   private static final long serialVersionUID = 1L;
     14 + 
     15 + @Override
     16 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     17 + throw new UnsupportedOperationException();
     18 + }
    9 19  
    10 20   @Override
    11 21   public boolean matches(Build build) {
    skipped 10 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/retrycondition/ParamCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.List;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.model.Build;
    6 11  import io.onedev.server.util.criteria.Criteria;
    7 12   
    skipped 8 lines
    16 21   public ParamCriteria(String name, String value) {
    17 22   this.name = name;
    18 23   this.value = value;
     24 + }
     25 + 
     26 + @Override
     27 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     28 + throw new UnsupportedOperationException();
    19 29   }
    20 30  
    21 31   @Override
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/retrycondition/ParamIsEmptyCriteria.java
    skipped 1 lines
    2 2   
    3 3  import java.util.List;
    4 4   
     5 +import javax.persistence.criteria.CriteriaBuilder;
     6 +import javax.persistence.criteria.CriteriaQuery;
     7 +import javax.persistence.criteria.From;
     8 +import javax.persistence.criteria.Predicate;
     9 + 
    5 10  import io.onedev.server.model.Build;
    6 11  import io.onedev.server.util.criteria.Criteria;
    7 12   
    skipped 5 lines
    13 18  
    14 19   public ParamIsEmptyCriteria(String name) {
    15 20   this.name = name;
     21 + }
     22 + 
     23 + @Override
     24 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     25 + throw new UnsupportedOperationException();
    16 26   }
    17 27  
    18 28   @Override
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/buildspec/job/retrycondition/RetryCondition.java
    skipped 2 lines
    3 3  import java.util.ArrayList;
    4 4  import java.util.List;
    5 5   
     6 +import javax.persistence.criteria.CriteriaBuilder;
     7 +import javax.persistence.criteria.CriteriaQuery;
     8 +import javax.persistence.criteria.From;
     9 +import javax.persistence.criteria.Predicate;
     10 + 
    6 11  import org.antlr.v4.runtime.BailErrorStrategy;
    7 12  import org.antlr.v4.runtime.BaseErrorListener;
    8 13  import org.antlr.v4.runtime.CharStream;
    skipped 33 lines
    42 47   
    43 48   public static String getValue(String token) {
    44 49   return StringUtils.unescape(FenceAware.unfence(token));
     50 + }
     51 +
     52 + @Override
     53 + public Predicate getPredicate(CriteriaQuery<?> query, From<Build, Build> from, CriteriaBuilder builder) {
     54 + throw new UnsupportedOperationException();
    45 55   }
    46 56  
    47 57   public boolean matches(Build build) {
    skipped 112 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/AgentManager.java
    skipped 9 lines
    10 10  import io.onedev.agent.AgentData;
    11 11  import io.onedev.server.model.Agent;
    12 12  import io.onedev.server.persistence.dao.EntityManager;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.search.entity.EntityQuery;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16 16  public interface AgentManager extends EntityManager<Agent> {
    17 17  
    skipped 13 lines
    31 31  
    32 32   List<Agent> query(EntityQuery<Agent> agentQuery, int firstResult, int maxResults);
    33 33  
    34  - int count(@Nullable EntityCriteria<Agent> agentCriteria);
     34 + int count(@Nullable Criteria<Agent> agentCriteria);
    35 35  
    36 36   void restart(Agent agent);
    37 37  
    skipped 16 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/BuildManager.java
    skipped 13 lines
    14 14  import io.onedev.server.model.Project;
    15 15  import io.onedev.server.model.PullRequest;
    16 16  import io.onedev.server.persistence.dao.EntityManager;
    17  -import io.onedev.server.search.entity.EntityCriteria;
    18 17  import io.onedev.server.search.entity.EntityQuery;
    19 18  import io.onedev.server.util.ProjectScopedNumber;
    20 19  import io.onedev.server.util.StatusInfo;
     20 +import io.onedev.server.util.criteria.Criteria;
    21 21   
    22 22  public interface BuildManager extends EntityManager<Build> {
    23 23   
    skipped 35 lines
    59 59   
    60 60   List<Build> query(@Nullable Project project, EntityQuery<Build> buildQuery, int firstResult, int maxResults);
    61 61   
    62  - int count(@Nullable Project project, EntityCriteria<Build> buildCriteria);
     62 + int count(@Nullable Project project, Criteria<Build> buildCriteria);
    63 63   
    64 64   Collection<Long> queryIds(Project project, EntityQuery<Build> buildQuery, int firstResult, int maxResults);
    65 65   
    skipped 20 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/CodeCommentManager.java
    skipped 12 lines
    13 13  import io.onedev.server.model.Project;
    14 14  import io.onedev.server.model.PullRequest;
    15 15  import io.onedev.server.persistence.dao.EntityManager;
    16  -import io.onedev.server.search.entity.EntityCriteria;
    17 16  import io.onedev.server.search.entity.EntityQuery;
     17 +import io.onedev.server.util.criteria.Criteria;
    18 18   
    19 19  public interface CodeCommentManager extends EntityManager<CodeComment> {
    20 20  
    skipped 6 lines
    27 27   List<CodeComment> query(Project project, @Nullable PullRequest request,
    28 28   EntityQuery<CodeComment> commentQuery, int firstResult, int maxResults);
    29 29  
    30  - int count(Project project, @Nullable PullRequest request,
    31  - EntityCriteria<CodeComment> commentCriteria);
     30 + int count(Project project, @Nullable PullRequest request, Criteria<CodeComment> commentCriteria);
    32 31   
    33 32   void delete(Collection<CodeComment> comments);
    34 33  
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/IssueManager.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Project;
    12 12  import io.onedev.server.persistence.dao.EntityManager;
    13 13  import io.onedev.server.search.entity.EntityQuery;
    14  -import io.onedev.server.search.entity.issue.IssueCriteria;
    15 14  import io.onedev.server.util.MilestoneAndState;
    16 15  import io.onedev.server.util.ProjectScopedNumber;
     16 +import io.onedev.server.util.criteria.Criteria;
    17 17  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    18 18  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    19 19  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    skipped 20 lines
    40 40   List<Issue> query(EntityQuery<Issue> issueQuery, int firstResult, int maxResults,
    41 41   boolean loadFields);
    42 42  
    43  - int count(@Nullable IssueCriteria issueCriteria);
     43 + int count(@Nullable Criteria<Issue> issueCriteria);
    44 44  
    45 45   List<Issue> query(Project project, boolean inTree, EntityQuery<Issue> issueQuery,
    46 46   int firstResult, int maxResults, boolean loadFields);
    47 47  
    48  - int count(Project project, boolean inTree, @Nullable IssueCriteria issueCriteria);
     48 + int count(Project project, boolean inTree, @Nullable Criteria<Issue> issueCriteria);
    49 49  
    50 50   List<Issue> query(@Nullable EntityQuery<Issue> scope, Project project, String term, int count);
    51 51   
    skipped 36 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/LinkSpecManager.java
    skipped 15 lines
    16 16   
    17 17   void updateOrders(List<LinkSpec> links);
    18 18  
     19 + void save(LinkSpec spec, @Nullable String oldName, @Nullable String oldOppositeName);
    19 20  }
    20 21   
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/ProjectManager.java
    skipped 12 lines
    13 13   
    14 14  import io.onedev.server.model.Project;
    15 15  import io.onedev.server.persistence.dao.EntityManager;
    16  -import io.onedev.server.search.entity.EntityCriteria;
    17 16  import io.onedev.server.search.entity.EntityQuery;
     17 +import io.onedev.server.util.criteria.Criteria;
    18 18   
    19 19  public interface ProjectManager extends EntityManager<Project> {
    20 20  
    skipped 40 lines
    61 61  
    62 62   List<Project> query(EntityQuery<Project> query, int firstResult, int maxResults);
    63 63  
    64  - int count(EntityCriteria<Project> criteria);
     64 + int count(Criteria<Project> criteria);
    65 65   
    66 66   Predicate getPathMatchPredicate(CriteriaBuilder builder, Path<Project> jpaPath, String pathPattern);
    67 67  
    skipped 8 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/PullRequestManager.java
    skipped 9 lines
    10 10  import io.onedev.server.model.PullRequest;
    11 11  import io.onedev.server.model.User;
    12 12  import io.onedev.server.persistence.dao.EntityManager;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.search.entity.EntityQuery;
    15 14  import io.onedev.server.util.ProjectAndBranch;
    16 15  import io.onedev.server.util.ProjectScopedNumber;
     16 +import io.onedev.server.util.criteria.Criteria;
    17 17   
    18 18  public interface PullRequestManager extends EntityManager<PullRequest> {
    19 19  
    skipped 47 lines
    67 67   List<PullRequest> query(@Nullable Project targetProject, EntityQuery<PullRequest> requestQuery,
    68 68   int firstResult, int maxResults, boolean loadReviews, boolean loadBuilds);
    69 69  
    70  - int count(@Nullable Project targetProject, EntityCriteria<PullRequest> requestCriteria);
     70 + int count(@Nullable Project targetProject, Criteria<PullRequest> requestCriteria);
    71 71  
    72 72   List<PullRequest> query(Project targetProject, String term, int count);
    73 73   
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/SettingManager.java
    skipped 196 lines
    197 197  
    198 198   Usage onDeleteUser(String userName);
    199 199  
     200 + void onRenameLink(String oldName, String name);
     201 +
     202 + Usage onDeleteLink(String linkName);
     203 +
    200 204  }
    201 205   
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultAgentManager.java
    skipped 53 lines
    54 54  import io.onedev.server.search.entity.EntitySort;
    55 55  import io.onedev.server.search.entity.EntitySort.Direction;
    56 56  import io.onedev.server.search.entity.agent.AgentQuery;
     57 +import io.onedev.server.util.criteria.Criteria;
    57 58  import io.onedev.server.util.validation.AttributeNameValidator;
    58 59   
    59 60  @Singleton
    skipped 216 lines
    276 277   
    277 278   @Sessional
    278 279   @Override
    279  - public int count(io.onedev.server.search.entity.EntityCriteria<Agent> agentCriteria) {
     280 + public int count(Criteria<Agent> agentCriteria) {
    280 281   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    281 282   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    282 283   Root<Agent> root = criteriaQuery.from(Agent.class);
    skipped 78 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultBuildManager.java
    skipped 86 lines
    87 87  import io.onedev.server.storage.StorageManager;
    88 88  import io.onedev.server.util.ProjectScopedNumber;
    89 89  import io.onedev.server.util.StatusInfo;
     90 +import io.onedev.server.util.criteria.Criteria;
    90 91  import io.onedev.server.util.facade.BuildFacade;
    91 92  import io.onedev.server.util.schedule.SchedulableTask;
    92 93  import io.onedev.server.util.schedule.TaskScheduler;
    skipped 433 lines
    526 527   return predicates;
    527 528   }
    528 529  
    529  - private Predicate[] getPredicates(@Nullable Project project,
    530  - @Nullable io.onedev.server.search.entity.EntityCriteria<Build> criteria,
     530 + private Predicate[] getPredicates(@Nullable Project project, @Nullable Criteria<Build> criteria,
    531 531   CriteriaQuery<?> query, From<Build, Build> root, CriteriaBuilder builder) {
    532 532   Collection<Predicate> predicates = getPredicates(project, root, builder);
    533 533   if (criteria != null)
    skipped 63 lines
    597 597  
    598 598   @Sessional
    599 599   @Override
    600  - public int count(@Nullable Project project, io.onedev.server.search.entity.EntityCriteria<Build> buildCriteria) {
     600 + public int count(@Nullable Project project, Criteria<Build> buildCriteria) {
    601 601   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    602 602   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    603 603   Root<Build> root = criteriaQuery.from(Build.class);
    skipped 417 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultCodeCommentManager.java
    skipped 62 lines
    63 63  import io.onedev.server.search.entity.EntitySort.Direction;
    64 64  import io.onedev.server.search.entity.codecomment.CodeCommentQuery;
    65 65  import io.onedev.server.security.SecurityUtils;
     66 +import io.onedev.server.util.criteria.Criteria;
    66 67  import io.onedev.server.util.diff.DiffUtils;
    67 68  import io.onedev.server.util.diff.WhitespaceOption;
    68 69   
    skipped 179 lines
    248 249   
    249 250   }
    250 251   
    251  - private Predicate[] getPredicates(Project project,
    252  - @Nullable io.onedev.server.search.entity.EntityCriteria<CodeComment> criteria,
    253  - @Nullable PullRequest request, CriteriaQuery<?> query, From<CodeComment, CodeComment> root, CriteriaBuilder builder) {
     252 + private Predicate[] getPredicates(Project project, @Nullable Criteria<CodeComment> criteria, @Nullable PullRequest request,
     253 + CriteriaQuery<?> query, From<CodeComment, CodeComment> root, CriteriaBuilder builder) {
    254 254   List<Predicate> predicates = new ArrayList<>();
    255 255   if (request != null)
    256 256   predicates.add(builder.equal(CodeCommentQuery.getPath(root, CodeComment.PROP_COMPARE_CONTEXT + "." + CompareContext.PROP_PULL_REQUEST), request));
    skipped 40 lines
    297 297  
    298 298   @Sessional
    299 299   @Override
    300  - public int count(Project project, PullRequest request,
    301  - io.onedev.server.search.entity.EntityCriteria<CodeComment> commentCriteria) {
     300 + public int count(Project project, PullRequest request, Criteria<CodeComment> commentCriteria) {
    302 301   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    303 302   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    304 303   Root<CodeComment> root = criteriaQuery.from(CodeComment.class);
    skipped 16 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultIssueChangeManager.java
    skipped 84 lines
    85 85  import io.onedev.server.persistence.dao.BaseEntityManager;
    86 86  import io.onedev.server.persistence.dao.Dao;
    87 87  import io.onedev.server.persistence.dao.EntityCriteria;
    88  -import io.onedev.server.search.entity.issue.IssueCriteria;
    89 88  import io.onedev.server.search.entity.issue.IssueQuery;
    90 89  import io.onedev.server.search.entity.issue.IssueQueryLexer;
     90 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
    91 91  import io.onedev.server.search.entity.issue.StateCriteria;
    92 92  import io.onedev.server.search.entity.issue.UpdateDateCriteria;
    93 93  import io.onedev.server.security.SecurityUtils;
    94 94  import io.onedev.server.util.Input;
    95 95  import io.onedev.server.util.ProjectScopedCommit;
     96 +import io.onedev.server.util.criteria.Criteria;
    96 97  import io.onedev.server.util.match.Matcher;
    97 98  import io.onedev.server.util.match.PathMatcher;
    98 99  import io.onedev.server.util.match.StringMatcher;
    skipped 206 lines
    305 306   try {
    306 307   SecurityUtils.bindAsSystem();
    307 308   Issue issue = issueManager.load(issueId);
     309 +
     310 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentIssueCriteria(true);
    308 311   for (TransitionSpec transition: getTransitionSpecs()) {
    309 312   if (transition.getTrigger() instanceof StateTransitionTrigger) {
    310 313   Project project = issue .getProject();
    311 314   StateTransitionTrigger trigger = (StateTransitionTrigger) transition.getTrigger();
    312 315   if (trigger.getStates().contains(issue.getState())) {
    313  - IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), true, false, false, false, false, true);
    314  - List<IssueCriteria> criterias = new ArrayList<>();
     316 + IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), option, true);
     317 + List<Criteria<Issue>> criterias = new ArrayList<>();
    315 318  
    316  - List<IssueCriteria> fromStateCriterias = new ArrayList<>();
     319 + List<Criteria<Issue>> fromStateCriterias = new ArrayList<>();
    317 320   for (String fromState: transition.getFromStates())
    318 321   fromStateCriterias.add(new StateCriteria(fromState));
    319 322  
    320  - criterias.add(IssueCriteria.or(fromStateCriterias));
     323 + criterias.add(Criteria.orCriterias(fromStateCriterias));
    321 324   if (query.getCriteria() != null)
    322 325   criterias.add(query.getCriteria());
    323  - query = new IssueQuery(IssueCriteria.and(criterias), new ArrayList<>());
     326 + query = new IssueQuery(Criteria.andCriterias(criterias), new ArrayList<>());
    324 327   Issue.push(issue);
    325 328   try {
    326 329   for (Issue each: issueManager.query(project, false, query, 0, Integer.MAX_VALUE, true)) {
    skipped 45 lines
    372 375   try {
    373 376   SecurityUtils.bindAsSystem();
    374 377   Build build = buildManager.load(buildId);
     378 + 
     379 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentBuildCriteria(true);
    375 380   for (TransitionSpec transition: getTransitionSpecs()) {
    376 381   if (transition.getTrigger() instanceof BuildSuccessfulTrigger) {
    377 382   Project project = build.getProject();
    skipped 3 lines
    381 386   if ((trigger.getJobNames() == null || PatternSet.parse(trigger.getJobNames()).matches(new StringMatcher(), build.getJobName()))
    382 387   && build.getStatus() == Build.Status.SUCCESSFUL
    383 388   && (branches == null || project.isCommitOnBranches(commitId, branches))) {
    384  - IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), true, false, true, false, false, false);
    385  - List<IssueCriteria> criterias = new ArrayList<>();
     389 + IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), option, true);
     390 + List<Criteria<Issue>> criterias = new ArrayList<>();
    386 391  
    387  - List<IssueCriteria> fromStateCriterias = new ArrayList<>();
     392 + List<Criteria<Issue>> fromStateCriterias = new ArrayList<>();
    388 393   for (String fromState: transition.getFromStates())
    389 394   fromStateCriterias.add(new StateCriteria(fromState));
    390 395  
    391  - criterias.add(IssueCriteria.or(fromStateCriterias));
     396 + criterias.add(Criteria.orCriterias(fromStateCriterias));
    392 397   if (query.getCriteria() != null)
    393 398   criterias.add(query.getCriteria());
    394  - query = new IssueQuery(IssueCriteria.and(criterias), new ArrayList<>());
     399 + query = new IssueQuery(Criteria.andCriterias(criterias), new ArrayList<>());
    395 400   Build.push(build);
    396 401   try {
    397 402   for (Issue issue: issueManager.query(project, false, query, 0, Integer.MAX_VALUE, true)) {
    skipped 44 lines
    442 447   Matcher matcher = new PathMatcher();
    443 448   PullRequest request = pullRequestManager.load(requestId);
    444 449   Project project = request.getTargetProject();
     450 + 
     451 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentPullRequestCriteria(true);
    445 452   for (TransitionSpec transition: getTransitionSpecs()) {
    446 453   if (transition.getTrigger().getClass() == triggerClass) {
    447 454   PullRequestTrigger trigger = (PullRequestTrigger) transition.getTrigger();
    448 455   if (trigger.getBranches() == null || PatternSet.parse(trigger.getBranches()).matches(matcher, request.getTargetBranch())) {
    449  - IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), true, false, false, true, false, false);
    450  - List<IssueCriteria> criterias = new ArrayList<>();
     456 + IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), option, true);
     457 + List<Criteria<Issue>> criterias = new ArrayList<>();
    451 458  
    452  - List<IssueCriteria> fromStateCriterias = new ArrayList<>();
     459 + List<Criteria<Issue>> fromStateCriterias = new ArrayList<>();
    453 460   for (String fromState: transition.getFromStates())
    454 461   fromStateCriterias.add(new StateCriteria(fromState));
    455 462  
    456  - criterias.add(IssueCriteria.or(fromStateCriterias));
     463 + criterias.add(Criteria.orCriterias(fromStateCriterias));
    457 464   if (query.getCriteria() != null)
    458 465   criterias.add(query.getCriteria());
    459  - query = new IssueQuery(IssueCriteria.and(criterias), new ArrayList<>());
     466 + query = new IssueQuery(Criteria.andCriterias(criterias), new ArrayList<>());
    460 467   PullRequest.push(request);
    461 468   try {
    462 469   for (Issue issue: issueManager.query(project, false, query, 0, Integer.MAX_VALUE, true)) {
    skipped 102 lines
    565 572   break;
    566 573   }
    567 574   }
     575 +
     576 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentCommitCriteria(true);
    568 577   for (TransitionSpec transition: getTransitionSpecs()) {
    569 578   if (transition.getTrigger() instanceof BranchUpdateTrigger) {
    570 579   BranchUpdateTrigger trigger = (BranchUpdateTrigger) transition.getTrigger();
    571 580   String branches = trigger.getBranches();
    572 581   Matcher matcher = new PathMatcher();
    573 582   if (branches == null || PatternSet.parse(branches).matches(matcher, branchName)) {
    574  - IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(),
    575  - true, false, false, false, true, false);
    576  - List<IssueCriteria> criterias = new ArrayList<>();
     583 + IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), option, true);
     584 + List<Criteria<Issue>> criterias = new ArrayList<>();
    577 585  
    578  - List<IssueCriteria> fromStateCriterias = new ArrayList<>();
     586 + List<Criteria<Issue>> fromStateCriterias = new ArrayList<>();
    579 587   for (String fromState: transition.getFromStates())
    580 588   fromStateCriterias.add(new StateCriteria(fromState));
    581 589  
    582  - criterias.add(IssueCriteria.or(fromStateCriterias));
     590 + criterias.add(Criteria.orCriterias(fromStateCriterias));
    583 591   if (query.getCriteria() != null)
    584 592   criterias.add(query.getCriteria());
    585  - query = new IssueQuery(IssueCriteria.and(criterias), new ArrayList<>());
     593 + query = new IssueQuery(Criteria.andCriterias(criterias), new ArrayList<>());
    586 594   ProjectScopedCommit.push(new ProjectScopedCommit(project, newCommitId) {
    587 595   
    588 596   private static final long serialVersionUID = 1L;
    skipped 35 lines
    624 632   @Transactional
    625 633   @Override
    626 634   public void execute() {
     635 + IssueQueryParseOption option = new IssueQueryParseOption();
    627 636   for (TransitionSpec transition: getTransitionSpecs()) {
    628 637   if (transition.getTrigger() instanceof NoActivityTrigger) {
    629 638   NoActivityTrigger trigger = (NoActivityTrigger) transition.getTrigger();
    630  - IssueQuery query = IssueQuery.parse(null, trigger.getIssueQuery(),
    631  - false, false, false, false, false, false);
    632  - List<IssueCriteria> criterias = new ArrayList<>();
     639 + IssueQuery query = IssueQuery.parse(null, trigger.getIssueQuery(), option, false);
     640 + List<Criteria<Issue>> criterias = new ArrayList<>();
    633 641  
    634  - List<IssueCriteria> fromStateCriterias = new ArrayList<>();
     642 + List<Criteria<Issue>> fromStateCriterias = new ArrayList<>();
    635 643   for (String fromState: transition.getFromStates())
    636 644   fromStateCriterias.add(new StateCriteria(fromState));
    637 645  
    638  - criterias.add(IssueCriteria.or(fromStateCriterias));
     646 + criterias.add(Criteria.orCriterias(fromStateCriterias));
    639 647   if (query.getCriteria() != null)
    640 648   criterias.add(query.getCriteria());
    641 649  
    skipped 1 lines
    643 651   new DateTime().minusDays(trigger.getDays()).toDate(),
    644 652   IssueQueryLexer.IsUntil));
    645 653  
    646  - query = new IssueQuery(IssueCriteria.and(criterias), new ArrayList<>());
     654 + query = new IssueQuery(Criteria.andCriterias(criterias), new ArrayList<>());
    647 655  
    648 656   for (Issue issue: issueManager.query(query, 0, Integer.MAX_VALUE, true)) {
    649 657   changeState(issue, transition.getToState(), new HashMap<>(),
    skipped 161 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultIssueManager.java
    skipped 79 lines
    80 80  import io.onedev.server.search.entity.EntityQuery;
    81 81  import io.onedev.server.search.entity.EntitySort;
    82 82  import io.onedev.server.search.entity.EntitySort.Direction;
    83  -import io.onedev.server.search.entity.issue.IssueCriteria;
    84 83  import io.onedev.server.search.entity.issue.IssueQuery;
     84 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
     85 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
    85 86  import io.onedev.server.security.SecurityUtils;
    86 87  import io.onedev.server.security.permission.AccessProject;
    87 88  import io.onedev.server.storage.AttachmentStorageManager;
    88 89  import io.onedev.server.util.MilestoneAndState;
    89 90  import io.onedev.server.util.Pair;
    90 91  import io.onedev.server.util.ProjectScopedNumber;
     92 +import io.onedev.server.util.criteria.Criteria;
    91 93  import io.onedev.server.util.facade.IssueFacade;
    92 94  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    93 95  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    skipped 27 lines
    121 123  
    122 124   private final RoleManager roleManager;
    123 125  
     126 + private final LinkSpecManager linkSpecManager;
     127 +
    124 128   private final Map<Long, IssueFacade> cache = new HashMap<>();
    125 129  
    126 130   private final ReadWriteLock cacheLock = new ReentrantReadWriteLock();
    skipped 5 lines
    132 136   ProjectManager projectManager, UserManager userManager,
    133 137   RoleManager roleManager, AttachmentStorageManager attachmentStorageManager,
    134 138   IssueCommentManager issueCommentManager, EntityReferenceManager entityReferenceManager,
    135  - IssueScheduleManager issueScheduleManager) {
     139 + IssueScheduleManager issueScheduleManager, LinkSpecManager linkSpecManager) {
    136 140   super(dao);
    137 141   this.issueFieldManager = issueFieldManager;
    138 142   this.issueQueryPersonalizationManager = issueQueryPersonalizationManager;
    skipped 3 lines
    142 146   this.transactionManager = transactionManager;
    143 147   this.userManager = userManager;
    144 148   this.roleManager = roleManager;
     149 + this.linkSpecManager = linkSpecManager;
    145 150   this.attachmentStorageManager = attachmentStorageManager;
    146 151   this.issueCommentManager = issueCommentManager;
    147 152   this.entityReferenceManager = entityReferenceManager;
    skipped 176 lines
    324 329  
    325 330   @Sessional
    326 331   @Override
    327  - public int count(IssueCriteria issueCriteria) {
     332 + public int count(Criteria<Issue> issueCriteria) {
    328 333   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    329 334   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    330 335   Root<Issue> root = criteriaQuery.from(Issue.class);
    skipped 5 lines
    336 341  
    337 342   @Sessional
    338 343   @Override
    339  - public int count(Project project, boolean inTree, IssueCriteria issueCriteria) {
     344 + public int count(Project project, boolean inTree, Criteria<Issue> issueCriteria) {
    340 345   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    341 346   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    342 347   Root<Issue> root = criteriaQuery.from(Issue.class);
    skipped 4 lines
    347 352   return getSession().createQuery(criteriaQuery).uniqueResult().intValue();
    348 353   }
    349 354  
    350  - private Predicate[] getPredicates(Project project, boolean inTree, @Nullable io.onedev.server.search.entity.EntityCriteria<Issue> issueCriteria,
     355 + private Predicate[] getPredicates(Project project, boolean inTree, @Nullable Criteria<Issue> issueCriteria,
    351 356   CriteriaQuery<?> query, CriteriaBuilder builder, Root<Issue> root) {
    352 357   List<Predicate> predicates = new ArrayList<>();
    353 358   Path<Project> projectPath = root.get(Issue.PROP_PROJECT);
    skipped 7 lines
    361 366   return predicates.toArray(new Predicate[predicates.size()]);
    362 367   }
    363 368  
    364  - private Predicate[] getPredicates(@Nullable io.onedev.server.search.entity.EntityCriteria<Issue> issueCriteria,
     369 + private Predicate[] getPredicates(@Nullable Criteria<Issue> issueCriteria,
    365 370   CriteriaQuery<?> query, CriteriaBuilder builder, Root<Issue> root) {
    366 371   List<Predicate> predicates = new ArrayList<>();
    367 372   if (!SecurityUtils.isAdministrator()) {
    skipped 23 lines
    391 396   }
    392 397  
    393 398   for (Project project: projectManager.query()) {
    394  - undefinedStates.addAll(project.getIssueSetting().getUndefinedStates(project));
    395  - undefinedStates.addAll(project.getBuildSetting().getUndefinedStates(project));
     399 + undefinedStates.addAll(project.getIssueSetting().getUndefinedStates());
     400 + undefinedStates.addAll(project.getBuildSetting().getUndefinedStates());
     401 + }
     402 +
     403 + for (LinkSpec link: linkSpecManager.query()) {
     404 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     405 + undefinedStates.addAll(updater.getUndefinedStates());
    396 406   }
    397 407  
    398 408   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    399  - populateUndefinedStates(undefinedStates, setting.getProject(), setting.getQueries());
     409 + populateUndefinedStates(undefinedStates, setting.getQueries());
    400 410  
    401 411   for (User user: userManager.query())
    402  - populateUndefinedStates(undefinedStates, null, user.getIssueQueryPersonalization().getQueries());
     412 + populateUndefinedStates(undefinedStates, user.getIssueQueryPersonalization().getQueries());
    403 413  
    404 414   return undefinedStates;
    405 415   }
    406 416  
    407  - private void populateUndefinedStates(Collection<String> undefinedStates, @Nullable Project project,
    408  - List<NamedIssueQuery> namedQueries) {
     417 + private void populateUndefinedStates(Collection<String> undefinedStates, List<NamedIssueQuery> namedQueries) {
     418 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    409 419   for (NamedIssueQuery namedQuery: namedQueries) {
    410 420   try {
    411  - undefinedStates.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedStates());
     421 + undefinedStates.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedStates());
    412 422   } catch (Exception e) {
    413 423   }
    414 424   }
    skipped 15 lines
    430 440   }
    431 441  
    432 442   for (Project project: projectManager.query()) {
    433  - undefinedFields.addAll(project.getIssueSetting().getUndefinedFields(project));
    434  - undefinedFields.addAll(project.getBuildSetting().getUndefinedFields(project));
     443 + undefinedFields.addAll(project.getIssueSetting().getUndefinedFields());
     444 + undefinedFields.addAll(project.getBuildSetting().getUndefinedFields());
     445 + }
     446 +
     447 + for (LinkSpec link: linkSpecManager.query()) {
     448 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     449 + undefinedFields.addAll(updater.getUndefinedFields());
    435 450   }
    436 451  
    437 452   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    438  - populateUndefinedFields(undefinedFields, setting.getProject(), setting.getQueries());
     453 + populateUndefinedFields(undefinedFields, setting.getQueries());
    439 454  
    440 455   for (User user: userManager.query())
    441  - populateUndefinedFields(undefinedFields, null, user.getIssueQueryPersonalization().getQueries());
     456 + populateUndefinedFields(undefinedFields, user.getIssueQueryPersonalization().getQueries());
    442 457  
    443 458   return undefinedFields;
    444 459   }
    445 460  
    446  - private void populateUndefinedFields(Collection<String> undefinedFields,
    447  - @Nullable Project project, List<NamedIssueQuery> namedQueries) {
     461 + private void populateUndefinedFields(Collection<String> undefinedFields, List<NamedIssueQuery> namedQueries) {
     462 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    448 463   for (NamedIssueQuery namedQuery: namedQueries) {
    449 464   try {
    450  - undefinedFields.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFields());
     465 + undefinedFields.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedFields());
    451 466   } catch (Exception e) {
    452 467   }
    453 468   }
    skipped 20 lines
    474 489   }
    475 490  
    476 491   for (Project project: projectManager.query()) {
    477  - undefinedFieldValues.addAll(project.getIssueSetting().getUndefinedFieldValues(project));
    478  - undefinedFieldValues.addAll(project.getBuildSetting().getUndefinedFieldValues(project));
     492 + undefinedFieldValues.addAll(project.getIssueSetting().getUndefinedFieldValues());
     493 + undefinedFieldValues.addAll(project.getBuildSetting().getUndefinedFieldValues());
     494 + }
     495 +
     496 + for (LinkSpec link: linkSpecManager.query()) {
     497 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     498 + undefinedFieldValues.addAll(updater.getUndefinedFieldValues());
    479 499   }
    480 500  
    481 501   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    482  - populateUndefinedFieldValues(undefinedFieldValues, setting.getProject(), setting.getQueries());
     502 + populateUndefinedFieldValues(undefinedFieldValues, setting.getQueries());
    483 503  
    484 504   for (User user: userManager.query())
    485  - populateUndefinedFieldValues(undefinedFieldValues, null, user.getIssueQueryPersonalization().getQueries());
     505 + populateUndefinedFieldValues(undefinedFieldValues, user.getIssueQueryPersonalization().getQueries());
    486 506  
    487 507   return undefinedFieldValues;
    488 508   }
    489 509  
    490 510   private void populateUndefinedFieldValues(Collection<UndefinedFieldValue> undefinedFieldValues,
    491  - @Nullable Project project, List<NamedIssueQuery> namedQueries) {
     511 + List<NamedIssueQuery> namedQueries) {
     512 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    492 513   for (NamedIssueQuery namedQuery: namedQueries) {
    493 514   try {
    494  - undefinedFieldValues.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFieldValues());
     515 + undefinedFieldValues.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedFieldValues());
    495 516   } catch (Exception e) {
    496 517   }
    497 518   }
    skipped 38 lines
    536 557   }
    537 558  
    538 559   for (Project project: projectManager.query()) {
    539  - project.getIssueSetting().fixUndefinedStates(project, resolutions);
    540  - project.getBuildSetting().fixUndefinedStates(project, resolutions);
     560 + project.getIssueSetting().fixUndefinedStates(resolutions);
     561 + project.getBuildSetting().fixUndefinedStates(resolutions);
     562 + }
     563 +
     564 + for (LinkSpec link: linkSpecManager.query()) {
     565 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     566 + updater.fixUndefinedStates(resolutions);
    541 567   }
    542 568  
    543 569   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    544  - fixUndefinedStates(setting.getProject(), resolutions, setting.getQueries());
     570 + fixUndefinedStates(resolutions, setting.getQueries());
    545 571  
    546 572   for (User user: userManager.query())
    547  - fixUndefinedStates(null, resolutions, user.getIssueQueryPersonalization().getQueries());
     573 + fixUndefinedStates(resolutions, user.getIssueQueryPersonalization().getQueries());
    548 574   }
    549 575  
    550  - private void fixUndefinedStates(@Nullable Project project, Map<String, UndefinedStateResolution> resolutions,
     576 + private void fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions,
    551 577   List<NamedIssueQuery> namedQueries) {
     578 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    552 579   for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    553 580   NamedIssueQuery namedQuery = it.next();
    554 581   try {
    555  - IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
     582 + IssueQuery parsedQuery = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    556 583   if (parsedQuery.fixUndefinedStates(resolutions))
    557 584   namedQuery.setQuery(parsedQuery.toString());
    558 585   else
    skipped 22 lines
    581 608   }
    582 609  
    583 610   for (Project project: projectManager.query()) {
    584  - project.getIssueSetting().fixUndefinedFields(project, resolutions);
    585  - project.getBuildSetting().fixUndefinedFields(project, resolutions);
     611 + project.getIssueSetting().fixUndefinedFields(resolutions);
     612 + project.getBuildSetting().fixUndefinedFields(resolutions);
     613 + }
     614 +
     615 + for (LinkSpec link: linkSpecManager.query()) {
     616 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     617 + updater.fixUndefinedFields(resolutions);
    586 618   }
    587 619  
    588 620   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    skipped 10 lines
    599 631  
    600 632   private void fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions,
    601 633   @Nullable Project project, List<NamedIssueQuery> namedQueries) {
     634 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    602 635   for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    603 636   NamedIssueQuery namedQuery = it.next();
    604 637   try {
    605  - IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
     638 + IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), option, false);
    606 639   if (parsedQuery.fixUndefinedFields(resolutions))
    607 640   namedQuery.setQuery(parsedQuery.toString());
    608 641   else
    skipped 24 lines
    633 666   }
    634 667  
    635 668   for (Project project: projectManager.query()) {
    636  - project.getIssueSetting().fixUndefinedFieldValues(project, resolutions);
    637  - project.getBuildSetting().fixUndefinedFieldValues(project, resolutions);
     669 + project.getIssueSetting().fixUndefinedFieldValues(resolutions);
     670 + project.getBuildSetting().fixUndefinedFieldValues(resolutions);
     671 + }
     672 +
     673 + for (LinkSpec link: linkSpecManager.query()) {
     674 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     675 + updater.fixUndefinedFieldValues(resolutions);
    638 676   }
    639 677  
    640 678   for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query())
    skipped 10 lines
    651 689  
    652 690   private void fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions,
    653 691   @Nullable Project project, List<NamedIssueQuery> namedQueries) {
     692 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    654 693   for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    655 694   NamedIssueQuery namedQuery = it.next();
    656 695   try {
    657  - IssueQuery query = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
     696 + IssueQuery query = IssueQuery.parse(project, namedQuery.getQuery(), option, false);
    658 697   if (query.fixUndefinedFieldValues(resolutions))
    659 698   namedQuery.setQuery(query.toString());
    660 699   else
    skipped 339 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultLinkSpecManager.java
    skipped 6 lines
    7 7  import javax.inject.Singleton;
    8 8  
    9 9  import io.onedev.server.entitymanager.LinkSpecManager;
     10 +import io.onedev.server.entitymanager.SettingManager;
    10 11  import io.onedev.server.model.LinkSpec;
    11 12  import io.onedev.server.persistence.annotation.Sessional;
    12 13  import io.onedev.server.persistence.annotation.Transactional;
    13 14  import io.onedev.server.persistence.dao.BaseEntityManager;
    14 15  import io.onedev.server.persistence.dao.Dao;
     16 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
     17 +import io.onedev.server.util.usage.Usage;
    15 18  
    16 19  @Singleton
    17 20  public class DefaultLinkSpecManager extends BaseEntityManager<LinkSpec> implements LinkSpecManager {
    18 21  
     22 + private final SettingManager settingManager;
     23 +
    19 24   @Inject
    20  - public DefaultLinkSpecManager(Dao dao) {
     25 + public DefaultLinkSpecManager(Dao dao, SettingManager settingManager) {
    21 26   super(dao);
     27 + this.settingManager = settingManager;
    22 28   }
    23 29  
    24 30   @Sessional
    skipped 23 lines
    48 54   link.setOrder(i+1);
    49 55   save(link);
    50 56   }
     57 + }
     58 +
     59 + @Transactional
     60 + @Override
     61 + public void save(LinkSpec spec, String oldName, String oldOppositeName) {
     62 + if (oldName != null) {
     63 + if (oldOppositeName != null) {
     64 + if (spec.getOpposite() == null) {
     65 + Usage usage = new Usage();
     66 + usage.add(settingManager.onDeleteLink(oldOppositeName));
     67 + for (LinkSpec link: query()) {
     68 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     69 + usage.add(updater.onDeleteLink(oldOppositeName));
     70 + }
     71 + usage.checkInUse("Opposite side of issue link '" + oldName + "'");
     72 + } else if (!oldOppositeName.equals(spec.getOpposite().getName())){
     73 + settingManager.onRenameLink(oldOppositeName, spec.getOpposite().getName());
     74 + for (LinkSpec link: query()) {
     75 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     76 + updater.onRenameLink(oldOppositeName, spec.getOpposite().getName());
     77 + }
     78 + }
     79 + }
     80 + if (!oldName.equals(spec.getName())) {
     81 + settingManager.onRenameLink(oldName, spec.getName());
     82 + for (LinkSpec link: query()) {
     83 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     84 + updater.onRenameLink(oldName, spec.getName());
     85 + }
     86 + }
     87 + }
     88 + super.save(spec);
     89 + }
     90 +
     91 + @Transactional
     92 + public void delete(LinkSpec spec) {
     93 + if (spec.getOpposite() != null) {
     94 + Usage usage = new Usage();
     95 + usage.add(settingManager.onDeleteLink(spec.getOpposite().getName()));
     96 + for (LinkSpec link: query()) {
     97 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     98 + usage.add(updater.onDeleteLink(spec.getOpposite().getName()));
     99 + }
     100 + usage.checkInUse("Opposite side of issue link '" + spec.getName() + "'");
     101 + }
     102 +
     103 + Usage usage = new Usage();
     104 + usage.add(settingManager.onDeleteLink(spec.getName()));
     105 + for (LinkSpec link: query()) {
     106 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     107 + usage.add(updater.onDeleteLink(spec.getName()));
     108 + }
     109 + usage.checkInUse("Issue link '" + spec.getName() + "'");
     110 +
     111 + super.delete(spec);
    51 112   }
    52 113  
    53 114  }
    skipped 1 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultProjectManager.java
    skipped 58 lines
    59 59  import io.onedev.server.buildspec.job.JobManager;
    60 60  import io.onedev.server.entitymanager.BuildManager;
    61 61  import io.onedev.server.entitymanager.IssueManager;
     62 +import io.onedev.server.entitymanager.LinkSpecManager;
    62 63  import io.onedev.server.entitymanager.ProjectManager;
    63 64  import io.onedev.server.entitymanager.RoleManager;
    64 65  import io.onedev.server.entitymanager.SettingManager;
    skipped 10 lines
    75 76  import io.onedev.server.infomanager.CommitInfoManager;
    76 77  import io.onedev.server.model.Build;
    77 78  import io.onedev.server.model.Issue;
     79 +import io.onedev.server.model.LinkSpec;
    78 80  import io.onedev.server.model.Milestone;
    79 81  import io.onedev.server.model.Project;
    80 82  import io.onedev.server.model.PullRequest;
    skipped 11 lines
    92 94  import io.onedev.server.search.entity.EntityQuery;
    93 95  import io.onedev.server.search.entity.EntitySort;
    94 96  import io.onedev.server.search.entity.EntitySort.Direction;
     97 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
    95 98  import io.onedev.server.search.entity.project.ProjectQuery;
    96 99  import io.onedev.server.security.SecurityUtils;
    97 100  import io.onedev.server.security.permission.AccessProject;
    98 101  import io.onedev.server.security.permission.ProjectPermission;
     102 +import io.onedev.server.util.criteria.Criteria;
    99 103  import io.onedev.server.util.facade.ProjectFacade;
    100 104  import io.onedev.server.util.match.WildcardUtils;
    101 105  import io.onedev.server.util.patternset.PatternSet;
    skipped 21 lines
    123 127   private final TransactionManager transactionManager;
    124 128  
    125 129   private final IssueManager issueManager;
     130 +
     131 + private final LinkSpecManager linkSpecManager;
    126 132  
    127 133   private final JobManager jobManager;
    128 134  
    skipped 23 lines
    152 158   SettingManager settingManager, TransactionManager transactionManager,
    153 159   SessionManager sessionManager, ListenerRegistry listenerRegistry,
    154 160   TaskScheduler taskScheduler, UserAuthorizationManager userAuthorizationManager,
    155  - RoleManager roleManager, JobManager jobManager, IssueManager issueManager) {
     161 + RoleManager roleManager, JobManager jobManager, IssueManager issueManager,
     162 + LinkSpecManager linkSpecManager) {
    156 163   super(dao);
    157 164  
    158 165   this.commitInfoManager = commitInfoManager;
    skipped 8 lines
    167 174   this.roleManager = roleManager;
    168 175   this.jobManager = jobManager;
    169 176   this.issueManager = issueManager;
     177 + this.linkSpecManager = linkSpecManager;
    170 178  
    171 179   try (InputStream is = getClass().getClassLoader().getResourceAsStream("git-receive-hook")) {
    172 180   Preconditions.checkNotNull(is);
    skipped 43 lines
    216 224   }
    217 225   issueManager.clearSchedules(project, milestones);
    218 226   settingManager.onMoveProject(oldPath, project.getPath());
     227 +
     228 + for (LinkSpec link: linkSpecManager.query()) {
     229 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     230 + updater.onMoveProject(oldPath, project.getPath());
     231 + }
     232 +
    219 233   scheduleTree(project);
    220 234   }
    221 235   }
    skipped 71 lines
    293 307  
    294 308   Usage usage = new Usage();
    295 309   usage.add(settingManager.onDeleteProject(project.getPath()));
     310 +
     311 + for (LinkSpec link: linkSpecManager.query()) {
     312 + for (IssueQueryUpdater updater: link.getQueryUpdaters())
     313 + usage.add(updater.onDeleteProject(project.getPath()).prefix("issue setting").prefix("administration"));
     314 + }
    296 315  
    297 316   usage.checkInUse("Project '" + project.getPath() + "'");
    298 317   
    skipped 406 lines
    705 724   return query;
    706 725   }
    707 726  
    708  - private Predicate[] getPredicates(@Nullable io.onedev.server.search.entity.EntityCriteria<Project> criteria,
    709  - CriteriaQuery<?> query, From<Project, Project> from, CriteriaBuilder builder) {
     727 + private Predicate[] getPredicates(@Nullable Criteria<Project> criteria, CriteriaQuery<?> query,
     728 + From<Project, Project> from, CriteriaBuilder builder) {
    710 729   List<Predicate> predicates = new ArrayList<>();
    711 730   if (!SecurityUtils.isAdministrator()) {
    712 731   Collection<Long> projectIds = getPermittedProjects(new AccessProject())
    skipped 20 lines
    733 752   
    734 753   @Sessional
    735 754   @Override
    736  - public int count(io.onedev.server.search.entity.EntityCriteria<Project> projectCriteria) {
     755 + public int count(Criteria<Project> projectCriteria) {
    737 756   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    738 757   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    739 758   Root<Project> root = criteriaQuery.from(Project.class);
    skipped 74 lines
    814 833   public Predicate getPathMatchPredicate(CriteriaBuilder builder, Path<Project> jpaPath, String pathPattern) {
    815 834   cacheLock.readLock().lock();
    816 835   try {
    817  - return io.onedev.server.search.entity.EntityCriteria.inManyValues(builder, jpaPath.get(Project.PROP_ID),
     836 + return Criteria.inManyValues(builder, jpaPath.get(Project.PROP_ID),
    818 837   getMatchingIds(pathPattern), cache.keySet());
    819 838   } finally {
    820 839   cacheLock.readLock().unlock();
    skipped 3 lines
    824 843   public Predicate getTreePredicate(CriteriaBuilder builder, Path<Project> jpaPath, Project project) {
    825 844   cacheLock.readLock().lock();
    826 845   try {
    827  - return io.onedev.server.search.entity.EntityCriteria.inManyValues(builder, jpaPath.get(Project.PROP_ID),
     846 + return Criteria.inManyValues(builder, jpaPath.get(Project.PROP_ID),
    828 847   getTreeIds(project.getId()), cache.keySet());
    829 848   } finally {
    830 849   cacheLock.readLock().unlock();
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultPullRequestManager.java
    skipped 129 lines
    130 130  import io.onedev.server.util.concurrent.BatchWorkManager;
    131 131  import io.onedev.server.util.concurrent.BatchWorker;
    132 132  import io.onedev.server.util.concurrent.Prioritized;
     133 +import io.onedev.server.util.criteria.Criteria;
    133 134  import io.onedev.server.util.reviewrequirement.ReviewRequirement;
    134 135   
    135 136  @Singleton
    skipped 756 lines
    892 893   }
    893 894   }
    894 895  
    895  - private Predicate[] getPredicates(@Nullable Project targetProject,
    896  - @Nullable io.onedev.server.search.entity.EntityCriteria<PullRequest> criteria,
     896 + private Predicate[] getPredicates(@Nullable Project targetProject, @Nullable Criteria<PullRequest> criteria,
    897 897   CriteriaQuery<?> query, From<PullRequest, PullRequest> root, CriteriaBuilder builder) {
    898 898   List<Predicate> predicates = new ArrayList<>();
    899 899   if (targetProject != null) {
    skipped 61 lines
    961 961  
    962 962   @Sessional
    963 963   @Override
    964  - public int count(@Nullable Project targetProject,
    965  - io.onedev.server.search.entity.EntityCriteria<PullRequest> requestCriteria) {
     964 + public int count(@Nullable Project targetProject, Criteria<PullRequest> requestCriteria) {
    966 965   CriteriaBuilder builder = getSession().getCriteriaBuilder();
    967 966   CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    968 967   Root<PullRequest> root = criteriaQuery.from(PullRequest.class);
    skipped 105 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/entitymanager/impl/DefaultSettingManager.java
    skipped 731 lines
    732 732   return usage.prefix("administration");
    733 733   }
    734 734  
     735 + @Override
     736 + public void onRenameLink(String oldName, String newName) {
     737 + getIssueSetting().onRenameLink(oldName, newName);
     738 + }
     739 +
     740 + @Override
     741 + public Usage onDeleteLink(String linkName) {
     742 + Usage usage = new Usage();
     743 + usage.add(getIssueSetting().onDeleteLink(linkName));
     744 + return usage.prefix("administration");
     745 + }
     746 +
    735 747  }
    736 748   
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/job/requirement/BranchCriteria.java
    skipped 2 lines
    3 3  import static io.onedev.server.job.requirement.JobRequirement.getRuleName;
    4 4  import static io.onedev.server.job.requirement.JobRequirementLexer.OnBranch;
    5 5   
     6 +import javax.persistence.criteria.CriteriaBuilder;
     7 +import javax.persistence.criteria.CriteriaQuery;
     8 +import javax.persistence.criteria.From;
     9 +import javax.persistence.criteria.Predicate;
     10 + 
    6 11  import io.onedev.server.util.ProjectAndBranch;
    7 12  import io.onedev.server.util.criteria.Criteria;
    8 13  import io.onedev.server.util.match.WildcardUtils;
    skipped 16 lines
    25 30   @Override
    26 31   public String toStringWithoutParens() {
    27 32   return getRuleName(OnBranch) + " " + quote(branch);
     33 + }
     34 + 
     35 + @Override
     36 + public Predicate getPredicate(CriteriaQuery<?> query, From<ProjectAndBranch, ProjectAndBranch> from,
     37 + CriteriaBuilder builder) {
     38 + throw new UnsupportedOperationException();
    28 39   }
    29 40  
    30 41  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/job/requirement/JobRequirement.java
    skipped 2 lines
    3 3  import java.util.ArrayList;
    4 4  import java.util.List;
    5 5   
     6 +import javax.persistence.criteria.CriteriaBuilder;
     7 +import javax.persistence.criteria.CriteriaQuery;
     8 +import javax.persistence.criteria.From;
     9 +import javax.persistence.criteria.Predicate;
     10 + 
    6 11  import org.antlr.v4.runtime.BailErrorStrategy;
    7 12  import org.antlr.v4.runtime.BaseErrorListener;
    8 13  import org.antlr.v4.runtime.CharStream;
    skipped 125 lines
    134 139   @Override
    135 140   public boolean matches(ProjectAndBranch projectAndBranch) {
    136 141   return criteria.matches(projectAndBranch);
     142 + }
     143 + 
     144 + @Override
     145 + public Predicate getPredicate(CriteriaQuery<?> query, From<ProjectAndBranch, ProjectAndBranch> from,
     146 + CriteriaBuilder builder) {
     147 + throw new UnsupportedOperationException();
    137 148   }
    138 149  
    139 150   @Override
    skipped 30 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/job/requirement/ProjectCriteria.java
    skipped 3 lines
    4 4  import static io.onedev.server.job.requirement.JobRequirementLexer.Is;
    5 5  import static io.onedev.server.model.Build.NAME_PROJECT;
    6 6   
     7 +import javax.persistence.criteria.CriteriaBuilder;
     8 +import javax.persistence.criteria.CriteriaQuery;
     9 +import javax.persistence.criteria.From;
     10 +import javax.persistence.criteria.Predicate;
     11 + 
    7 12  import io.onedev.commons.utils.PathUtils;
    8 13  import io.onedev.server.util.ProjectAndBranch;
    9 14  import io.onedev.server.util.criteria.Criteria;
    skipped 27 lines
    37 42   @Override
    38 43   public String toStringWithoutParens() {
    39 44   return quote(NAME_PROJECT) + " " + getRuleName(Is) + " " + quote(projectPath);
     45 + }
     46 + 
     47 + @Override
     48 + public Predicate getPredicate(CriteriaQuery<?> query, From<ProjectAndBranch, ProjectAndBranch> from,
     49 + CriteriaBuilder builder) {
     50 + throw new UnsupportedOperationException();
    40 51   }
    41 52  
    42 53  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/Build.java
    skipped 76 lines
    77 77  import io.onedev.server.model.support.build.actionauthorization.CloseMilestoneAuthorization;
    78 78  import io.onedev.server.model.support.build.actionauthorization.CreateTagAuthorization;
    79 79  import io.onedev.server.model.support.inputspec.SecretInput;
    80  -import io.onedev.server.search.entity.EntityCriteria;
    81 80  import io.onedev.server.storage.StorageManager;
    82 81  import io.onedev.server.util.CollectionUtils;
    83 82  import io.onedev.server.util.ComponentContext;
    skipped 2 lines
    86 85  import io.onedev.server.util.JobSecretAuthorizationContext;
    87 86  import io.onedev.server.util.MatrixRunner;
    88 87  import io.onedev.server.util.ProjectScopedNumber;
     88 +import io.onedev.server.util.criteria.Criteria;
    89 89  import io.onedev.server.util.facade.BuildFacade;
    90 90  import io.onedev.server.util.match.WildcardUtils;
    91 91  import io.onedev.server.util.patternset.PatternSet;
    skipped 697 lines
    789 789   if (!streamPreviousNumbersCache.containsKey(limit)) {
    790 790   BuildManager buildManager = OneDev.getInstance(BuildManager.class);
    791 791   streamPreviousNumbersCache.put(limit, buildManager.queryStreamPreviousNumbers(
    792  - this, null, EntityCriteria.IN_CLAUSE_LIMIT));
     792 + this, null, Criteria.IN_CLAUSE_LIMIT));
    793 793   }
    794 794   return streamPreviousNumbersCache.get(limit);
    795 795   }
    skipped 134 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/LinkSpec.java
    skipped 11 lines
    12 12  import org.hibernate.validator.constraints.NotEmpty;
    13 13   
    14 14  import io.onedev.server.model.support.issue.LinkSpecOpposite;
     15 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
     16 +import io.onedev.server.util.usage.Usage;
    15 17  import io.onedev.server.web.editable.annotation.Editable;
    16  -import io.onedev.server.web.editable.annotation.IssueQuery;
    17 18  import io.onedev.server.web.editable.annotation.NameOfEmptyValue;
    18 19   
    19 20  @Entity
    skipped 42 lines
    62 63   
    63 64   
    64 65   @Editable(order=160, name="Linkable Issues", description="Optionally specify criteria of issues which can be linked")
    65  - @IssueQuery
     66 + @io.onedev.server.web.editable.annotation.IssueQuery
    66 67   @NameOfEmptyValue("All issues")
    67 68   public String getIssueQuery() {
    68 69   return issueQuery;
    skipped 23 lines
    92 93   
    93 94   public void setOrder(int order) {
    94 95   this.order = order;
     96 + }
     97 +
     98 + public Collection<IssueQueryUpdater> getQueryUpdaters() {
     99 + Collection<IssueQueryUpdater> updaters = new ArrayList<>();
     100 + updaters.add(new IssueQueryUpdater() {
     101 +
     102 + @Override
     103 + protected void setIssueQuery(String issueQuery) {
     104 + LinkSpec.this.issueQuery = issueQuery;
     105 + }
     106 +
     107 + @Override
     108 + protected boolean isAllowEmpty() {
     109 + return true;
     110 + }
     111 +
     112 + @Override
     113 + protected String getIssueQuery() {
     114 + return issueQuery;
     115 + }
     116 + 
     117 + @Override
     118 + protected Usage getUsage() {
     119 + return new Usage().add("linkable issues").prefix("link '" + getName() + "'");
     120 + }
     121 +
     122 + });
     123 + if (opposite != null) {
     124 + updaters.add(new IssueQueryUpdater() {
     125 +
     126 + @Override
     127 + protected void setIssueQuery(String issueQuery) {
     128 + opposite.setIssueQuery(issueQuery);
     129 + }
     130 +
     131 + @Override
     132 + protected boolean isAllowEmpty() {
     133 + return true;
     134 + }
     135 +
     136 + @Override
     137 + protected String getIssueQuery() {
     138 + return opposite.getIssueQuery();
     139 + }
     140 + 
     141 + @Override
     142 + protected Usage getUsage() {
     143 + return new Usage().add("linkable issues").prefix("opposite").prefix("link '" + getName() + "'");
     144 + }
     145 +
     146 + });
     147 + }
     148 + return updaters;
    95 149   }
    96 150   
    97 151  }
    skipped 1 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/administration/GlobalIssueSetting.java
    skipped 37 lines
    38 38  import io.onedev.server.model.support.issue.transitiontrigger.PressButtonTrigger;
    39 39  import io.onedev.server.model.support.issue.transitiontrigger.StateTransitionTrigger;
    40 40  import io.onedev.server.search.entity.issue.IssueQuery;
     41 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
    41 42  import io.onedev.server.util.match.Matcher;
    42 43  import io.onedev.server.util.match.PathMatcher;
    43 44  import io.onedev.server.util.patternset.PatternSet;
    skipped 320 lines
    364 365   for (TransitionSpec transition: getTransitionSpecs())
    365 366   undefinedStates.addAll(transition.getUndefinedStates());
    366 367   for (BoardSpec board: getBoardSpecs())
    367  - undefinedStates.addAll(board.getUndefinedStates(null));
     368 + undefinedStates.addAll(board.getUndefinedStates());
    368 369   for (IssueTemplate template: getIssueTemplates())
    369  - undefinedStates.addAll(template.getUndefinedStates());
     370 + undefinedStates.addAll(template.getQueryUpdater().getUndefinedStates());
     371 +
     372 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    370 373   for (NamedIssueQuery namedQuery: getNamedQueries()) {
     374 +
    371 375   try {
    372  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     376 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    373 377   undefinedStates.addAll(query.getUndefinedStates());
    374 378   } catch (Exception e) {
    375 379   }
    skipped 13 lines
    389 393   for (FieldSpec field: getFieldSpecs())
    390 394   undefinedFields.addAll(field.getUndefinedFields());
    391 395   for (BoardSpec board: getBoardSpecs())
    392  - undefinedFields.addAll(board.getUndefinedFields(null));
     396 + undefinedFields.addAll(board.getUndefinedFields());
    393 397   for (IssueTemplate template: getIssueTemplates())
    394  - undefinedFields.addAll(template.getUndefinedFields());
     398 + undefinedFields.addAll(template.getQueryUpdater().getUndefinedFields());
     399 +
     400 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
     401 +
    395 402   for (NamedIssueQuery namedQuery: getNamedQueries()) {
    396 403   try {
    397  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     404 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    398 405   undefinedFields.addAll(query.getUndefinedFields());
    399 406   } catch (Exception e) {
    400 407   }
    skipped 8 lines
    409 416   for (FieldSpec field: getFieldSpecs())
    410 417   undefinedFieldValues.addAll(field.getUndefinedFieldValues());
    411 418   for (BoardSpec board: getBoardSpecs())
    412  - undefinedFieldValues.addAll(board.getUndefinedFieldValues(null));
     419 + undefinedFieldValues.addAll(board.getUndefinedFieldValues());
    413 420   for (IssueTemplate template: getIssueTemplates())
    414  - undefinedFieldValues.addAll(template.getUndefinedFieldValues());
     421 + undefinedFieldValues.addAll(template.getQueryUpdater().getUndefinedFieldValues());
     422 +
     423 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    415 424   for (NamedIssueQuery namedQuery: getNamedQueries()) {
    416 425   try {
    417  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     426 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    418 427   undefinedFieldValues.addAll(query.getUndefinedFieldValues());
    419 428   } catch (Exception e) {
    420 429   }
    skipped 7 lines
    428 437   it.remove();
    429 438   }
    430 439   for (Iterator<BoardSpec> it = getBoardSpecs().iterator(); it.hasNext();) {
    431  - if (!it.next().fixUndefinedStates(null, resolutions))
     440 + if (!it.next().fixUndefinedStates(resolutions))
    432 441   it.remove();
    433 442   }
    434 443   for (Iterator<IssueTemplate> it = getIssueTemplates().iterator(); it.hasNext();) {
    435  - if (!it.next().fixUndefinedStates(resolutions))
     444 + if (!it.next().getQueryUpdater().fixUndefinedStates(resolutions))
    436 445   it.remove();
    437 446   }
     447 +
     448 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    438 449   for (Iterator<NamedIssueQuery> it = getNamedQueries().iterator(); it.hasNext();) {
    439 450   NamedIssueQuery namedQuery = it.next();
    440 451   try {
    441  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     452 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    442 453   if (query.fixUndefinedStates(resolutions))
    443 454   namedQuery.setQuery(query.toString());
    444 455   else
    skipped 16 lines
    461 472   it.remove();
    462 473   }
    463 474   for (Iterator<BoardSpec> it = getBoardSpecs().iterator(); it.hasNext();) {
    464  - if (!it.next().fixUndefinedFields(null, resolutions))
     475 + if (!it.next().fixUndefinedFields(resolutions))
    465 476   it.remove();
    466 477   }
    467 478   for (Iterator<IssueTemplate> it = getIssueTemplates().iterator(); it.hasNext();) {
    468  - if (!it.next().fixUndefinedFields(resolutions))
     479 + if (!it.next().getQueryUpdater().fixUndefinedFields(resolutions))
    469 480   it.remove();
    470 481   }
     482 +
     483 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    471 484   for (Iterator<NamedIssueQuery> it = getNamedQueries().iterator(); it.hasNext();) {
    472 485   NamedIssueQuery namedQuery = it.next();
    473 486   try {
    474  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     487 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    475 488   if (query.fixUndefinedFields(resolutions))
    476 489   namedQuery.setQuery(query.toString());
    477 490   else
    skipped 20 lines
    498 511   it.remove();
    499 512   }
    500 513   for (Iterator<BoardSpec> it = getBoardSpecs().iterator(); it.hasNext();) {
    501  - if (!it.next().fixUndefinedFieldValues(null, resolutions))
     514 + if (!it.next().fixUndefinedFieldValues(resolutions))
    502 515   it.remove();
    503 516   }
    504 517   for (Iterator<IssueTemplate> it = getIssueTemplates().iterator(); it.hasNext();) {
    505  - if (!it.next().fixUndefinedFieldValues(resolutions))
     518 + if (!it.next().getQueryUpdater().fixUndefinedFieldValues(resolutions))
    506 519   it.remove();
    507 520   }
     521 +
     522 + IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true);
    508 523   for (Iterator<NamedIssueQuery> it = getNamedQueries().iterator(); it.hasNext();) {
    509 524   NamedIssueQuery namedQuery = it.next();
    510 525   try {
    511  - IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true);
     526 + IssueQuery query = IssueQuery.parse(null, namedQuery.getQuery(), option, false);
    512 527   if (query.fixUndefinedFieldValues(resolutions))
    513 528   namedQuery.setQuery(query.toString());
    514 529   else
    skipped 12 lines
    527 542   }
    528 543  
    529 544   return derivedDeletions;
    530  - }
    531  -
    532  - public void onMoveProject(String oldPath, String newPath) {
    533  - for (FieldSpec field: getFieldSpecs())
    534  - field.onMoveProject(oldPath, newPath);
    535 545   }
    536 546  
    537 547   public void onRenameUser(String oldName, String newName) {
    skipped 20 lines
    558 568   field.onRenameGroup(oldName, newName);
    559 569   }
    560 570  
    561  - public Usage onDeleteProject(String projectPath) {
     571 + public Usage onDeleteGroup(String groupName) {
    562 572   Usage usage = new Usage();
    563 573  
    564 574   for (FieldSpec field: getFieldSpecs())
    565  - usage.add(field.onDeleteProject(projectPath));
     575 + usage.add(field.onDeleteGroup(groupName));
    566 576  
    567 577   return usage.prefix("issue setting");
    568 578   }
    569 579  
    570  - public Usage onDeleteGroup(String groupName) {
     580 + public void onMoveProject(String oldPath, String newPath) {
     581 + for (FieldSpec field: getFieldSpecs())
     582 + field.onMoveProject(oldPath, newPath);
     583 +
     584 + for (TransitionSpec transition: getTransitionSpecs())
     585 + transition.onMoveProject(oldPath, newPath);
     586 + for (BoardSpec board: getBoardSpecs()) {
     587 + board.getBaseQueryUpdater().onMoveProject(oldPath, newPath);
     588 + board.getBacklogBaseQueryUpdater().onMoveProject(oldPath, newPath);
     589 + }
     590 +
     591 + for (IssueTemplate template: getIssueTemplates())
     592 + template.getQueryUpdater().onMoveProject(oldPath, newPath);
     593 + }
     594 +
     595 + public Usage onDeleteProject(String projectPath) {
    571 596   Usage usage = new Usage();
    572 597  
    573 598   for (FieldSpec field: getFieldSpecs())
    574  - usage.add(field.onDeleteGroup(groupName));
     599 + usage.add(field.onDeleteProject(projectPath));
     600 +
     601 + int index = 1;
     602 + for (TransitionSpec transition: getTransitionSpecs())
     603 + usage.add(transition.onDeleteProject(projectPath).prefix("state transition #" + index++));
     604 +
     605 + index = 1;
     606 + for (BoardSpec board: getBoardSpecs()) {
     607 + usage.add(board.getBaseQueryUpdater().onDeleteProject(projectPath).prefix("default board #" + index++));
     608 + usage.add(board.getBacklogBaseQueryUpdater().onDeleteProject(projectPath).prefix("default board #" + index++));
     609 + }
     610 +
     611 + index = 1;
     612 + for (IssueTemplate template: getIssueTemplates())
     613 + usage.add(template.getQueryUpdater().onDeleteProject(projectPath).prefix("description template #" + index++));
    575 614  
    576 615   return usage.prefix("issue setting");
     616 +
    577 617   }
    578 618  
    579 619   public void onRenameRole(String oldName, String newName) {
    skipped 4 lines
    584 624   public Usage onDeleteRole(String roleName) {
    585 625   Usage usage = new Usage();
    586 626  
     627 + int index = 0;
    587 628   for (TransitionSpec transition: getTransitionSpecs())
    588  - usage.add(transition.onDeleteRole(roleName));
     629 + usage.add(transition.onDeleteRole(roleName).prefix("state transition #" + index++));
     630 +
     631 + return usage.prefix("issue setting");
     632 + }
     633 +
     634 + public void onRenameLink(String oldName, String newName) {
     635 + for (TransitionSpec transition: getTransitionSpecs())
     636 + transition.onRenameLink(oldName, newName);
     637 + for (BoardSpec board: getBoardSpecs()) {
     638 + board.getBaseQueryUpdater().onRenameLink(oldName, newName);
     639 + board.getBacklogBaseQueryUpdater().onRenameLink(oldName, newName);
     640 + }
     641 +
     642 + for (IssueTemplate template: getIssueTemplates())
     643 + template.getQueryUpdater().onRenameLink(oldName, newName);
     644 + }
     645 +
     646 + public Usage onDeleteLink(String linkName) {
     647 + Usage usage = new Usage();
     648 +
     649 + int index = 1;
     650 + for (TransitionSpec transition: getTransitionSpecs())
     651 + usage.add(transition.onDeleteLink(linkName).prefix("state transition #" + index++));
     652 +
     653 + index = 1;
     654 + for (BoardSpec board: getBoardSpecs()) {
     655 + usage.add(board.getBaseQueryUpdater().onDeleteLink(linkName).prefix("default board #" + index++));
     656 + usage.add(board.getBacklogBaseQueryUpdater().onDeleteLink(linkName).prefix("default board #" + index++));
     657 + }
     658 +
     659 + index = 1;
     660 + for (IssueTemplate template: getIssueTemplates())
     661 + usage.add(template.getQueryUpdater().onDeleteLink(linkName).prefix("description template #" + index++));
    589 662  
    590 663   return usage.prefix("issue setting");
    591 664   }
    skipped 59 lines
  • ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/build/BuildPreservation.java
    skipped 15 lines
    16 16   private Integer count;
    17 17   
    18 18   @Editable(order=100, description="Specify the condition preserved builds must match")
    19  - @BuildQuery(withOrder = false, withCurrentUserCriteria = false, withUnfinishedCriteria = false)
     19 + @BuildQuery(withOrder = false)
    20 20   @NameOfEmptyValue("All")
    21 21   public String getCondition() {
    22 22   return condition;
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/build/ProjectBuildSetting.java
    skipped 12 lines
    13 13   
    14 14  import io.onedev.server.OneDev;
    15 15  import io.onedev.server.entitymanager.SettingManager;
    16  -import io.onedev.server.model.Project;
    17 16  import io.onedev.server.model.support.administration.GlobalBuildSetting;
    18 17  import io.onedev.server.model.support.build.actionauthorization.ActionAuthorization;
    19 18  import io.onedev.server.model.support.build.actionauthorization.CloseMilestoneAuthorization;
    20 19  import io.onedev.server.model.support.build.actionauthorization.CreateTagAuthorization;
    21  -import io.onedev.server.search.entity.issue.IssueQuery;
     20 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
     21 +import io.onedev.server.util.usage.Usage;
    22 22  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    23 23  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    24 24  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    skipped 95 lines
    120 120   return null;
    121 121   }
    122 122  
    123  - public Collection<String> getUndefinedStates(Project project) {
     123 + private IssueQueryUpdater getQueryUpdater(DefaultFixedIssueFilter filter, int index) {
     124 + return new IssueQueryUpdater() {
     125 + 
     126 + @Override
     127 + protected Usage getUsage() {
     128 + return new Usage().add("issue query").prefix("default fixed issue filter #" + index);
     129 + }
     130 + 
     131 + @Override
     132 + protected boolean isAllowEmpty() {
     133 + return false;
     134 + }
     135 + 
     136 + @Override
     137 + protected String getIssueQuery() {
     138 + return filter.getIssueQuery();
     139 + }
     140 + 
     141 + @Override
     142 + protected void setIssueQuery(String issueQuery) {
     143 + filter.setIssueQuery(issueQuery);
     144 + }
     145 +
     146 + };
     147 + }
     148 +
     149 + public Collection<String> getUndefinedStates() {
    124 150   Set<String> undefinedStates = new HashSet<>();
    125 151  
    126  - for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters) {
    127  - try {
    128  - undefinedStates.addAll(IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false).getUndefinedStates());
    129  - } catch (Exception e) {
    130  - }
    131  - }
     152 + int index =1;
     153 + for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters)
     154 + undefinedStates.addAll(getQueryUpdater(filter, index++).getUndefinedStates());
    132 155  
    133 156   return undefinedStates;
    134 157   }
    135 158   
    136  - public Collection<String> getUndefinedFields(Project project) {
     159 + public Collection<String> getUndefinedFields() {
    137 160   Set<String> undefinedFields = new HashSet<>();
    138  - for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters) {
    139  - try {
    140  - undefinedFields.addAll(IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false).getUndefinedFields());
    141  - } catch (Exception e) {
    142  - }
    143  - }
     161 + int index = 1;
     162 + for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters)
     163 + undefinedFields.addAll(getQueryUpdater(filter, index++).getUndefinedFields());
    144 164   return undefinedFields;
    145 165   }
    146 166   
    147  - public Collection<UndefinedFieldValue> getUndefinedFieldValues(Project project) {
     167 + public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    148 168   Collection<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    149  - for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters) {
    150  - try {
    151  - undefinedFieldValues.addAll(IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false).getUndefinedFieldValues());
    152  - } catch (Exception e) {
    153  - }
    154  - }
     169 + int index = 1;
     170 + for (DefaultFixedIssueFilter filter: defaultFixedIssueFilters)
     171 + undefinedFieldValues.addAll(getQueryUpdater(filter, index++).getUndefinedFieldValues());
    155 172   return undefinedFieldValues;
    156 173   }
    157 174  
    158  - public void fixUndefinedStates(Project project, Map<String, UndefinedStateResolution> resolutions) {
     175 + public void fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
     176 + int index = 1;
    159 177   for (Iterator<DefaultFixedIssueFilter> it = defaultFixedIssueFilters.iterator(); it.hasNext();) {
    160  - DefaultFixedIssueFilter filter = it.next();
    161  - try {
    162  - IssueQuery parsedQuery = IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false);
    163  - if (parsedQuery.fixUndefinedStates(resolutions))
    164  - filter.setIssueQuery(parsedQuery.toString());
    165  - else
    166  - it.remove();
    167  - } catch (Exception e) {
    168  - }
     178 + if (!getQueryUpdater(it.next(), index++).fixUndefinedStates(resolutions))
     179 + it.remove();
    169 180   }
    170 181   }
    171 182  
    172  - public void fixUndefinedFields(Project project, Map<String, UndefinedFieldResolution> resolutions) {
     183 + public void fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
     184 + int index = 1;
    173 185   for (Iterator<DefaultFixedIssueFilter> it = defaultFixedIssueFilters.iterator(); it.hasNext();) {
    174  - DefaultFixedIssueFilter filter = it.next();
    175  - try {
    176  - IssueQuery parsedQuery = IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false);
    177  - if (parsedQuery.fixUndefinedFields(resolutions))
    178  - filter.setIssueQuery(parsedQuery.toString());
    179  - else
    180  - it.remove();
    181  - } catch (Exception e) {
    182  - }
     186 + if (!getQueryUpdater(it.next(), index++).fixUndefinedFields(resolutions))
     187 + it.remove();
    183 188   }
    184 189   }
    185 190  
    186  - public void fixUndefinedFieldValues(Project project, Map<String, UndefinedFieldValuesResolution> resolutions) {
     191 + public void fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
     192 + int index = 1;
    187 193   for (Iterator<DefaultFixedIssueFilter> it = defaultFixedIssueFilters.iterator(); it.hasNext();) {
    188  - DefaultFixedIssueFilter filter = it.next();
    189  - try {
    190  - IssueQuery parsedQuery = IssueQuery.parse(project, filter.getIssueQuery(), false, false, false, false, false, false);
    191  - if (parsedQuery.fixUndefinedFieldValues(resolutions))
    192  - filter.setIssueQuery(parsedQuery.toString());
    193  - else
    194  - it.remove();
    195  - } catch (Exception e) {
    196  - }
     194 + if (!getQueryUpdater(it.next(), index++).fixUndefinedFieldValues(resolutions))
     195 + it.remove();
    197 196   }
    198 197   }
    199 198  
    skipped 2 lines
  • ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/inputspec/choiceinput/choiceprovider/SpecifiedChoices.java
    skipped 103 lines
    104 104   int index = 1;
    105 105   for (Choice choice: choices) {
    106 106   if (Project.containsPath(choice.getApplicableProjects(), projectPath))
    107  - usage.add("Applicable Projects").prefix("Available Choice #" + index);
     107 + usage.add("applicable projects").prefix("available choice #" + index);
    108 108   index++;
    109 109   }
    110 110   return usage;
    skipped 4 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/BoardSpec.java
    skipped 20 lines
    21 21  import io.onedev.server.OneDev;
    22 22  import io.onedev.server.entitymanager.SettingManager;
    23 23  import io.onedev.server.model.Issue;
    24  -import io.onedev.server.model.Project;
    25 24  import io.onedev.server.model.support.administration.GlobalIssueSetting;
    26 25  import io.onedev.server.model.support.inputspec.choiceinput.choiceprovider.SpecifiedChoices;
    27 26  import io.onedev.server.model.support.issue.field.spec.ChoiceField;
    28 27  import io.onedev.server.model.support.issue.field.spec.FieldSpec;
    29 28  import io.onedev.server.model.support.issue.field.spec.GroupChoiceField;
    30 29  import io.onedev.server.model.support.issue.field.spec.UserChoiceField;
     30 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
    31 31  import io.onedev.server.util.EditContext;
     32 +import io.onedev.server.util.usage.Usage;
    32 33  import io.onedev.server.web.component.issue.workflowreconcile.ReconcileUtils;
    33 34  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    34 35  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    skipped 2 lines
    37 38  import io.onedev.server.web.component.stringchoice.StringChoiceProvider;
    38 39  import io.onedev.server.web.editable.annotation.ChoiceProvider;
    39 40  import io.onedev.server.web.editable.annotation.Editable;
    40  -import io.onedev.server.web.editable.annotation.IssueQuery;
     41 +import io.onedev.server.web.editable.annotation.NameOfEmptyValue;
    41 42  
    42 43  @Editable
    43 44  public class BoardSpec implements Serializable {
    skipped 27 lines
    71 72   }
    72 73  
    73 74   @Editable(order=200, description="Optionally specify a base query to filter/order issues of the board")
    74  - @IssueQuery(withCurrentUserCriteria = true)
     75 + @io.onedev.server.web.editable.annotation.IssueQuery(withCurrentUserCriteria = true)
     76 + @NameOfEmptyValue("Not specified")
    75 77   @Nullable
    76 78   public String getBaseQuery() {
    77 79   return baseQuery;
    skipped 5 lines
    83 85  
    84 86   @Editable(order=250, description="Optionally specify a base query to filter/order issues in backlog. "
    85 87   + "Backlog issues are those not associating with any milestones")
    86  - @IssueQuery(withCurrentUserCriteria = true)
     88 + @io.onedev.server.web.editable.annotation.IssueQuery(withCurrentUserCriteria = true)
     89 + @NameOfEmptyValue("Not specified")
    87 90   @Nullable
    88 91   public String getBacklogBaseQuery() {
    89 92   return backlogBaseQuery;
    skipped 125 lines
    215 218   return -1;
    216 219   }
    217 220  
    218  - public Set<String> getUndefinedStates(@Nullable Project project) {
     221 + public Set<String> getUndefinedStates() {
    219 222   Set<String> undefinedStates = new HashSet<>();
    220  - undefinedStates.addAll(getUndefinedStates(project, getBaseQuery()));
    221  - undefinedStates.addAll(getUndefinedStates(project, getBacklogBaseQuery()));
    222  -
     223 + undefinedStates.addAll(getBaseQueryUpdater().getUndefinedStates());
     224 + undefinedStates.addAll(getBacklogBaseQueryUpdater().getUndefinedStates());
    223 225   if (getIdentifyField().equals(Issue.NAME_STATE)) {
    224 226   for (String column: getColumns()) {
    225 227   if (getIssueSetting().getStateSpec(column) == null)
    skipped 3 lines
    229 231   return undefinedStates;
    230 232   }
    231 233  
    232  - private Set<String> getUndefinedStates(@Nullable Project project, @Nullable String query) {
    233  - Set<String> undefinedStates = new HashSet<>();
    234  - if (query != null) {
    235  - try {
    236  - undefinedStates.addAll(io.onedev.server.search.entity.issue.IssueQuery.parse(
    237  - project, query, false, true, true, true, true, true).getUndefinedStates());
    238  - } catch (Exception e) {
    239  - }
    240  - }
    241  - return undefinedStates;
    242  - }
    243  -
    244  - public Set<String> getUndefinedFields(@Nullable Project project) {
     234 + public Set<String> getUndefinedFields() {
    245 235   Set<String> undefinedFields = new HashSet<>();
    246  - undefinedFields.addAll(getUndefinedFields(project, getBaseQuery()));
    247  - undefinedFields.addAll(getUndefinedFields(project, getBacklogBaseQuery()));
     236 + undefinedFields.addAll(getBaseQueryUpdater().getUndefinedFields());
     237 + undefinedFields.addAll(getBacklogBaseQueryUpdater().getUndefinedFields());
    248 238   if (!Issue.NAME_STATE.equals(getIdentifyField())) {
    249 239   FieldSpec fieldSpec = getIssueSetting().getFieldSpec(getIdentifyField());
    250 240   if (fieldSpec == null)
    skipped 9 lines
    260 250   return undefinedFields;
    261 251   }
    262 252  
    263  - private Set<String> getUndefinedFields(@Nullable Project project, @Nullable String query) {
    264  - Set<String> undefinedFields = new HashSet<>();
    265  - if (query != null) {
    266  - try {
    267  - undefinedFields.addAll(io.onedev.server.search.entity.issue.IssueQuery
    268  - .parse(project, query, false, true, true, true, true, true).getUndefinedFields());
    269  - } catch (Exception e) {
    270  - }
    271  - }
    272  - return undefinedFields;
    273  - }
    274  -
    275  - public Collection<UndefinedFieldValue> getUndefinedFieldValues(@Nullable Project project) {
     253 + public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    276 254   Collection<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
     255 + undefinedFieldValues.addAll(getBaseQueryUpdater().getUndefinedFieldValues());
     256 + undefinedFieldValues.addAll(getBacklogBaseQueryUpdater().getUndefinedFieldValues());
    277 257   if (!identifyField.equals(Issue.NAME_STATE)) {
    278 258   SpecifiedChoices specifiedChoices = SpecifiedChoices.of(getIssueSetting().getFieldSpec(identifyField));
    279 259   if (specifiedChoices != null) {
    skipped 3 lines
    283 263   }
    284 264   }
    285 265   }
    286  - undefinedFieldValues.addAll(getUndefinedFieldValues(project, getBaseQuery()));
    287  - undefinedFieldValues.addAll(getUndefinedFieldValues(project, getBacklogBaseQuery()));
    288 266   return undefinedFieldValues;
    289 267   }
    290 268  
    291  - private Collection<UndefinedFieldValue> getUndefinedFieldValues(@Nullable Project project, @Nullable String query) {
    292  - Collection<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    293  - if (query != null) {
    294  - try {
    295  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    296  - io.onedev.server.search.entity.issue.IssueQuery.parse(project, query, false, true, true, true, true, true);
    297  - undefinedFieldValues.addAll(parsedQuery.getUndefinedFieldValues());
    298  - } catch (Exception e) {
    299  - }
    300  - }
    301  - return undefinedFieldValues;
    302  - }
    303  -
    304  - public boolean fixUndefinedStates(@Nullable Project project, Map<String, UndefinedStateResolution> resolutions) {
    305  - setBaseQuery(fixUndefinedStates(project, resolutions, getBaseQuery()));
    306  - setBacklogBaseQuery(fixUndefinedStates(project, resolutions, getBacklogBaseQuery()));
     269 + public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
     270 + getBaseQueryUpdater().fixUndefinedStates(resolutions);
     271 + getBacklogBaseQueryUpdater().fixUndefinedStates(resolutions);
    307 272   if (getIdentifyField().equals(Issue.NAME_STATE)) {
    308 273   for (Map.Entry<String, UndefinedStateResolution> entry: resolutions.entrySet()) {
    309 274   if (entry.getValue().getFixType() == UndefinedStateResolution.FixType.CHANGE_TO_ANOTHER_STATE)
    skipped 7 lines
    317 282   return true;
    318 283   }
    319 284  
    320  - private String fixUndefinedStates(@Nullable Project project, Map<String, UndefinedStateResolution> resolutions,
    321  - @Nullable String query) {
    322  - if (query != null) {
    323  - try {
    324  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    325  - io.onedev.server.search.entity.issue.IssueQuery.parse(project, query, false, true, true, true, true, true);
    326  - if (parsedQuery.fixUndefinedStates(resolutions))
    327  - query = parsedQuery.toString();
    328  - else
    329  - query = null;
    330  - } catch (Exception e) {
    331  - }
    332  - }
    333  - return query;
    334  - }
    335  -
    336  - public boolean fixUndefinedFields(@Nullable Project project, Map<String, UndefinedFieldResolution> resolutions) {
    337  - setBaseQuery(fixUndefinedFields(project, resolutions, getBaseQuery()));
    338  - setBacklogBaseQuery(fixUndefinedFields(project, resolutions, getBacklogBaseQuery()));
    339  -
     285 + public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
     286 + getBaseQueryUpdater().fixUndefinedFields(resolutions);
     287 + getBacklogBaseQueryUpdater().fixUndefinedFields(resolutions);
    340 288   for (Map.Entry<String, UndefinedFieldResolution> entry: resolutions.entrySet()) {
    341 289   UndefinedFieldResolution resolution = entry.getValue();
    342 290   if (resolution.getFixType() == UndefinedFieldResolution.FixType.CHANGE_TO_ANOTHER_FIELD) {
    skipped 9 lines
    352 300   return true;
    353 301   }
    354 302  
    355  - private String fixUndefinedFields(@Nullable Project project, Map<String, UndefinedFieldResolution> resolutions,
    356  - @Nullable String query) {
    357  - if (query != null) {
    358  - try {
    359  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    360  - io.onedev.server.search.entity.issue.IssueQuery.parse(project, query, false, true, true, true, true, true);
    361  - if (parsedQuery.fixUndefinedFields(resolutions))
    362  - query = parsedQuery.toString();
    363  - else
    364  - query = null;
    365  - } catch (Exception e) {
    366  - }
    367  - }
    368  - return query;
    369  - }
    370  -
    371  - public boolean fixUndefinedFieldValues(@Nullable Project project, Map<String, UndefinedFieldValuesResolution> resolutions) {
    372  - setBaseQuery(fixUndefinedFieldValues(project, resolutions, getBaseQuery()));
    373  - setBacklogBaseQuery(fixUndefinedFieldValues(project, resolutions, getBacklogBaseQuery()));
     303 + public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
     304 + getBaseQueryUpdater().fixUndefinedFieldValues(resolutions);
     305 + getBacklogBaseQueryUpdater().fixUndefinedFieldValues(resolutions);
    374 306   for (Map.Entry<String, UndefinedFieldValuesResolution> resolutionEntry: resolutions.entrySet()) {
    375 307   if (resolutionEntry.getKey().equals(getIdentifyField())) {
    376 308   getColumns().removeAll(resolutionEntry.getValue().getDeletions());
    skipped 4 lines
    381 313   return getColumns().size() >= 2;
    382 314   }
    383 315  
    384  - @Nullable
    385  - private String fixUndefinedFieldValues(@Nullable Project project, Map<String, UndefinedFieldValuesResolution> resolutions,
    386  - @Nullable String query) {
    387  - if (query != null) {
    388  - try {
    389  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    390  - io.onedev.server.search.entity.issue.IssueQuery.parse(project, query, false, true, true, true, true, true);
    391  - if (parsedQuery.fixUndefinedFieldValues(resolutions))
    392  - query = parsedQuery.toString();
    393  - else
    394  - query = null;
    395  - } catch (Exception e) {
    396  - }
    397  - }
    398  - return query;
    399  - }
    400  -
    401 316   public void onRenameUser(GlobalIssueSetting issueSetting, String oldName, String newName) {
    402 317   FieldSpec fieldSpec = issueSetting.getFieldSpec(getIdentifyField());
    403 318   if (fieldSpec instanceof UserChoiceField) {
    skipped 16 lines
    420 335   return true;
    421 336   else
    422 337   return false;
     338 + }
     339 +
     340 + public IssueQueryUpdater getBaseQueryUpdater() {
     341 + return new IssueQueryUpdater() {
     342 +
     343 + @Override
     344 + protected Usage getUsage() {
     345 + return new Usage().add("base query");
     346 + }
     347 +
     348 + @Override
     349 + protected boolean isAllowEmpty() {
     350 + return true;
     351 + }
     352 +
     353 + @Override
     354 + protected String getIssueQuery() {
     355 + return baseQuery;
     356 + }
     357 +
     358 + @Override
     359 + protected void setIssueQuery(String issueQuery) {
     360 + baseQuery = issueQuery;
     361 + }
     362 +
     363 + };
     364 + }
     365 +
     366 + public IssueQueryUpdater getBacklogBaseQueryUpdater() {
     367 + return new IssueQueryUpdater() {
     368 +
     369 + @Override
     370 + protected Usage getUsage() {
     371 + return new Usage().add("backlog base query");
     372 + }
     373 +
     374 + @Override
     375 + protected boolean isAllowEmpty() {
     376 + return true;
     377 + }
     378 +
     379 + @Override
     380 + protected String getIssueQuery() {
     381 + return backlogBaseQuery;
     382 + }
     383 +
     384 + @Override
     385 + protected void setIssueQuery(String issueQuery) {
     386 + backlogBaseQuery = issueQuery;
     387 + }
     388 +
     389 + };
    423 390   }
    424 391  
    425 392  }
    skipped 1 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/IssueTemplate.java
    1 1  package io.onedev.server.model.support.issue;
    2 2   
    3 3  import java.io.Serializable;
    4  -import java.util.Collection;
    5  -import java.util.HashSet;
    6  -import java.util.Map;
    7  -import java.util.Set;
    8 4   
    9 5  import org.hibernate.validator.constraints.NotEmpty;
    10 6   
    11  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    12  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    13  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    14  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
     7 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
     8 +import io.onedev.server.util.usage.Usage;
    15 9  import io.onedev.server.web.editable.annotation.Editable;
    16  -import io.onedev.server.web.editable.annotation.IssueQuery;
    17 10  import io.onedev.server.web.editable.annotation.Markdown;
    18 11  import io.onedev.server.web.editable.annotation.NameOfEmptyValue;
    19 12   
    skipped 8 lines
    28 21  
    29 22   @Editable(order=100, name="Applicable Issues", description="Optionally specify issues applicable for this template. "
    30 23   + "Leave empty for all")
    31  - @IssueQuery(withOrder = false)
     24 + @io.onedev.server.web.editable.annotation.IssueQuery(withOrder = false)
    32 25   @NameOfEmptyValue("All")
    33 26   public String getIssueQuery() {
    34 27   return issueQuery;
    skipped 14 lines
    49 42   this.issueDescription = issueDescription;
    50 43   }
    51 44   
    52  - public Set<String> getUndefinedStates() {
    53  - Set<String> undefinedStates = new HashSet<>();
    54  - if (issueQuery != null) {
    55  - try {
    56  - undefinedStates.addAll(io.onedev.server.search.entity.issue.IssueQuery.parse(
    57  - null, issueQuery, false, true, true, true, true, true).getUndefinedStates());
    58  - } catch (Exception e) {
     45 + public IssueQueryUpdater getQueryUpdater() {
     46 +
     47 + return new IssueQueryUpdater() {
     48 + 
     49 + @Override
     50 + protected Usage getUsage() {
     51 + return new Usage().add("applicable issues");
    59 52   }
    60  - }
    61  - return undefinedStates;
    62  - }
    63 53   
    64  - public Set<String> getUndefinedFields() {
    65  - Set<String> undefinedFields = new HashSet<>();
    66  - if (issueQuery != null) {
    67  - try {
    68  - undefinedFields.addAll(io.onedev.server.search.entity.issue.IssueQuery
    69  - .parse(null, issueQuery, false, true, true, true, true, true).getUndefinedFields());
    70  - } catch (Exception e) {
     54 + @Override
     55 + protected boolean isAllowEmpty() {
     56 + return true;
    71 57   }
    72  - }
    73  - return undefinedFields;
    74  - }
    75 58   
    76  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    77  - Collection<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    78  - if (issueQuery != null) {
    79  - try {
    80  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    81  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    82  - undefinedFieldValues.addAll(parsedQuery.getUndefinedFieldValues());
    83  - } catch (Exception e) {
     59 + @Override
     60 + protected String getIssueQuery() {
     61 + return issueQuery;
    84 62   }
    85  - }
    86  - return undefinedFieldValues;
    87  - }
    88 63   
    89  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    90  - if (issueQuery != null) {
    91  - try {
    92  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    93  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    94  - if (parsedQuery.fixUndefinedStates(resolutions))
    95  - issueQuery = parsedQuery.toString();
    96  - else
    97  - return false;
    98  - } catch (Exception e) {
     64 + @Override
     65 + protected void setIssueQuery(String issueQuery) {
     66 + IssueTemplate.this.issueQuery = issueQuery;
    99 67   }
    100  - }
    101  - return true;
    102  - }
    103 68  
    104  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    105  - if (issueQuery != null) {
    106  - try {
    107  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    108  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    109  - if (parsedQuery.fixUndefinedFields(resolutions))
    110  - issueQuery = parsedQuery.toString();
    111  - else
    112  - return false;
    113  - } catch (Exception e) {
    114  - }
    115  - }
    116  - return true;
    117  - }
     69 + };
    118 70  
    119  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    120  - if (issueQuery != null) {
    121  - try {
    122  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    123  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    124  - if (parsedQuery.fixUndefinedFieldValues(resolutions))
    125  - issueQuery = parsedQuery.toString();
    126  - else
    127  - return false;
    128  - } catch (Exception e) {
    129  - }
    130  - }
    131  - return true;
    132 71   }
    133 72  
    134 73  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/ProjectIssueSetting.java
    skipped 13 lines
    14 14  import io.onedev.server.OneDev;
    15 15  import io.onedev.server.entitymanager.SettingManager;
    16 16  import io.onedev.server.model.Issue;
    17  -import io.onedev.server.model.Project;
    18 17  import io.onedev.server.model.support.administration.GlobalIssueSetting;
    19  -import io.onedev.server.search.entity.issue.IssueQuery;
     18 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
    20 19  import io.onedev.server.util.usage.Usage;
    21 20  import io.onedev.server.web.component.issue.workflowreconcile.ReconcileUtils;
    22 21  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    skipped 82 lines
    105 104   return usage.prefix("issue setting");
    106 105   }
    107 106  
    108  - public Collection<String> getUndefinedStates(Project project) {
    109  - Set<String> undefinedStates = new HashSet<>();
    110  -
     107 + private Collection<IssueQueryUpdater> getNamedQueryUpdaters() {
     108 + Collection<IssueQueryUpdater> updaters = new ArrayList<>();
    111 109   if (namedQueries != null) {
    112 110   for (NamedIssueQuery namedQuery: namedQueries) {
    113  - try {
    114  - undefinedStates.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedStates());
    115  - } catch (Exception e) {
    116  - }
     111 + updaters.add(new IssueQueryUpdater() {
     112 +
     113 + @Override
     114 + protected Usage getUsage() {
     115 + return new Usage().add("saved query '" + namedQuery.getName() + "'");
     116 + }
     117 +
     118 + @Override
     119 + protected boolean isAllowEmpty() {
     120 + return true;
     121 + }
     122 +
     123 + @Override
     124 + protected String getIssueQuery() {
     125 + return namedQuery.getQuery();
     126 + }
     127 +
     128 + @Override
     129 + protected void setIssueQuery(String issueQuery) {
     130 + namedQuery.setQuery(issueQuery);
     131 + }
     132 +
     133 + });
    117 134   }
    118 135   }
     136 + return updaters;
     137 + }
     138 +
     139 + public Collection<String> getUndefinedStates() {
     140 + Set<String> undefinedStates = new HashSet<>();
     141 +
     142 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     143 + undefinedStates.addAll(updater.getUndefinedStates());
    119 144  
    120 145   if (boardSpecs != null) {
    121 146   for (BoardSpec board: boardSpecs)
    122  - undefinedStates.addAll(board.getUndefinedStates(project));
     147 + undefinedStates.addAll(board.getUndefinedStates());
    123 148   }
    124 149  
    125 150   return undefinedStates;
    126 151   }
    127 152  
    128  - public Collection<String> getUndefinedFields(Project project) {
     153 + public Collection<String> getUndefinedFields() {
    129 154   Set<String> undefinedFields = new HashSet<>();
    130 155   if (listFields != null) {
    131 156   for (String fieldName: listFields) {
    skipped 1 lines
    133 158   undefinedFields.add(fieldName);
    134 159   }
    135 160   }
    136  - if (namedQueries != null) {
    137  - for (NamedIssueQuery namedQuery: namedQueries) {
    138  - try {
    139  - undefinedFields.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFields());
    140  - } catch (Exception e) {
    141  - }
    142  - }
    143  - }
     161 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     162 + undefinedFields.addAll(updater.getUndefinedFields());
    144 163   if (boardSpecs != null) {
    145 164   for (BoardSpec board: boardSpecs)
    146  - undefinedFields.addAll(board.getUndefinedFields(project));
     165 + undefinedFields.addAll(board.getUndefinedFields());
    147 166   }
    148 167   return undefinedFields;
    149 168   }
    150 169  
    151  - public Collection<UndefinedFieldValue> getUndefinedFieldValues(Project project) {
     170 + public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    152 171   Collection<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    153  - if (namedQueries != null) {
    154  - for (NamedIssueQuery namedQuery: namedQueries) {
    155  - try {
    156  - undefinedFieldValues.addAll(IssueQuery.parse(null, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFieldValues());
    157  - } catch (Exception e) {
    158  - }
    159  - }
    160  - }
     172 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     173 + undefinedFieldValues.addAll(updater.getUndefinedFieldValues());
    161 174   if (boardSpecs != null) {
    162 175   for (BoardSpec board: boardSpecs)
    163  - undefinedFieldValues.addAll(board.getUndefinedFieldValues(project));
     176 + undefinedFieldValues.addAll(board.getUndefinedFieldValues());
    164 177   }
    165 178   return undefinedFieldValues;
    166 179   }
    167 180  
    168  - public void fixUndefinedStates(Project project, Map<String, UndefinedStateResolution> resolutions) {
    169  - if (namedQueries != null) {
    170  - for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    171  - NamedIssueQuery namedQuery = it.next();
    172  - try {
    173  - IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
    174  - if (parsedQuery.fixUndefinedStates(resolutions))
    175  - namedQuery.setQuery(parsedQuery.toString());
    176  - else
    177  - it.remove();
    178  - } catch (Exception e) {
    179  - }
    180  - }
    181  - }
     181 + public void fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
     182 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     183 + updater.fixUndefinedStates(resolutions);
    182 184  
    183 185   if (boardSpecs != null) {
    184 186   for (BoardSpec board: boardSpecs)
    185  - board.fixUndefinedStates(project, resolutions);
     187 + board.fixUndefinedStates(resolutions);
    186 188   }
    187 189   }
    188 190  
    189  - public void fixUndefinedFields(Project project, Map<String, UndefinedFieldResolution> resolutions) {
     191 + public void fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    190 192   for (Map.Entry<String, UndefinedFieldResolution> entry: resolutions.entrySet()) {
    191 193   if (listFields != null) {
    192 194   if (entry.getValue().getFixType() == UndefinedFieldResolution.FixType.CHANGE_TO_ANOTHER_FIELD)
    skipped 2 lines
    195 197   listFields.remove(entry.getKey());
    196 198   }
    197 199   }
    198  - if (namedQueries != null) {
    199  - for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    200  - NamedIssueQuery namedQuery = it.next();
    201  - try {
    202  - IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
    203  - if (parsedQuery.fixUndefinedFields(resolutions))
    204  - namedQuery.setQuery(parsedQuery.toString());
    205  - else
    206  - it.remove();
    207  - } catch (Exception e) {
    208  - }
    209  - }
    210  - }
     200 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     201 + updater.fixUndefinedFields(resolutions);
    211 202  
    212 203   if (boardSpecs != null) {
    213 204   for (Iterator<BoardSpec> it = boardSpecs.iterator(); it.hasNext();) {
    214  - if (!it.next().fixUndefinedFields(project, resolutions))
     205 + if (!it.next().fixUndefinedFields(resolutions))
    215 206   it.remove();
    216 207   }
    217 208   }
    218 209   }
    219 210  
    220  - public void fixUndefinedFieldValues(Project project, Map<String, UndefinedFieldValuesResolution> resolutions) {
    221  - if (namedQueries != null) {
    222  - for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) {
    223  - NamedIssueQuery namedQuery = it.next();
    224  - try {
    225  - IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true);
    226  - if (parsedQuery.fixUndefinedFieldValues(resolutions))
    227  - namedQuery.setQuery(parsedQuery.toString());
    228  - else
    229  - it.remove();
    230  - } catch (Exception e) {
    231  - }
    232  - }
    233  - }
     211 + public void fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
     212 + for (IssueQueryUpdater updater: getNamedQueryUpdaters())
     213 + updater.fixUndefinedFieldValues(resolutions);
     214 +
    234 215   if (boardSpecs != null) {
    235 216   for (Iterator<BoardSpec> it = boardSpecs.iterator(); it.hasNext();) {
    236  - if (!it.next().fixUndefinedFieldValues(project, resolutions)) {
     217 + if (!it.next().fixUndefinedFieldValues(resolutions)) {
    237 218   it.remove();
    238 219   break;
    239 220   }
    skipped 6 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/TransitionSpec.java
    skipped 21 lines
    22 22  import io.onedev.server.model.support.issue.transitiontrigger.PressButtonTrigger;
    23 23  import io.onedev.server.model.support.issue.transitiontrigger.TransitionTrigger;
    24 24  import io.onedev.server.search.entity.issue.IssueQuery;
     25 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
    25 26  import io.onedev.server.util.usage.Usage;
    26 27  import io.onedev.server.web.component.issue.workflowreconcile.ReconcileUtils;
    27 28  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    skipped 78 lines
    106 107   }
    107 108  
    108 109   public Usage onDeleteRole(String roleName) {
    109  - return trigger.onDeleteRole(roleName).prefix("trigger");
     110 + return getTrigger().onDeleteRole(roleName).prefix("trigger");
     111 + }
     112 +
     113 + public void onRenameLink(String oldName, String newName) {
     114 + getTrigger().getQueryUpdater().onRenameLink(oldName, newName);
     115 + }
     116 +
     117 + public Usage onDeleteLink(String linkName) {
     118 + return getTrigger().getQueryUpdater().onDeleteLink(linkName).prefix("trigger");
     119 + }
     120 +
     121 + public void onMoveProject(String oldPath, String newPath) {
     122 + getTrigger().getQueryUpdater().onMoveProject(oldPath, newPath);
     123 + }
     124 +
     125 + public Usage onDeleteProject(String projectPath) {
     126 + return getTrigger().getQueryUpdater().onDeleteProject(projectPath).prefix("trigger");
    110 127   }
    111 128  
    112 129   @SuppressWarnings("unused")
    skipped 16 lines
    129 146   PressButtonTrigger pressButton = (PressButtonTrigger) getTrigger();
    130 147   if (pressButton.isAuthorized(issue.getProject())) {
    131 148   IssueQuery parsedQuery = IssueQuery.parse(issue.getProject(),
    132  - getTrigger().getIssueQuery(), true, true, true, true, true, true);
     149 + getTrigger().getIssueQuery(), new IssueQueryParseOption().enableAll(true), true);
    133 150   return parsedQuery.matches(issue);
    134 151   }
    135 152   }
    skipped 12 lines
    148 165   if (getIssueSetting().getStateSpec(fromState) == null)
    149 166   undefinedStates.add(fromState);
    150 167   }
    151  - undefinedStates.addAll(trigger.getUndefinedStates());
     168 + undefinedStates.addAll(trigger.getQueryUpdater().getUndefinedStates());
    152 169   return undefinedStates;
    153 170   }
    154 171  
    155 172   public Collection<String> getUndefinedFields() {
    156 173   Collection<String> undefinedFields = new HashSet<>();
    157  - undefinedFields.addAll(getTrigger().getUndefinedFields());
     174 + undefinedFields.addAll(getTrigger().getQueryUpdater().getUndefinedFields());
    158 175   GlobalIssueSetting setting = OneDev.getInstance(SettingManager.class).getIssueSetting();
    159 176   for (String field: getRemoveFields()) {
    160 177   if (setting.getFieldSpec(field) == null)
    skipped 3 lines
    164 181   }
    165 182  
    166 183   public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    167  - return trigger.getUndefinedFieldValues();
     184 + return trigger.getQueryUpdater().getUndefinedFieldValues();
    168 185   }
    169 186  
    170 187   public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    skipped 8 lines
    179 196   return false;
    180 197   }
    181 198   }
    182  - return trigger.fixUndefinedStates(resolutions);
     199 + return trigger.getQueryUpdater().fixUndefinedStates(resolutions);
    183 200   }
    184 201  
    185 202   public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    skipped 3 lines
    189 206   else
    190 207   getRemoveFields().remove(entry.getKey());
    191 208   }
    192  - return trigger.fixUndefinedFields(resolutions);
     209 + return trigger.getQueryUpdater().fixUndefinedFields(resolutions);
    193 210   }
    194 211  
    195 212   public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    196  - return trigger.fixUndefinedFieldValues(resolutions);
     213 + return trigger.getQueryUpdater().fixUndefinedFieldValues(resolutions);
    197 214   }
    198 215  
    199 216  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/field/spec/FieldSpec.java
    skipped 375 lines
    376 376   public Usage onDeleteProject(String projectPath) {
    377 377   Usage usage = new Usage();
    378 378   if (Project.containsPath(getApplicableProjects(), projectPath))
    379  - usage.add("Applicable Projects");
     379 + usage.add("applicable projects");
    380 380   onDeleteProject(usage, projectPath);
    381 381  
    382  - return usage.prefix("Field Spec '" + getName() + "'");
     382 + return usage.prefix("custom field '" + getName() + "'");
    383 383   }
    384 384  
    385 385   protected void onDeleteProject(Usage usage, String projectPath) {
    skipped 4 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/transitiontrigger/PressButtonTrigger.java
    skipped 73 lines
    74 74   return fields;
    75 75   }
    76 76   
    77  - @Override
    78 77   public Collection<String> getUndefinedFields() {
    79  - Collection<String> undefinedFields = super.getUndefinedFields();
     78 + Collection<String> undefinedFields = new ArrayList<>();
    80 79   GlobalIssueSetting setting = OneDev.getInstance(SettingManager.class).getIssueSetting();
    81 80   for (String field: getPromptFields()) {
    82 81   if (setting.getFieldSpec(field) == null)
    skipped 2 lines
    85 84   return undefinedFields;
    86 85   }
    87 86   
    88  - @Override
    89 87   public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    90  - if (!super.fixUndefinedFields(resolutions))
    91  - return false;
    92 88   for (Map.Entry<String, UndefinedFieldResolution> entry: resolutions.entrySet()) {
    93 89   if (entry.getValue().getFixType() == UndefinedFieldResolution.FixType.CHANGE_TO_ANOTHER_FIELD)
    94 90   ReconcileUtils.renameItem(getPromptFields(), entry.getKey(), entry.getValue().getNewField());
    skipped 63 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/model/support/issue/transitiontrigger/TransitionTrigger.java
    1 1  package io.onedev.server.model.support.issue.transitiontrigger;
    2 2   
    3 3  import java.io.Serializable;
    4  -import java.util.Collection;
    5  -import java.util.HashSet;
    6  -import java.util.Map;
    7 4   
     5 +import io.onedev.server.search.entity.issue.IssueQueryUpdater;
    8 6  import io.onedev.server.util.usage.Usage;
    9  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    10  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    11  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    12  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    13 7  import io.onedev.server.web.editable.annotation.Editable;
    14  -import io.onedev.server.web.editable.annotation.IssueQuery;
    15 8  import io.onedev.server.web.editable.annotation.NameOfEmptyValue;
    16 9   
    17 10  @Editable
    skipped 4 lines
    22 15   private String issueQuery;
    23 16  
    24 17   @Editable(order=1000, name="Applicable Issues", description="Optionally specify issues applicable for this transition. Leave empty for all issues. ")
    25  - @IssueQuery(withOrder = false)
     18 + @io.onedev.server.web.editable.annotation.IssueQuery(withOrder = false)
    26 19   @NameOfEmptyValue("All")
    27 20   public String getIssueQuery() {
    28 21   return issueQuery;
    skipped 14 lines
    43 36   return new Usage();
    44 37   }
    45 38  
    46  - public Collection<String> getUndefinedStates() {
    47  - try {
    48  - return io.onedev.server.search.entity.issue.IssueQuery
    49  - .parse(null, issueQuery, false, true, true, true, true, true).getUndefinedStates();
    50  - } catch (Exception e) {
    51  - return new HashSet<>();
    52  - }
    53  - }
     39 + public IssueQueryUpdater getQueryUpdater() {
     40 + return new IssueQueryUpdater() {
    54 41   
    55  - public Collection<String> getUndefinedFields() {
    56  - try {
    57  - return io.onedev.server.search.entity.issue.IssueQuery
    58  - .parse(null, issueQuery, false, true, true, true, true, true).getUndefinedFields();
    59  - } catch (Exception e) {
    60  - e.printStackTrace();
    61  - return new HashSet<>();
    62  - }
    63  - }
     42 + @Override
     43 + protected Usage getUsage() {
     44 + return new Usage().add("applicable issues");
     45 + }
    64 46   
    65  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    66  - try {
    67  - return io.onedev.server.search.entity.issue.IssueQuery
    68  - .parse(null, issueQuery, false, true, true, true, true, true).getUndefinedFieldValues();
    69  - } catch (Exception e) {
    70  - return new HashSet<>();
    71  - }
    72  - }
     47 + @Override
     48 + protected boolean isAllowEmpty() {
     49 + return true;
     50 + }
    73 51   
    74  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    75  - try {
    76  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    77  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    78  - if (parsedQuery.fixUndefinedStates(resolutions))
    79  - issueQuery = parsedQuery.toString();
    80  - else
    81  - return false;
    82  - } catch (Exception e) {
    83  - }
    84  - return true;
    85  - }
     52 + @Override
     53 + protected String getIssueQuery() {
     54 + return issueQuery;
     55 + }
    86 56   
    87  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    88  - try {
    89  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    90  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    91  - if (parsedQuery.fixUndefinedFields(resolutions))
    92  - issueQuery = parsedQuery.toString();
    93  - else
    94  - return false;
    95  - } catch (Exception e) {
    96  - }
    97  - return true;
    98  - }
     57 + @Override
     58 + protected void setIssueQuery(String issueQuery) {
     59 + TransitionTrigger.this.issueQuery = issueQuery;
     60 + }
    99 61  
    100  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    101  - try {
    102  - io.onedev.server.search.entity.issue.IssueQuery parsedQuery =
    103  - io.onedev.server.search.entity.issue.IssueQuery.parse(null, issueQuery, false, true, true, true, true, true);
    104  - if (parsedQuery.fixUndefinedFieldValues(resolutions))
    105  - issueQuery = parsedQuery.toString();
    106  - else
    107  - return false;
    108  - } catch (Exception e) {
    109  - }
    110  - return true;
     62 + };
    111 63   }
    112 64  
    113 65   public abstract String getDescription();
     66 +
    114 67  }
    115 68   
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/notification/IssueNotificationManager.java
    skipped 35 lines
    36 36  import io.onedev.server.search.entity.EntityQuery;
    37 37  import io.onedev.server.search.entity.QueryWatchBuilder;
    38 38  import io.onedev.server.search.entity.issue.IssueQuery;
     39 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
    39 40   
    40 41  @Singleton
    41 42  public class IssueNotificationManager extends AbstractNotificationManager {
    skipped 54 lines
    96 97   
    97 98   @Override
    98 99   protected EntityQuery<Issue> parse(String queryString) {
    99  - return IssueQuery.parse(issue.getProject(), queryString, true, true, false, false, false, false);
     100 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentUserCriteria(true);
     101 + return IssueQuery.parse(issue.getProject(), queryString, option, true);
    100 102   }
    101 103   
    102 104   @Override
    skipped 19 lines
    122 124   
    123 125   @Override
    124 126   protected EntityQuery<Issue> parse(String queryString) {
    125  - return IssueQuery.parse(null, queryString, true, true, false, false, false, false);
     127 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentBuildCriteria(true);
     128 + return IssueQuery.parse(null, queryString, option, true);
    126 129   }
    127 130   
    128 131   @Override
    skipped 115 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/rest/IssueResource.java
    skipped 49 lines
    50 50  import io.onedev.server.rest.jersey.InvalidParamException;
    51 51  import io.onedev.server.rest.support.RestConstants;
    52 52  import io.onedev.server.search.entity.issue.IssueQuery;
     53 +import io.onedev.server.search.entity.issue.IssueQueryParseOption;
    53 54  import io.onedev.server.security.SecurityUtils;
    54 55   
    55 56  @Api(order=2000, description="In most cases, issue resource is operated with issue id, which is different from issue number. "
    skipped 128 lines
    184 185   
    185 186   IssueQuery parsedQuery;
    186 187   try {
    187  - parsedQuery = IssueQuery.parse(null, query, true, true, false, false, false, false);
     188 + IssueQueryParseOption option = new IssueQueryParseOption().withCurrentUserCriteria(true);
     189 + parsedQuery = IssueQuery.parse(null, query, option, true);
    188 190   } catch (Exception e) {
    189 191   throw new InvalidParamException("Error parsing query", e);
    190 192   }
    skipped 277 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/AndEntityCriteria.java
    1  -package io.onedev.server.search.entity;
    2  - 
    3  -import java.util.ArrayList;
    4  -import java.util.List;
    5  - 
    6  -import javax.persistence.criteria.CriteriaBuilder;
    7  -import javax.persistence.criteria.CriteriaQuery;
    8  -import javax.persistence.criteria.From;
    9  -import javax.persistence.criteria.Predicate;
    10  - 
    11  -import io.onedev.server.model.AbstractEntity;
    12  -import io.onedev.server.util.criteria.AndCriteria;
    13  - 
    14  -public class AndEntityCriteria<T extends AbstractEntity> extends EntityCriteria<T> {
    15  -
    16  - private static final long serialVersionUID = 1L;
    17  -
    18  - private final List<? extends EntityCriteria<T>> criterias;
    19  - 
    20  - public AndEntityCriteria(List<? extends EntityCriteria<T>> criterias) {
    21  - this.criterias = criterias;
    22  - }
    23  - 
    24  - @Override
    25  - public void onRenameUser(String oldName, String newName) {
    26  - new AndCriteria<T>(criterias).onRenameUser(oldName, newName);
    27  - }
    28  - 
    29  - @Override
    30  - public void onMoveProject(String oldName, String newName) {
    31  - new AndCriteria<T>(criterias).onMoveProject(oldName, newName);
    32  - }
    33  - 
    34  - @Override
    35  - public void onRenameGroup(String oldName, String newName) {
    36  - new AndCriteria<T>(criterias).onRenameGroup(oldName, newName);
    37  - }
    38  - 
    39  - @Override
    40  - public boolean isUsingUser(String userName) {
    41  - return new AndCriteria<T>(criterias).isUsingUser(userName);
    42  - }
    43  - 
    44  - @Override
    45  - public boolean isUsingProject(String projectName) {
    46  - return new AndCriteria<T>(criterias).isUsingProject(projectName);
    47  - }
    48  - 
    49  - @Override
    50  - public boolean isUsingGroup(String groupName) {
    51  - return new AndCriteria<T>(criterias).isUsingGroup(groupName);
    52  - }
    53  -
    54  - @Override
    55  - public Predicate getPredicate(CriteriaQuery<?> query, From<T, T> root, CriteriaBuilder builder) {
    56  - List<Predicate> predicates = new ArrayList<>();
    57  - for (EntityCriteria<T> criteria: criterias)
    58  - predicates.add(criteria.getPredicate(query, root, builder));
    59  - return builder.and(predicates.toArray(new Predicate[0]));
    60  - }
    61  - 
    62  - @Override
    63  - public String toStringWithoutParens() {
    64  - return new AndCriteria<T>(criterias).toStringWithoutParens();
    65  - }
    66  - 
    67  - @Override
    68  - public boolean matches(T t) {
    69  - return new AndCriteria<T>(criterias).matches(t);
    70  - }
    71  - 
    72  -}
    73  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/EntityCriteria.java
    1  -package io.onedev.server.search.entity;
    2  - 
    3  -import java.util.ArrayList;
    4  -import java.util.Collection;
    5  -import java.util.List;
    6  - 
    7  -import javax.annotation.Nullable;
    8  -import javax.persistence.criteria.CriteriaBuilder;
    9  -import javax.persistence.criteria.CriteriaQuery;
    10  -import javax.persistence.criteria.From;
    11  -import javax.persistence.criteria.Path;
    12  -import javax.persistence.criteria.Predicate;
    13  - 
    14  -import edu.emory.mathcs.backport.java.util.Collections;
    15  -import io.onedev.server.model.AbstractEntity;
    16  -import io.onedev.server.util.RangeBuilder;
    17  -import io.onedev.server.util.criteria.Criteria;
    18  - 
    19  -public abstract class EntityCriteria<T extends AbstractEntity> extends Criteria<T> {
    20  -
    21  - private static final long serialVersionUID = 1L;
    22  -
    23  - public static final int IN_CLAUSE_LIMIT = 1000;
    24  -
    25  - public abstract Predicate getPredicate(CriteriaQuery<?> query, From<T, T> from, CriteriaBuilder builder);
    26  - 
    27  - public static Predicate inManyValues(CriteriaBuilder builder, Path<Long> path, Collection<Long> inValues,
    28  - Collection<Long> allValues) {
    29  - List<Long> listOfInValues = new ArrayList<>(inValues);
    30  - Collections.sort(listOfInValues);
    31  - List<Long> listOfAllValues = new ArrayList<>(allValues);
    32  - Collections.sort(listOfAllValues);
    33  -
    34  - List<Predicate> predicates = new ArrayList<>();
    35  - List<Long> discreteValues = new ArrayList<>();
    36  - for (List<Long> range: new RangeBuilder(listOfInValues, listOfAllValues).getRanges()) {
    37  - if (range.size() <= 2) {
    38  - discreteValues.addAll(range);
    39  - } else {
    40  - predicates.add(builder.and(
    41  - builder.greaterThanOrEqualTo(path, range.get(0)),
    42  - builder.lessThanOrEqualTo(path, range.get(range.size()-1))));
    43  - }
    44  - }
    45  - 
    46  - Collection<Long> inClause = new ArrayList<>();
    47  - for (Long value: discreteValues) {
    48  - inClause.add(value);
    49  - if (inClause.size() == IN_CLAUSE_LIMIT) {
    50  - predicates.add(path.in(inClause));
    51  - inClause = new ArrayList<>();
    52  - }
    53  - }
    54  - if (!inClause.isEmpty())
    55  - predicates.add(path.in(inClause));
    56  -
    57  - return builder.or(predicates.toArray(new Predicate[0]));
    58  - }
    59  -
    60  - @Nullable
    61  - public static <T extends AbstractEntity> EntityCriteria<T> andCriterias(List<EntityCriteria<T>> criterias) {
    62  - if (criterias.size() > 1)
    63  - return new AndEntityCriteria<T>(criterias);
    64  - else if (criterias.size() == 1)
    65  - return criterias.iterator().next();
    66  - else
    67  - return null;
    68  - }
    69  - 
    70  - @Nullable
    71  - public static <T extends AbstractEntity> EntityCriteria<T> orCriterias(List<EntityCriteria<T>> criterias) {
    72  - if (criterias.size() > 1)
    73  - return new OrEntityCriteria<T>(criterias);
    74  - else if (criterias.size() == 1)
    75  - return criterias.iterator().next();
    76  - else
    77  - return null;
    78  - }
    79  -
    80  -}
    81  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/EntityQuery.java
    skipped 33 lines
    34 34  import io.onedev.server.util.ProjectScopedCommit;
    35 35  import io.onedev.server.util.ProjectScopedNumber;
    36 36  import io.onedev.server.util.ProjectScopedRevision;
     37 +import io.onedev.server.util.criteria.Criteria;
    37 38   
    38 39  public abstract class EntityQuery<T extends AbstractEntity> implements Serializable {
    39 40   
    skipped 1 lines
    41 42  
    42 43   private static final Pattern INSIDE_QUOTE = Pattern.compile("\"([^\"\\\\]|\\\\.)*");
    43 44   
    44  - public abstract EntityCriteria<T> getCriteria();
     45 + public abstract Criteria<T> getCriteria();
    45 46   
    46 47   public abstract List<EntitySort> getSorts();
    47 48  
    skipped 165 lines
    213 214   } else {
    214 215   return root.get(pathName);
    215 216   }
     217 + }
     218 +
     219 + public EntityQuery<T> onMoveProject(String oldPath, String newPath) {
     220 + if (getCriteria() != null)
     221 + getCriteria().onMoveProject(oldPath, newPath);
     222 + return this;
     223 + }
     224 +
     225 + public boolean isUsingProject(String projectPath) {
     226 + if (getCriteria() != null)
     227 + return getCriteria().isUsingProject(projectPath);
     228 + else
     229 + return false;
    216 230   }
    217 231  
    218 232   public static boolean isInsideQuote(String value) {
    skipped 5 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/NotEntityCriteria.java
    1  -package io.onedev.server.search.entity;
    2  - 
    3  -import javax.persistence.criteria.CriteriaBuilder;
    4  -import javax.persistence.criteria.CriteriaQuery;
    5  -import javax.persistence.criteria.From;
    6  -import javax.persistence.criteria.Predicate;
    7  - 
    8  -import io.onedev.server.model.AbstractEntity;
    9  -import io.onedev.server.util.criteria.NotCriteria;
    10  - 
    11  -public class NotEntityCriteria<T extends AbstractEntity> extends EntityCriteria<T> {
    12  -
    13  - private static final long serialVersionUID = 1L;
    14  - 
    15  - private final EntityCriteria<T> criteria;
    16  -
    17  - public NotEntityCriteria(EntityCriteria<T> criteria) {
    18  - this.criteria = criteria;
    19  - }
    20  - 
    21  - @Override
    22  - public Predicate getPredicate(CriteriaQuery<?> query, From<T, T> root, CriteriaBuilder builder) {
    23  - return criteria.getPredicate(query, root, builder).not();
    24  - }
    25  - 
    26  - @Override
    27  - public void onRenameUser(String oldName, String newName) {
    28  - new NotCriteria<T>(criteria).onRenameUser(oldName, newName);
    29  - }
    30  - 
    31  - @Override
    32  - public void onMoveProject(String oldName, String newName) {
    33  - new NotCriteria<T>(criteria).onMoveProject(oldName, newName);
    34  - }
    35  - 
    36  - @Override
    37  - public void onRenameGroup(String oldName, String newName) {
    38  - new NotCriteria<T>(criteria).onRenameGroup(oldName, newName);
    39  - }
    40  - 
    41  - @Override
    42  - public boolean isUsingUser(String userName) {
    43  - return new NotCriteria<T>(criteria).isUsingUser(userName);
    44  - }
    45  - 
    46  - @Override
    47  - public boolean isUsingProject(String projectName) {
    48  - return new NotCriteria<T>(criteria).isUsingProject(projectName);
    49  - }
    50  - 
    51  - @Override
    52  - public boolean isUsingGroup(String groupName) {
    53  - return new NotCriteria<T>(criteria).isUsingGroup(groupName);
    54  - }
    55  -
    56  - @Override
    57  - public boolean matches(T t) {
    58  - return new NotCriteria<T>(criteria).matches(t);
    59  - }
    60  - 
    61  - @Override
    62  - public String toStringWithoutParens() {
    63  - return new NotCriteria<T>(criteria).toStringWithoutParens();
    64  - }
    65  -
    66  -}
    67  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/OrEntityCriteria.java
    1  -package io.onedev.server.search.entity;
    2  - 
    3  -import java.util.ArrayList;
    4  -import java.util.List;
    5  - 
    6  -import javax.persistence.criteria.CriteriaBuilder;
    7  -import javax.persistence.criteria.CriteriaQuery;
    8  -import javax.persistence.criteria.From;
    9  -import javax.persistence.criteria.Predicate;
    10  - 
    11  -import io.onedev.server.model.AbstractEntity;
    12  -import io.onedev.server.util.criteria.OrCriteria;
    13  - 
    14  -public class OrEntityCriteria<T extends AbstractEntity> extends EntityCriteria<T> {
    15  -
    16  - private static final long serialVersionUID = 1L;
    17  - 
    18  - private final List<? extends EntityCriteria<T>> criterias;
    19  -
    20  - public OrEntityCriteria(List<? extends EntityCriteria<T>> criterias) {
    21  - this.criterias = criterias;
    22  - }
    23  - 
    24  - @Override
    25  - public Predicate getPredicate(CriteriaQuery<?> query, From<T, T> root, CriteriaBuilder builder) {
    26  - List<Predicate> predicates = new ArrayList<>();
    27  - for (EntityCriteria<T> criteria: criterias)
    28  - predicates.add(criteria.getPredicate(query, root, builder));
    29  - return builder.or(predicates.toArray(new Predicate[0]));
    30  - }
    31  - 
    32  - @Override
    33  - public void onRenameUser(String oldName, String newName) {
    34  - new OrCriteria<T>(criterias).onRenameUser(oldName, newName);
    35  - }
    36  - 
    37  - @Override
    38  - public void onMoveProject(String oldName, String newName) {
    39  - new OrCriteria<T>(criterias).onMoveProject(oldName, newName);
    40  - }
    41  - 
    42  - @Override
    43  - public void onRenameGroup(String oldName, String newName) {
    44  - new OrCriteria<T>(criterias).onRenameGroup(oldName, newName);
    45  - }
    46  - 
    47  - @Override
    48  - public boolean isUsingUser(String userName) {
    49  - return new OrCriteria<T>(criterias).isUsingUser(userName);
    50  - }
    51  - 
    52  - @Override
    53  - public boolean isUsingProject(String projectName) {
    54  - return new OrCriteria<T>(criterias).isUsingProject(projectName);
    55  - }
    56  - 
    57  - @Override
    58  - public boolean isUsingGroup(String groupName) {
    59  - return new OrCriteria<T>(criterias).isUsingGroup(groupName);
    60  - }
    61  -
    62  - @Override
    63  - public boolean matches(T t) {
    64  - return new OrCriteria<T>(criterias).matches(t);
    65  - }
    66  - 
    67  - @Override
    68  - public String toStringWithoutParens() {
    69  - return new OrCriteria<T>(criterias).toStringWithoutParens();
    70  - }
    71  -
    72  -}
    73  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/AgentQuery.java
    skipped 29 lines
    30 30  import io.onedev.server.OneDev;
    31 31  import io.onedev.server.entitymanager.AgentAttributeManager;
    32 32  import io.onedev.server.model.Agent;
    33  -import io.onedev.server.search.entity.AndEntityCriteria;
    34  -import io.onedev.server.search.entity.EntityCriteria;
    35 33  import io.onedev.server.search.entity.EntityQuery;
    36 34  import io.onedev.server.search.entity.EntitySort;
    37 35  import io.onedev.server.search.entity.EntitySort.Direction;
    38  -import io.onedev.server.search.entity.NotEntityCriteria;
    39  -import io.onedev.server.search.entity.OrEntityCriteria;
    40 36  import io.onedev.server.search.entity.agent.AgentQueryParser.AndCriteriaContext;
    41 37  import io.onedev.server.search.entity.agent.AgentQueryParser.CriteriaContext;
    42 38  import io.onedev.server.search.entity.agent.AgentQueryParser.FieldOperatorValueCriteriaContext;
    skipped 4 lines
    47 43  import io.onedev.server.search.entity.agent.AgentQueryParser.OrderContext;
    48 44  import io.onedev.server.search.entity.agent.AgentQueryParser.ParensCriteriaContext;
    49 45  import io.onedev.server.search.entity.agent.AgentQueryParser.QueryContext;
     46 +import io.onedev.server.util.criteria.AndCriteria;
     47 +import io.onedev.server.util.criteria.Criteria;
     48 +import io.onedev.server.util.criteria.NotCriteria;
     49 +import io.onedev.server.util.criteria.OrCriteria;
    50 50   
    51 51  public class AgentQuery extends EntityQuery<Agent> {
    52 52   
    53 53   private static final long serialVersionUID = 1L;
    54 54   
    55  - private final EntityCriteria<Agent> criteria;
     55 + private final Criteria<Agent> criteria;
    56 56  
    57 57   private final List<EntitySort> sorts;
    58 58  
    59  - public AgentQuery(@Nullable EntityCriteria<Agent> criteria, List<EntitySort> sorts) {
     59 + public AgentQuery(@Nullable Criteria<Agent> criteria, List<EntitySort> sorts) {
    60 60   this.criteria = criteria;
    61 61   this.sorts = sorts;
    62 62   }
    63 63   
    64  - public AgentQuery(@Nullable EntityCriteria<Agent> criteria) {
     64 + public AgentQuery(@Nullable Criteria<Agent> criteria) {
    65 65   this(criteria, new ArrayList<>());
    66 66   }
    67 67  
    skipped 21 lines
    89 89   parser.setErrorHandler(new BailErrorStrategy());
    90 90   QueryContext queryContext = parser.query();
    91 91   CriteriaContext criteriaContext = queryContext.criteria();
    92  - EntityCriteria<Agent> agentCriteria;
     92 + Criteria<Agent> agentCriteria;
    93 93   if (criteriaContext != null) {
    94  - agentCriteria = new AgentQueryBaseVisitor<EntityCriteria<Agent>>() {
     94 + agentCriteria = new AgentQueryBaseVisitor<Criteria<Agent>>() {
    95 95   
    96 96   @Override
    97  - public EntityCriteria<Agent> visitOperatorCriteria(OperatorCriteriaContext ctx) {
     97 + public Criteria<Agent> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    98 98   if (forExecutor)
    99 99   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    100 100  
    skipped 12 lines
    113 113   }
    114 114  
    115 115   @Override
    116  - public EntityCriteria<Agent> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     116 + public Criteria<Agent> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    117 117   if (forExecutor && ctx.HasAttribute() == null)
    118 118   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    119 119  
    skipped 11 lines
    131 131   }
    132 132  
    133 133   @Override
    134  - public EntityCriteria<Agent> visitParensCriteria(ParensCriteriaContext ctx) {
    135  - return (EntityCriteria<Agent>) visit(ctx.criteria()).withParens(true);
     134 + public Criteria<Agent> visitParensCriteria(ParensCriteriaContext ctx) {
     135 + return (Criteria<Agent>) visit(ctx.criteria()).withParens(true);
    136 136   }
    137 137   
    138 138   @Override
    139  - public EntityCriteria<Agent> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     139 + public Criteria<Agent> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    140 140   String fieldName = getValue(ctx.Quoted(0).getText());
    141 141   String value = getValue(ctx.Quoted(1).getText());
    142 142   int operator = ctx.operator.getType();
    skipped 31 lines
    174 174   }
    175 175  
    176 176   @Override
    177  - public EntityCriteria<Agent> visitOrCriteria(OrCriteriaContext ctx) {
    178  - List<EntityCriteria<Agent>> childCriterias = new ArrayList<>();
     177 + public Criteria<Agent> visitOrCriteria(OrCriteriaContext ctx) {
     178 + List<Criteria<Agent>> childCriterias = new ArrayList<>();
    179 179   for (CriteriaContext childCtx: ctx.criteria())
    180 180   childCriterias.add(visit(childCtx));
    181  - return new OrEntityCriteria<Agent>(childCriterias);
     181 + return new OrCriteria<Agent>(childCriterias);
    182 182   }
    183 183   
    184 184   @Override
    185  - public EntityCriteria<Agent> visitAndCriteria(AndCriteriaContext ctx) {
    186  - List<EntityCriteria<Agent>> childCriterias = new ArrayList<>();
     185 + public Criteria<Agent> visitAndCriteria(AndCriteriaContext ctx) {
     186 + List<Criteria<Agent>> childCriterias = new ArrayList<>();
    187 187   for (CriteriaContext childCtx: ctx.criteria())
    188 188   childCriterias.add(visit(childCtx));
    189  - return new AndEntityCriteria<Agent>(childCriterias);
     189 + return new AndCriteria<Agent>(childCriterias);
    190 190   }
    191 191   
    192 192   @Override
    193  - public EntityCriteria<Agent> visitNotCriteria(NotCriteriaContext ctx) {
    194  - return new NotEntityCriteria<Agent>(visit(ctx.criteria()));
     193 + public Criteria<Agent> visitNotCriteria(NotCriteriaContext ctx) {
     194 + return new NotCriteria<Agent>(visit(ctx.criteria()));
    195 195   }
    196 196   
    197 197   }.visit(criteriaContext);
    skipped 50 lines
    248 248   }
    249 249  
    250 250   @Override
    251  - public EntityCriteria<Agent> getCriteria() {
     251 + public Criteria<Agent> getCriteria() {
    252 252   return criteria;
    253 253   }
    254 254   
    skipped 3 lines
    258 258   }
    259 259  
    260 260   public static AgentQuery merge(AgentQuery query1, AgentQuery query2) {
    261  - List<EntityCriteria<Agent>> criterias = new ArrayList<>();
     261 + List<Criteria<Agent>> criterias = new ArrayList<>();
    262 262   if (query1.getCriteria() != null)
    263 263   criterias.add(query1.getCriteria());
    264 264   if (query2.getCriteria() != null)
    skipped 1 lines
    266 266   List<EntitySort> sorts = new ArrayList<>();
    267 267   sorts.addAll(query1.getSorts());
    268 268   sorts.addAll(query2.getSorts());
    269  - return new AgentQuery(EntityCriteria.andCriterias(criterias), sorts);
     269 + return new AgentQuery(Criteria.andCriterias(criterias), sorts);
    270 270   }
    271 271  
    272 272  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/AttributeCriteria.java
    skipped 8 lines
    9 9   
    10 10  import io.onedev.server.model.Agent;
    11 11  import io.onedev.server.model.AgentAttribute;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class AttributeCriteria extends EntityCriteria<Agent> {
     14 +public class AttributeCriteria extends Criteria<Agent> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 35 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/CpuCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
    11 10  import io.onedev.server.search.entity.EntityQuery;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class CpuCriteria extends EntityCriteria<Agent> {
     13 +public class CpuCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 39 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/EverUsedSinceCriteria.java
    skipped 7 lines
    8 8  import javax.persistence.criteria.Predicate;
    9 9   
    10 10  import io.onedev.server.model.Agent;
    11  -import io.onedev.server.search.entity.EntityCriteria;
    12 11  import io.onedev.server.search.entity.EntityQuery;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class EverUsedSinceCriteria extends EntityCriteria<Agent> {
     14 +public class EverUsedSinceCriteria extends Criteria<Agent> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 26 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/HasAttributeCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.model.Agent;
    11 11  import io.onedev.server.model.AgentAttribute;
    12 12  import io.onedev.server.model.BuildParam;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class HasAttributeCriteria extends EntityCriteria<Agent> {
     15 +public class HasAttributeCriteria extends Criteria<Agent> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18  
    skipped 30 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/HasRunningBuildsCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.entitymanager.BuildManager;
    12 12  import io.onedev.server.model.Agent;
    13 13  import io.onedev.server.model.Build;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class HasRunningBuildsCriteria extends EntityCriteria<Agent> {
     16 +public class HasRunningBuildsCriteria extends Criteria<Agent> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 20 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/IpAddressCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class IpAddressCriteria extends EntityCriteria<Agent> {
     13 +public class IpAddressCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/MemoryCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
    11 10  import io.onedev.server.search.entity.EntityQuery;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class MemoryCriteria extends EntityCriteria<Agent> {
     13 +public class MemoryCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 39 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/NameCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class NameCriteria extends EntityCriteria<Agent> {
     13 +public class NameCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/NotUsedSinceCriteria.java
    skipped 7 lines
    8 8  import javax.persistence.criteria.Predicate;
    9 9   
    10 10  import io.onedev.server.model.Agent;
    11  -import io.onedev.server.search.entity.EntityCriteria;
    12 11  import io.onedev.server.search.entity.EntityQuery;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class NotUsedSinceCriteria extends EntityCriteria<Agent> {
     14 +public class NotUsedSinceCriteria extends Criteria<Agent> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 26 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/OfflineCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Agent;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class OfflineCriteria extends EntityCriteria<Agent> {
     11 +public class OfflineCriteria extends Criteria<Agent> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/OnlineCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.OneDev;
    12 12  import io.onedev.server.entitymanager.AgentManager;
    13 13  import io.onedev.server.model.Agent;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class OnlineCriteria extends EntityCriteria<Agent> {
     16 +public class OnlineCriteria extends Criteria<Agent> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 22 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/OsArchCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class OsArchCriteria extends EntityCriteria<Agent> {
     13 +public class OsArchCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/OsCriteria.java
    skipped 6 lines
    7 7   
    8 8  import io.onedev.agent.AgentOs;
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class OsCriteria extends EntityCriteria<Agent> {
     12 +public class OsCriteria extends Criteria<Agent> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/OsVersionCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Agent;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class OsVersionCriteria extends EntityCriteria<Agent> {
     13 +public class OsVersionCriteria extends Criteria<Agent> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/PausedCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Agent;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class PausedCriteria extends EntityCriteria<Agent> {
     11 +public class PausedCriteria extends Criteria<Agent> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/agent/RanBuildCriteria.java
    skipped 8 lines
    9 9   
    10 10  import io.onedev.server.model.Agent;
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class RanBuildCriteria extends EntityCriteria<Agent> {
     15 +public class RanBuildCriteria extends Criteria<Agent> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 29 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/BranchCriteria.java
    skipped 8 lines
    9 9  import org.eclipse.jgit.lib.Constants;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13  import io.onedev.server.util.match.WildcardUtils;
    14 14   
    15  -public class BranchCriteria extends EntityCriteria<Build> {
     15 +public class BranchCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/BranchIsEmptyCriteria.java
    skipped 8 lines
    9 9  import org.eclipse.jgit.lib.Constants;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class BranchIsEmptyCriteria extends EntityCriteria<Build> {
     14 +public class BranchIsEmptyCriteria extends Criteria<Build> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 21 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/BuildQuery.java
    1 1  package io.onedev.server.search.entity.build;
    2 2   
     3 +import static io.onedev.server.model.Build.NAME_BRANCH;
    3 4  import static io.onedev.server.model.Build.NAME_COMMIT;
    4 5  import static io.onedev.server.model.Build.NAME_FINISH_DATE;
    5 6  import static io.onedev.server.model.Build.NAME_JOB;
    6 7  import static io.onedev.server.model.Build.NAME_NUMBER;
    7 8  import static io.onedev.server.model.Build.NAME_PENDING_DATE;
    8 9  import static io.onedev.server.model.Build.NAME_PROJECT;
     10 +import static io.onedev.server.model.Build.NAME_PULL_REQUEST;
    9 11  import static io.onedev.server.model.Build.NAME_RUNNING_DATE;
    10 12  import static io.onedev.server.model.Build.NAME_SUBMIT_DATE;
     13 +import static io.onedev.server.model.Build.NAME_TAG;
    11 14  import static io.onedev.server.model.Build.NAME_VERSION;
    12  -import static io.onedev.server.model.Build.NAME_PULL_REQUEST;
    13  -import static io.onedev.server.model.Build.NAME_BRANCH;
    14  -import static io.onedev.server.model.Build.NAME_TAG;
    15 15  import static io.onedev.server.model.Build.ORDER_FIELDS;
    16 16  import static io.onedev.server.model.Build.QUERY_FIELDS;
    17 17   
    skipped 17 lines
    35 35  import io.onedev.server.entitymanager.BuildParamManager;
    36 36  import io.onedev.server.model.Build;
    37 37  import io.onedev.server.model.Project;
    38  -import io.onedev.server.search.entity.AndEntityCriteria;
    39  -import io.onedev.server.search.entity.EntityCriteria;
    40 38  import io.onedev.server.search.entity.EntityQuery;
    41 39  import io.onedev.server.search.entity.EntitySort;
    42 40  import io.onedev.server.search.entity.EntitySort.Direction;
    43  -import io.onedev.server.search.entity.NotEntityCriteria;
    44  -import io.onedev.server.search.entity.OrEntityCriteria;
    45 41  import io.onedev.server.search.entity.build.BuildQueryParser.AndCriteriaContext;
    46 42  import io.onedev.server.search.entity.build.BuildQueryParser.CriteriaContext;
    47 43  import io.onedev.server.search.entity.build.BuildQueryParser.FieldOperatorCriteriaContext;
    skipped 6 lines
    54 50  import io.onedev.server.search.entity.build.BuildQueryParser.ParensCriteriaContext;
    55 51  import io.onedev.server.search.entity.build.BuildQueryParser.QueryContext;
    56 52  import io.onedev.server.util.ProjectScopedCommit;
     53 +import io.onedev.server.util.criteria.AndCriteria;
     54 +import io.onedev.server.util.criteria.Criteria;
     55 +import io.onedev.server.util.criteria.NotCriteria;
     56 +import io.onedev.server.util.criteria.OrCriteria;
    57 57   
    58 58  public class BuildQuery extends EntityQuery<Build> {
    59 59   
    60 60   private static final long serialVersionUID = 1L;
    61 61   
    62  - private final EntityCriteria<Build> criteria;
     62 + private final Criteria<Build> criteria;
    63 63  
    64 64   private final List<EntitySort> sorts;
    65 65  
    66  - public BuildQuery(@Nullable EntityCriteria<Build> criteria, List<EntitySort> sorts) {
     66 + public BuildQuery(@Nullable Criteria<Build> criteria, List<EntitySort> sorts) {
    67 67   this.criteria = criteria;
    68 68   this.sorts = sorts;
    69 69   }
    70 70   
    71  - public BuildQuery(@Nullable EntityCriteria<Build> criteria) {
     71 + public BuildQuery(@Nullable Criteria<Build> criteria) {
    72 72   this(criteria, new ArrayList<>());
    73 73   }
    74 74  
    skipped 22 lines
    97 97   parser.setErrorHandler(new BailErrorStrategy());
    98 98   QueryContext queryContext = parser.query();
    99 99   CriteriaContext criteriaContext = queryContext.criteria();
    100  - EntityCriteria<Build> buildCriteria;
     100 + Criteria<Build> buildCriteria;
    101 101   if (criteriaContext != null) {
    102  - buildCriteria = new BuildQueryBaseVisitor<EntityCriteria<Build>>() {
     102 + buildCriteria = new BuildQueryBaseVisitor<Criteria<Build>>() {
    103 103   
    104 104   @Override
    105  - public EntityCriteria<Build> visitOperatorCriteria(OperatorCriteriaContext ctx) {
     105 + public Criteria<Build> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    106 106   switch (ctx.operator.getType()) {
    107 107   case BuildQueryLexer.Successful:
    108 108   return new SuccessfulCriteria();
    skipped 29 lines
    138 138   }
    139 139  
    140 140   @Override
    141  - public EntityCriteria<Build> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     141 + public Criteria<Build> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    142 142   String value = getValue(ctx.Quoted().getText());
    143 143   if (ctx.SubmittedBy() != null)
    144 144   return new SubmittedByCriteria(getUser(value));
    skipped 12 lines
    157 157   }
    158 158  
    159 159   @Override
    160  - public EntityCriteria<Build> visitParensCriteria(ParensCriteriaContext ctx) {
    161  - return (EntityCriteria<Build>) visit(ctx.criteria()).withParens(true);
     160 + public Criteria<Build> visitParensCriteria(ParensCriteriaContext ctx) {
     161 + return (Criteria<Build>) visit(ctx.criteria()).withParens(true);
    162 162   }
    163 163   
    164 164   @Override
    165  - public EntityCriteria<Build> visitFieldOperatorCriteria(FieldOperatorCriteriaContext ctx) {
     165 + public Criteria<Build> visitFieldOperatorCriteria(FieldOperatorCriteriaContext ctx) {
    166 166   String fieldName = getValue(ctx.Quoted().getText());
    167 167   int operator = ctx.operator.getType();
    168 168   checkField(project, fieldName, operator);
    skipped 10 lines
    179 179   }
    180 180  
    181 181   @Override
    182  - public EntityCriteria<Build> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     182 + public Criteria<Build> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    183 183   String fieldName = getValue(ctx.Quoted(0).getText());
    184 184   String value = getValue(ctx.Quoted(1).getText());
    185 185   int operator = ctx.operator.getType();
    skipped 43 lines
    229 229   }
    230 230  
    231 231   @Override
    232  - public EntityCriteria<Build> visitOrCriteria(OrCriteriaContext ctx) {
    233  - List<EntityCriteria<Build>> childCriterias = new ArrayList<>();
     232 + public Criteria<Build> visitOrCriteria(OrCriteriaContext ctx) {
     233 + List<Criteria<Build>> childCriterias = new ArrayList<>();
    234 234   for (CriteriaContext childCtx: ctx.criteria())
    235 235   childCriterias.add(visit(childCtx));
    236  - return new OrEntityCriteria<Build>(childCriterias);
     236 + return new OrCriteria<Build>(childCriterias);
    237 237   }
    238 238   
    239 239   @Override
    240  - public EntityCriteria<Build> visitAndCriteria(AndCriteriaContext ctx) {
    241  - List<EntityCriteria<Build>> childCriterias = new ArrayList<>();
     240 + public Criteria<Build> visitAndCriteria(AndCriteriaContext ctx) {
     241 + List<Criteria<Build>> childCriterias = new ArrayList<>();
    242 242   for (CriteriaContext childCtx: ctx.criteria())
    243 243   childCriterias.add(visit(childCtx));
    244  - return new AndEntityCriteria<Build>(childCriterias);
     244 + return new AndCriteria<Build>(childCriterias);
    245 245   }
    246 246   
    247 247   @Override
    248  - public EntityCriteria<Build> visitNotCriteria(NotCriteriaContext ctx) {
    249  - return new NotEntityCriteria<Build>(visit(ctx.criteria()));
     248 + public Criteria<Build> visitNotCriteria(NotCriteriaContext ctx) {
     249 + return new NotCriteria<Build>(visit(ctx.criteria()));
    250 250   }
    251 251   
    252 252   }.visit(criteriaContext);
    skipped 72 lines
    325 325   }
    326 326  
    327 327   @Override
    328  - public EntityCriteria<Build> getCriteria() {
     328 + public Criteria<Build> getCriteria() {
    329 329   return criteria;
    330 330   }
    331 331   
    skipped 3 lines
    335 335   }
    336 336  
    337 337   public static BuildQuery merge(BuildQuery query1, BuildQuery query2) {
    338  - List<EntityCriteria<Build>> criterias = new ArrayList<>();
     338 + List<Criteria<Build>> criterias = new ArrayList<>();
    339 339   if (query1.getCriteria() != null)
    340 340   criterias.add(query1.getCriteria());
    341 341   if (query2.getCriteria() != null)
    skipped 1 lines
    343 343   List<EntitySort> sorts = new ArrayList<>();
    344 344   sorts.addAll(query1.getSorts());
    345 345   sorts.addAll(query2.getSorts());
    346  - return new BuildQuery(EntityCriteria.andCriterias(criterias), sorts);
     346 + return new BuildQuery(Criteria.andCriterias(criterias), sorts);
    347 347   }
    348 348  
    349 349  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/CancelledByCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.User;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class CancelledByCriteria extends EntityCriteria<Build> {
     15 +public class CancelledByCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/CancelledByMeCriteria.java
    skipped 8 lines
    9 9  import io.onedev.commons.utils.ExplicitException;
    10 10  import io.onedev.server.model.Build;
    11 11  import io.onedev.server.model.User;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class CancelledByMeCriteria extends EntityCriteria<Build> {
     14 +public class CancelledByMeCriteria extends Criteria<Build> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/CancelledCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class CancelledCriteria extends EntityCriteria<Build> {
     12 +public class CancelledCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/CommitCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.Project;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class CommitCriteria extends EntityCriteria<Build> {
     15 +public class CommitCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/DependenciesOfCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.BuildDependence;
    13 13  import io.onedev.server.model.Project;
    14  -import io.onedev.server.search.entity.EntityCriteria;
    15 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class DependenciesOfCriteria extends EntityCriteria<Build> {
     17 +public class DependenciesOfCriteria extends Criteria<Build> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/DependsOnCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.BuildDependence;
    13 13  import io.onedev.server.model.Project;
    14  -import io.onedev.server.search.entity.EntityCriteria;
    15 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class DependsOnCriteria extends EntityCriteria<Build> {
     17 +public class DependsOnCriteria extends Criteria<Build> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/FailedCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class FailedCriteria extends EntityCriteria<Build> {
     12 +public class FailedCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/FinishDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class FinishDateCriteria extends EntityCriteria<Build> {
     15 +public class FinishDateCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 37 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/FixedIssueCriteria.java
    skipped 18 lines
    19 19  import io.onedev.server.model.Build;
    20 20  import io.onedev.server.model.Issue;
    21 21  import io.onedev.server.model.Project;
    22  -import io.onedev.server.search.entity.EntityCriteria;
    23 22  import io.onedev.server.search.entity.EntityQuery;
     23 +import io.onedev.server.util.criteria.Criteria;
    24 24   
    25  -public class FixedIssueCriteria extends EntityCriteria<Build> {
     25 +public class FixedIssueCriteria extends Criteria<Build> {
    26 26   
    27 27   private static final long serialVersionUID = 1L;
    28 28   
    skipped 53 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/JobCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class JobCriteria extends EntityCriteria<Build> {
     13 +public class JobCriteria extends Criteria<Build> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/NumberCriteria.java
    skipped 8 lines
    9 9   
    10 10  import io.onedev.server.model.Build;
    11 11  import io.onedev.server.model.Project;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
    14 13  import io.onedev.server.util.ProjectScopedNumber;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class NumberCriteria extends EntityCriteria<Build> {
     16 +public class NumberCriteria extends Criteria<Build> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 50 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/ParamCriteria.java
    skipped 10 lines
    11 11   
    12 12  import io.onedev.server.model.Build;
    13 13  import io.onedev.server.model.BuildParam;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class ParamCriteria extends EntityCriteria<Build> {
     16 +public class ParamCriteria extends Criteria<Build> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 36 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/ParamIsEmptyCriteria.java
    skipped 10 lines
    11 11   
    12 12  import io.onedev.server.model.Build;
    13 13  import io.onedev.server.model.BuildParam;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class ParamIsEmptyCriteria extends EntityCriteria<Build> {
     16 +public class ParamIsEmptyCriteria extends Criteria<Build> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 31 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/PendingCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class PendingCriteria extends EntityCriteria<Build> {
     12 +public class PendingCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/PendingDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class PendingDateCriteria extends EntityCriteria<Build> {
     15 +public class PendingDateCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/ProjectCriteria.java
    skipped 8 lines
    9 9  import io.onedev.server.OneDev;
    10 10  import io.onedev.server.entitymanager.ProjectManager;
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13  import io.onedev.server.util.match.WildcardUtils;
    14 14   
    15  -public class ProjectCriteria extends EntityCriteria<Build> {
     15 +public class ProjectCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18  
    skipped 26 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/PullRequestCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.model.Build;
    11 11  import io.onedev.server.model.Project;
    12 12  import io.onedev.server.model.PullRequest;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.search.entity.EntityQuery;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class PullRequestCriteria extends EntityCriteria<Build> {
     16 +public class PullRequestCriteria extends Criteria<Build> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 29 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/PullRequestIsEmptyCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Build;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class PullRequestIsEmptyCriteria extends EntityCriteria<Build> {
     11 +public class PullRequestIsEmptyCriteria extends Criteria<Build> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/RanOnCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.entitymanager.AgentManager;
    13 13  import io.onedev.server.model.Agent;
    14 14  import io.onedev.server.model.Build;
    15  -import io.onedev.server.search.entity.EntityCriteria;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class RanOnCriteria extends EntityCriteria<Build> {
     17 +public class RanOnCriteria extends Criteria<Build> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/RunningCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class RunningCriteria extends EntityCriteria<Build> {
     12 +public class RunningCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/RunningDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class RunningDateCriteria extends EntityCriteria<Build> {
     15 +public class RunningDateCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/SubmitDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class SubmitDateCriteria extends EntityCriteria<Build> {
     15 +public class SubmitDateCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/SubmittedByCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.User;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class SubmittedByCriteria extends EntityCriteria<Build> {
     15 +public class SubmittedByCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/SubmittedByMeCriteria.java
    skipped 8 lines
    9 9  import io.onedev.commons.utils.ExplicitException;
    10 10  import io.onedev.server.model.Build;
    11 11  import io.onedev.server.model.User;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class SubmittedByMeCriteria extends EntityCriteria<Build> {
     14 +public class SubmittedByMeCriteria extends Criteria<Build> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/SuccessfulCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class SuccessfulCriteria extends EntityCriteria<Build> {
     12 +public class SuccessfulCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/TagCriteria.java
    skipped 8 lines
    9 9  import org.eclipse.jgit.lib.Constants;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13  import io.onedev.server.util.match.WildcardUtils;
    14 14   
    15  -public class TagCriteria extends EntityCriteria<Build> {
     15 +public class TagCriteria extends Criteria<Build> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/TagIsEmptyCriteria.java
    skipped 8 lines
    9 9  import org.eclipse.jgit.lib.Constants;
    10 10   
    11 11  import io.onedev.server.model.Build;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class TagIsEmptyCriteria extends EntityCriteria<Build> {
     14 +public class TagIsEmptyCriteria extends Criteria<Build> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 20 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/TimedOutCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class TimedOutCriteria extends EntityCriteria<Build> {
     12 +public class TimedOutCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/VersionCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class VersionCriteria extends EntityCriteria<Build> {
     13 +public class VersionCriteria extends Criteria<Build> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/VersionIsEmptyCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Build;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class VersionIsEmptyCriteria extends EntityCriteria<Build> {
     11 +public class VersionIsEmptyCriteria extends Criteria<Build> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/build/WaitingCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Build;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class WaitingCriteria extends EntityCriteria<Build> {
     12 +public class WaitingCriteria extends Criteria<Build> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/CodeCommentQuery.java
    skipped 26 lines
    27 27  import io.onedev.commons.utils.ExplicitException;
    28 28  import io.onedev.server.model.CodeComment;
    29 29  import io.onedev.server.model.Project;
    30  -import io.onedev.server.search.entity.AndEntityCriteria;
    31  -import io.onedev.server.search.entity.EntityCriteria;
    32 30  import io.onedev.server.search.entity.EntityQuery;
    33 31  import io.onedev.server.search.entity.EntitySort;
    34 32  import io.onedev.server.search.entity.EntitySort.Direction;
    35  -import io.onedev.server.search.entity.NotEntityCriteria;
    36  -import io.onedev.server.search.entity.OrEntityCriteria;
    37 33  import io.onedev.server.search.entity.codecomment.CodeCommentQueryParser.AndCriteriaContext;
    38 34  import io.onedev.server.search.entity.codecomment.CodeCommentQueryParser.CriteriaContext;
    39 35  import io.onedev.server.search.entity.codecomment.CodeCommentQueryParser.FieldOperatorValueCriteriaContext;
    skipped 5 lines
    45 41  import io.onedev.server.search.entity.codecomment.CodeCommentQueryParser.ParensCriteriaContext;
    46 42  import io.onedev.server.search.entity.codecomment.CodeCommentQueryParser.QueryContext;
    47 43  import io.onedev.server.util.ProjectScopedCommit;
     44 +import io.onedev.server.util.criteria.AndCriteria;
     45 +import io.onedev.server.util.criteria.Criteria;
     46 +import io.onedev.server.util.criteria.NotCriteria;
     47 +import io.onedev.server.util.criteria.OrCriteria;
    48 48   
    49 49  public class CodeCommentQuery extends EntityQuery<CodeComment> {
    50 50   
    51 51   private static final long serialVersionUID = 1L;
    52 52   
    53  - private final EntityCriteria<CodeComment> criteria;
     53 + private final Criteria<CodeComment> criteria;
    54 54  
    55 55   private final List<EntitySort> sorts;
    56 56  
    57  - public CodeCommentQuery(@Nullable EntityCriteria<CodeComment> criteria, List<EntitySort> sorts) {
     57 + public CodeCommentQuery(@Nullable Criteria<CodeComment> criteria, List<EntitySort> sorts) {
    58 58   this.criteria = criteria;
    59 59   this.sorts = sorts;
    60 60   }
    61 61   
    62  - public CodeCommentQuery(@Nullable EntityCriteria<CodeComment> criteria) {
     62 + public CodeCommentQuery(@Nullable Criteria<CodeComment> criteria) {
    63 63   this(criteria, new ArrayList<>());
    64 64   }
    65 65  
    skipped 21 lines
    87 87   parser.setErrorHandler(new BailErrorStrategy());
    88 88   QueryContext queryContext = parser.query();
    89 89   CriteriaContext criteriaContext = queryContext.criteria();
    90  - EntityCriteria<CodeComment> commentCriteria;
     90 + Criteria<CodeComment> commentCriteria;
    91 91   if (criteriaContext != null) {
    92  - commentCriteria = new CodeCommentQueryBaseVisitor<EntityCriteria<CodeComment>>() {
     92 + commentCriteria = new CodeCommentQueryBaseVisitor<Criteria<CodeComment>>() {
    93 93   
    94 94   @Override
    95  - public EntityCriteria<CodeComment> visitOperatorCriteria(OperatorCriteriaContext ctx) {
     95 + public Criteria<CodeComment> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    96 96   return new CreatedByMeCriteria();
    97 97   }
    98 98  
    99 99   @Override
    100  - public EntityCriteria<CodeComment> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     100 + public Criteria<CodeComment> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    101 101   int operator = ctx.operator.getType();
    102 102   String value = getValue(ctx.Quoted().getText());
    103 103   if (operator == CodeCommentQueryLexer.CreatedBy) {
    skipped 5 lines
    109 109   }
    110 110  
    111 111   @Override
    112  - public EntityCriteria<CodeComment> visitParensCriteria(ParensCriteriaContext ctx) {
    113  - return (EntityCriteria<CodeComment>) visit(ctx.criteria()).withParens(true);
     112 + public Criteria<CodeComment> visitParensCriteria(ParensCriteriaContext ctx) {
     113 + return (Criteria<CodeComment>) visit(ctx.criteria()).withParens(true);
    114 114   }
    115 115   
    116 116   @Override
    117  - public EntityCriteria<CodeComment> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     117 + public Criteria<CodeComment> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    118 118   String fieldName = getValue(ctx.Quoted(0).getText());
    119 119   String value = getValue(ctx.Quoted(1).getText());
    120 120   int operator = ctx.operator.getType();
    skipped 38 lines
    159 159   }
    160 160  
    161 161   @Override
    162  - public EntityCriteria<CodeComment> visitOrCriteria(OrCriteriaContext ctx) {
    163  - List<EntityCriteria<CodeComment>> childCriterias = new ArrayList<>();
     162 + public Criteria<CodeComment> visitOrCriteria(OrCriteriaContext ctx) {
     163 + List<Criteria<CodeComment>> childCriterias = new ArrayList<>();
    164 164   for (CriteriaContext childCtx: ctx.criteria())
    165 165   childCriterias.add(visit(childCtx));
    166  - return new OrEntityCriteria<CodeComment>(childCriterias);
     166 + return new OrCriteria<CodeComment>(childCriterias);
    167 167   }
    168 168   
    169 169   @Override
    170  - public EntityCriteria<CodeComment> visitAndCriteria(AndCriteriaContext ctx) {
    171  - List<EntityCriteria<CodeComment>> childCriterias = new ArrayList<>();
     170 + public Criteria<CodeComment> visitAndCriteria(AndCriteriaContext ctx) {
     171 + List<Criteria<CodeComment>> childCriterias = new ArrayList<>();
    172 172   for (CriteriaContext childCtx: ctx.criteria())
    173 173   childCriterias.add(visit(childCtx));
    174  - return new AndEntityCriteria<CodeComment>(childCriterias);
     174 + return new AndCriteria<CodeComment>(childCriterias);
    175 175   }
    176 176   
    177 177   @Override
    178  - public EntityCriteria<CodeComment> visitNotCriteria(NotCriteriaContext ctx) {
    179  - return new NotEntityCriteria<CodeComment>(visit(ctx.criteria()));
     178 + public Criteria<CodeComment> visitNotCriteria(NotCriteriaContext ctx) {
     179 + return new NotCriteria<CodeComment>(visit(ctx.criteria()));
    180 180   }
    181 181   
    182 182   }.visit(criteriaContext);
    skipped 60 lines
    243 243   }
    244 244  
    245 245   @Override
    246  - public EntityCriteria<CodeComment> getCriteria() {
     246 + public Criteria<CodeComment> getCriteria() {
    247 247   return criteria;
    248 248   }
    249 249   
    skipped 7 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/ContentCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.CodeComment;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class ContentCriteria extends EntityCriteria<CodeComment> {
     13 +public class ContentCriteria extends Criteria<CodeComment> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/CreateDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.CodeComment;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class CreateDateCriteria extends EntityCriteria<CodeComment> {
     14 +public class CreateDateCriteria extends Criteria<CodeComment> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/CreatedByCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.CodeComment;
    12 12  import io.onedev.server.model.User;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class CreatedByCriteria extends EntityCriteria<CodeComment> {
     15 +public class CreatedByCriteria extends Criteria<CodeComment> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/CreatedByMeCriteria.java
    skipped 8 lines
    9 9  import io.onedev.commons.utils.ExplicitException;
    10 10  import io.onedev.server.model.CodeComment;
    11 11  import io.onedev.server.model.User;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class CreatedByMeCriteria extends EntityCriteria<CodeComment> {
     14 +public class CreatedByMeCriteria extends Criteria<CodeComment> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/OnCommitCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.CodeComment;
    12 12  import io.onedev.server.model.Project;
    13 13  import io.onedev.server.model.support.Mark;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class OnCommitCriteria extends EntityCriteria<CodeComment> {
     16 +public class OnCommitCriteria extends Criteria<CodeComment> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 31 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/PathCriteria.java
    skipped 7 lines
    8 8   
    9 9  import io.onedev.server.model.CodeComment;
    10 10  import io.onedev.server.model.support.Mark;
    11  -import io.onedev.server.search.entity.EntityCriteria;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12  import io.onedev.server.util.match.WildcardUtils;
    13 13   
    14  -public class PathCriteria extends EntityCriteria<CodeComment> {
     14 +public class PathCriteria extends Criteria<CodeComment> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 29 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/ReplyCountCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.CodeComment;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class ReplyCountCriteria extends EntityCriteria<CodeComment> {
     12 +public class ReplyCountCriteria extends Criteria<CodeComment> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 39 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/ReplyCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.CodeComment;
    12 12  import io.onedev.server.model.CodeCommentReply;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14  import io.onedev.server.util.match.WildcardUtils;
    15 15   
    16  -public class ReplyCriteria extends EntityCriteria<CodeComment> {
     16 +public class ReplyCriteria extends Criteria<CodeComment> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 33 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/codecomment/UpdateDateCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.CodeComment;
    12 12  import io.onedev.server.model.support.LastUpdate;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class UpdateDateCriteria extends EntityCriteria<CodeComment> {
     15 +public class UpdateDateCriteria extends Criteria<CodeComment> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/AndIssueCriteria.java
    1  -package io.onedev.server.search.entity.issue;
    2  - 
    3  -import java.util.ArrayList;
    4  -import java.util.Collection;
    5  -import java.util.HashSet;
    6  -import java.util.Iterator;
    7  -import java.util.List;
    8  -import java.util.Map;
    9  -import java.util.Set;
    10  - 
    11  -import javax.persistence.criteria.CriteriaBuilder;
    12  -import javax.persistence.criteria.CriteriaQuery;
    13  -import javax.persistence.criteria.From;
    14  -import javax.persistence.criteria.Predicate;
    15  - 
    16  -import io.onedev.server.model.Issue;
    17  -import io.onedev.server.search.entity.AndEntityCriteria;
    18  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    19  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    20  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    21  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    22  - 
    23  -public class AndIssueCriteria extends IssueCriteria {
    24  -
    25  - private static final long serialVersionUID = 1L;
    26  - 
    27  - private final List<IssueCriteria> criterias;
    28  -
    29  - public AndIssueCriteria(List<IssueCriteria> criterias) {
    30  - this.criterias = criterias;
    31  - }
    32  - 
    33  - @Override
    34  - public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    35  - return new AndEntityCriteria<Issue>(criterias).getPredicate(query, from, builder);
    36  - }
    37  - 
    38  - @Override
    39  - public boolean matches(Issue issue) {
    40  - return new AndEntityCriteria<Issue>(criterias).matches(issue);
    41  - }
    42  - 
    43  - @Override
    44  - public String toStringWithoutParens() {
    45  - return new AndEntityCriteria<Issue>(criterias).toStringWithoutParens();
    46  - }
    47  - 
    48  - @Override
    49  - public Collection<String> getUndefinedStates() {
    50  - List<String> undefinedStates = new ArrayList<>();
    51  - for (IssueCriteria criteria: criterias)
    52  - undefinedStates.addAll(criteria.getUndefinedStates());
    53  - return undefinedStates;
    54  - }
    55  - 
    56  - @Override
    57  - public Collection<String> getUndefinedFields() {
    58  - Set<String> undefinedFields = new HashSet<>();
    59  - for (IssueCriteria criteria: criterias)
    60  - undefinedFields.addAll(criteria.getUndefinedFields());
    61  - return undefinedFields;
    62  - }
    63  - 
    64  - @Override
    65  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    66  - Set<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    67  - for (IssueCriteria criteria: criterias)
    68  - undefinedFieldValues.addAll(criteria.getUndefinedFieldValues());
    69  - return undefinedFieldValues;
    70  - }
    71  - 
    72  - @Override
    73  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    74  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    75  - if (!it.next().fixUndefinedStates(resolutions))
    76  - it.remove();
    77  - }
    78  - return !criterias.isEmpty();
    79  - }
    80  -
    81  - @Override
    82  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    83  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    84  - if (!it.next().fixUndefinedFields(resolutions))
    85  - it.remove();
    86  - }
    87  - return !criterias.isEmpty();
    88  - }
    89  -
    90  - @Override
    91  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    92  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    93  - if (!it.next().fixUndefinedFieldValues(resolutions))
    94  - it.remove();
    95  - }
    96  - return !criterias.isEmpty();
    97  - }
    98  -
    99  - @Override
    100  - public void fill(Issue issue) {
    101  - for (IssueCriteria criteria: criterias)
    102  - criteria.fill(issue);
    103  - }
    104  -
    105  -}
    106  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/BuildFieldCriteria.java
    skipped 18 lines
    19 19   
    20 20   private static final long serialVersionUID = 1L;
    21 21   
    22  - private final Build build;
     22 + private final Project project;
    23 23  
    24 24   private final String value;
    25 25  
    26 26   private final boolean allowMultiple;
    27 27  
     28 + private transient Build build;
     29 +
    28 30   public BuildFieldCriteria(String name, @Nullable Project project, String value, boolean allowMultiple) {
    29 31   super(name);
    30  - build = EntityQuery.getBuild(project, value);
     32 + this.project = project;
    31 33   this.value = value;
    32 34   this.allowMultiple = allowMultiple;
    33 35   }
    34 36  
     37 + private Build getBuild() {
     38 + if (build == null)
     39 + build = EntityQuery.getBuild(project, value);
     40 + return build;
     41 + }
     42 + 
    35 43   @Override
    36 44   protected Predicate getValuePredicate(From<Issue, Issue> issueFrom, From<IssueField, IssueField> fieldFrom, CriteriaBuilder builder) {
    37  - return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), build.getId());
     45 + return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), getBuild().getId());
    38 46   }
    39 47   
    40 48   @Override
    41 49   public boolean matches(Issue issue) {
    42 50   Object fieldValue = issue.getFieldValue(getFieldName());
    43  - return issue.getProject().equals(build.getProject()) && Objects.equals(fieldValue, build.getNumber());
     51 + return issue.getProject().equals(getBuild().getProject()) && Objects.equals(fieldValue, getBuild().getId());
    44 52   }
    45 53   
    46 54   @SuppressWarnings({"unchecked" })
    skipped 3 lines
    50 58   List<Long> valueFromIssue = (List<Long>) issue.getFieldValue(getFieldName());
    51 59   if (valueFromIssue == null)
    52 60   valueFromIssue = new ArrayList<>();
    53  - valueFromIssue.add(build.getNumber());
     61 + valueFromIssue.add(getBuild().getId());
    54 62   issue.setFieldValue(getFieldName(), valueFromIssue);
    55 63   } else {
    56  - issue.setFieldValue(getFieldName(), build.getNumber());
     64 + issue.setFieldValue(getFieldName(), getBuild().getId());
    57 65   }
    58 66   }
    59 67  
    skipped 9 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/CommentCountCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Issue;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11   
    11  -public class CommentCountCriteria extends IssueCriteria {
     12 +public class CommentCountCriteria extends Criteria<Issue> {
    12 13   
    13 14   private static final long serialVersionUID = 1L;
    14 15   
    skipped 39 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/CommentCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Issue;
    12 12  import io.onedev.server.model.IssueComment;
     13 +import io.onedev.server.util.criteria.Criteria;
    13 14   
    14  -public class CommentCriteria extends IssueCriteria {
     15 +public class CommentCriteria extends Criteria<Issue> {
    15 16   
    16 17   private static final long serialVersionUID = 1L;
    17 18   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/CommitFieldCriteria.java
    skipped 16 lines
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    20  - private final ProjectScopedCommit commit;
     20 + private final Project project;
    21 21  
    22 22   private final String value;
    23 23  
     24 + private transient ProjectScopedCommit commit;
     25 +
    24 26   public CommitFieldCriteria(String name, @Nullable Project project, String value) {
    25 27   super(name);
    26  - commit = EntityQuery.getCommitId(project, value);
     28 + this.project = project;
    27 29   this.value = value;
    28 30   }
    29 31   
     32 + private ProjectScopedCommit getCommit() {
     33 + if (commit == null)
     34 + commit = EntityQuery.getCommitId(project, value);
     35 + return commit;
     36 + }
     37 +
    30 38   @Override
    31 39   protected Predicate getValuePredicate(From<Issue, Issue> issueFrom, From<IssueField, IssueField> fieldFrom, CriteriaBuilder builder) {
    32 40   return builder.and(
    33  - builder.equal(issueFrom.get(Issue.PROP_PROJECT), commit.getProject()),
    34  - builder.equal(fieldFrom.get(IssueField.PROP_VALUE), commit.getCommitId().name()));
     41 + builder.equal(issueFrom.get(Issue.PROP_PROJECT), getCommit().getProject()),
     42 + builder.equal(fieldFrom.get(IssueField.PROP_VALUE), getCommit().getCommitId().name()));
    35 43   }
    36 44   
    37 45   @Override
    38 46   public boolean matches(Issue issue) {
    39 47   Object fieldValue = issue.getFieldValue(getFieldName());
    40  - return issue.getProject().equals(commit.getProject())
    41  - && Objects.equals(fieldValue, commit.getCommitId().name());
     48 + return issue.getProject().equals(getCommit().getProject())
     49 + && Objects.equals(fieldValue, getCommit().getCommitId().name());
    42 50   }
    43 51   
    44 52   @Override
    skipped 8 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/CurrentIssueCriteria.java
    skipped 6 lines
    7 7   
    8 8  import io.onedev.commons.utils.ExplicitException;
    9 9  import io.onedev.server.model.Issue;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11   
    11  -public class CurrentIssueCriteria extends IssueCriteria {
     12 +public class CurrentIssueCriteria extends Criteria<Issue> {
    12 13   
    13 14   private static final long serialVersionUID = 1L;
    14 15  
    skipped 15 lines
    30 31   
    31 32   @Override
    32 33   public String toStringWithoutParens() {
    33  - return IssueQuery.getRuleName(IssueQueryLexer.IsCurrent);
     34 + return IssueQuery.getRuleName(IssueQueryLexer.CurrentIssue);
    34 35   }
    35 36   
    36 37  }
    skipped 1 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/DescriptionCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Issue;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11  import io.onedev.server.util.match.WildcardUtils;
    11 12   
    12  -public class DescriptionCriteria extends IssueCriteria {
     13 +public class DescriptionCriteria extends Criteria<Issue> {
    13 14   
    14 15   private static final long serialVersionUID = 1L;
    15 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FieldCriteria.java
    skipped 20 lines
    21 21  import io.onedev.server.model.IssueField;
    22 22  import io.onedev.server.model.support.administration.GlobalIssueSetting;
    23 23  import io.onedev.server.model.support.issue.field.spec.FieldSpec;
     24 +import io.onedev.server.util.criteria.Criteria;
    24 25  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    25 26   
    26  -public abstract class FieldCriteria extends IssueCriteria {
     27 +public abstract class FieldCriteria extends Criteria<Issue> {
    27 28   
    28 29   private static final long serialVersionUID = 1L;
    29 30   
    skipped 66 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FieldOperatorCriteria.java
    skipped 20 lines
    21 21  import io.onedev.server.model.support.issue.field.spec.BuildChoiceField;
    22 22  import io.onedev.server.model.support.issue.field.spec.CommitField;
    23 23  import io.onedev.server.model.support.issue.field.spec.PullRequestChoiceField;
    24  -import io.onedev.server.search.entity.EntityCriteria;
    25 24  import io.onedev.server.security.SecurityUtils;
    26 25  import io.onedev.server.util.ProjectScopedCommit;
     26 +import io.onedev.server.util.criteria.Criteria;
    27 27   
    28 28  public class FieldOperatorCriteria extends FieldCriteria {
    29 29   
    skipped 55 lines
    85 85   if (getFieldSpec() instanceof BuildChoiceField) {
    86 86   Build build = Build.get();
    87 87   if (build != null) {
    88  - Collection<Long> streamPreviousNumbers = Build.get().getStreamPreviousNumbers(EntityCriteria.IN_CLAUSE_LIMIT);
     88 + Collection<Long> streamPreviousNumbers = Build.get().getStreamPreviousNumbers(Criteria.IN_CLAUSE_LIMIT);
    89 89   if (!streamPreviousNumbers.isEmpty()) {
    90 90   return builder.and(
    91 91   builder.equal(projectAttribute, build.getProject()),
    skipped 49 lines
    141 141   Build build = Build.get();
    142 142   if (build != null) {
    143 143   return build.getProject().equals(issue.getProject())
    144  - && build.getStreamPreviousNumbers(EntityCriteria.IN_CLAUSE_LIMIT)
     144 + && build.getStreamPreviousNumbers(Criteria.IN_CLAUSE_LIMIT)
    145 145   .stream()
    146 146   .anyMatch(it->it.equals(fieldValue));
    147 147   } else {
    skipped 35 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedBetweenCriteria.java
    skipped 27 lines
    28 28  import io.onedev.server.model.Project;
    29 29  import io.onedev.server.search.entity.EntityQuery;
    30 30  import io.onedev.server.util.ProjectScopedCommit;
     31 +import io.onedev.server.util.criteria.Criteria;
    31 32   
    32  -public class FixedBetweenCriteria extends IssueCriteria {
     33 +public class FixedBetweenCriteria extends Criteria<Issue> {
    33 34   
    34 35   private static final long serialVersionUID = 1L;
    35 36   
    skipped 3 lines
    39 40  
    40 41   private final String firstValue;
    41 42  
    42  - private final ObjectId firstCommitId;
    43  -
    44 43   private final int secondType;
    45 44  
    46 45   private final String secondValue;
    47 46  
    48  - private final ObjectId secondCommitId;
     47 + private transient ProjectAndCommitIds projectAndCommitIds;
    49 48  
    50 49   public FixedBetweenCriteria(@Nullable Project project, int firstType, String firstValue,
    51 50   int secondType, String secondValue) {
     51 + this.project = project;
    52 52   this.firstType = firstType;
    53 53   this.firstValue = firstValue;
    54 54   this.secondType = secondType;
    55 55   this.secondValue = secondValue;
     56 + }
    56 57  
    57  - ProjectScopedCommit first = getCommitId(project, firstType, firstValue);
    58  - ProjectScopedCommit second = getCommitId(project, secondType, secondValue);
    59  - firstCommitId = first.getCommitId();
    60  - secondCommitId = second.getCommitId();
    61  - if (first.getProject().equals(second.getProject())) {
    62  - this.project = first.getProject();
    63  - } else {
    64  - throw new ExplicitException("'" + getRuleName(IssueQueryLexer.FixedBetween)
    65  - + "' should be used for same projects");
     58 + private ProjectAndCommitIds getProjectAndCommitIds() {
     59 + if (projectAndCommitIds == null) {
     60 + ProjectScopedCommit first = getCommitId(project, firstType, firstValue);
     61 + ProjectScopedCommit second = getCommitId(project, secondType, secondValue);
     62 + if (first.getProject().equals(second.getProject())) {
     63 + projectAndCommitIds = new ProjectAndCommitIds(
     64 + first.getProject(), first.getCommitId(), second.getCommitId());
     65 + } else {
     66 + throw new ExplicitException("'" + getRuleName(IssueQueryLexer.FixedBetween)
     67 + + "' should be used for same projects");
     68 + }
    66 69   }
     70 + return projectAndCommitIds;
    67 71   }
    68 72  
    69 73   private static ProjectScopedCommit getCommitId(@Nullable Project project, int type, String value) {
    skipped 9 lines
    79 83   public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    80 84   Set<Long> fixedIssueNumbers = new HashSet<>();
    81 85  
    82  - Repository repository = project.getRepository();
     86 + Project project = getProjectAndCommitIds().project;
     87 + ObjectId firstCommitId = getProjectAndCommitIds().firstCommitId;
     88 + ObjectId secondCommitId = getProjectAndCommitIds().secondCommitId;
     89 + Repository repository = getProjectAndCommitIds().project.getRepository();
    83 90   ObjectId mergeBaseId = GitUtils.getMergeBase(repository, firstCommitId, secondCommitId);
    84 91   if (mergeBaseId != null) {
    85 92   try (RevWalk revWalk = new RevWalk(repository)) {
    skipped 26 lines
    112 119   
    113 120   @Override
    114 121   public boolean matches(Issue issue) {
     122 + Project project = getProjectAndCommitIds().project;
     123 + ObjectId firstCommitId = getProjectAndCommitIds().firstCommitId;
     124 + ObjectId secondCommitId = getProjectAndCommitIds().secondCommitId;
    115 125   if (project.equals(issue.getProject())) {
    116 126   Repository repository = issue.getProject().getRepository();
    117 127   ObjectId mergeBaseId = GitUtils.getMergeBase(repository, firstCommitId, secondCommitId);
    skipped 25 lines
    143 153   + getRuleName(secondType) + " " + quote(secondValue);
    144 154   }
    145 155   
     156 + private static class ProjectAndCommitIds {
     157 +
     158 + final Project project;
     159 +
     160 + final ObjectId firstCommitId;
     161 +
     162 + final ObjectId secondCommitId;
     163 +
     164 + ProjectAndCommitIds(Project project, ObjectId firstCommitId, ObjectId secondCommitId) {
     165 + this.project = project;
     166 + this.firstCommitId = firstCommitId;
     167 + this.secondCommitId = secondCommitId;
     168 + }
     169 +
     170 + }
    146 171  }
    147 172   
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInBuildCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.Issue;
    13 13  import io.onedev.server.model.Project;
    14 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    15 16   
    16  -public class FixedInBuildCriteria extends IssueCriteria {
     17 +public class FixedInBuildCriteria extends Criteria<Issue> {
    17 18   
    18 19   private static final long serialVersionUID = 1L;
    19 20   
    20  - private final Build build;
     21 + private final Project project;
    21 22  
    22 23   private final String value;
    23 24  
     25 + private transient Build build;
     26 +
    24 27   public FixedInBuildCriteria(@Nullable Project project, String value) {
    25  - build = EntityQuery.getBuild(project, value);
     28 + this.project = project;
    26 29   this.value = value;
    27 30   }
    28 31   
    29 32   public FixedInBuildCriteria(Build build) {
    30 33   this.build = build;
     34 + project = build.getProject();
    31 35   value = build.getFQN().toString();
    32 36   }
    33 37  
     38 + private Build getBuild() {
     39 + if (build == null)
     40 + build = EntityQuery.getBuild(project, value);
     41 + return build;
     42 + }
     43 +
    34 44   @Override
    35 45   public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    36  - Collection<Long> fixedIssueNumbers = build.getFixedIssueNumbers();
     46 + Collection<Long> fixedIssueNumbers = getBuild().getFixedIssueNumbers();
    37 47   if (!fixedIssueNumbers.isEmpty()) {
    38 48   return builder.and(
    39  - builder.equal(from.get(Issue.PROP_PROJECT), build.getProject()),
     49 + builder.equal(from.get(Issue.PROP_PROJECT), getBuild().getProject()),
    40 50   from.get(Issue.PROP_NUMBER).in(fixedIssueNumbers));
    41 51   } else {
    42 52   return builder.disjunction();
    skipped 2 lines
    45 55   
    46 56   @Override
    47 57   public boolean matches(Issue issue) {
    48  - return issue.getProject().equals(build.getProject())
    49  - && build.getFixedIssueNumbers().contains(issue.getNumber());
     58 + return issue.getProject().equals(getBuild().getProject())
     59 + && getBuild().getFixedIssueNumbers().contains(issue.getNumber());
    50 60   }
    51 61   
    52 62   @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInCommitCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.model.Project;
    11 11  import io.onedev.server.search.entity.EntityQuery;
    12 12  import io.onedev.server.util.ProjectScopedCommit;
     13 +import io.onedev.server.util.criteria.Criteria;
    13 14   
    14  -public class FixedInCommitCriteria extends IssueCriteria {
     15 +public class FixedInCommitCriteria extends Criteria<Issue> {
    15 16   
    16 17   private static final long serialVersionUID = 1L;
    17 18   
    18  - private final ProjectScopedCommit commit;
     19 + private final Project project;
    19 20  
    20 21   private final String value;
     22 +
     23 + private transient ProjectScopedCommit commit;
    21 24  
    22 25   public FixedInCommitCriteria(@Nullable Project project, String value) {
    23  - commit = EntityQuery.getCommitId(project, value);
     26 + this.project = project;
    24 27   this.value = value;
    25 28   }
    26 29   
    27 30   public FixedInCommitCriteria(ProjectScopedCommit commit) {
    28 31   this.commit = commit;
    29  - value = commit.getCommitId().name();
     32 + project = commit.getProject();
     33 + value = project.getPath() + ":" + commit.toString();
     34 + }
     35 +
     36 + private ProjectScopedCommit getCommit() {
     37 + if (commit == null)
     38 + commit = EntityQuery.getCommitId(project, value);
     39 + return commit;
    30 40   }
    31 41  
    32 42   @Override
    33 43   public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    34  - if (!commit.getFixedIssueNumbers().isEmpty()) {
     44 + if (!getCommit().getFixedIssueNumbers().isEmpty()) {
    35 45   return builder.and(
    36  - builder.equal(from.get(Issue.PROP_PROJECT), commit.getProject()),
    37  - from.get(Issue.PROP_NUMBER).in(commit.getFixedIssueNumbers()));
     46 + builder.equal(from.get(Issue.PROP_PROJECT), getCommit().getProject()),
     47 + from.get(Issue.PROP_NUMBER).in(getCommit().getFixedIssueNumbers()));
    38 48   } else {
    39 49   return builder.disjunction();
    40 50   }
    skipped 1 lines
    42 52   
    43 53   @Override
    44 54   public boolean matches(Issue issue) {
    45  - return issue.getProject().equals(commit.getProject())
    46  - && commit.getFixedIssueNumbers().contains(issue.getNumber());
     55 + return issue.getProject().equals(getCommit().getProject())
     56 + && getCommit().getFixedIssueNumbers().contains(issue.getNumber());
    47 57   }
    48 58   
    49 59   @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInCurrentBuildCriteria.java
    skipped 7 lines
    8 8  import io.onedev.commons.utils.ExplicitException;
    9 9  import io.onedev.server.model.Build;
    10 10  import io.onedev.server.model.Issue;
     11 +import io.onedev.server.util.criteria.Criteria;
    11 12   
    12  -public class FixedInCurrentBuildCriteria extends IssueCriteria {
     13 +public class FixedInCurrentBuildCriteria extends Criteria<Issue> {
    13 14   
    14 15   private static final long serialVersionUID = 1L;
    15 16  
    skipped 23 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInCurrentCommitCriteria.java
    skipped 7 lines
    8 8  import io.onedev.commons.utils.ExplicitException;
    9 9  import io.onedev.server.model.Issue;
    10 10  import io.onedev.server.util.ProjectScopedCommit;
     11 +import io.onedev.server.util.criteria.Criteria;
    11 12   
    12  -public class FixedInCurrentCommitCriteria extends IssueCriteria {
     13 +public class FixedInCurrentCommitCriteria extends Criteria<Issue> {
    13 14   
    14 15   private static final long serialVersionUID = 1L;
    15 16  
    skipped 23 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInCurrentPullRequestCriteria.java
    skipped 7 lines
    8 8  import io.onedev.commons.utils.ExplicitException;
    9 9  import io.onedev.server.model.Issue;
    10 10  import io.onedev.server.model.PullRequest;
     11 +import io.onedev.server.util.criteria.Criteria;
    11 12   
    12  -public class FixedInCurrentPullRequestCriteria extends IssueCriteria {
     13 +public class FixedInCurrentPullRequestCriteria extends Criteria<Issue> {
    13 14   
    14 15   private static final long serialVersionUID = 1L;
    15 16  
    skipped 23 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/FixedInPullRequestCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.Project;
    13 13  import io.onedev.server.model.PullRequest;
    14 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    15 16   
    16  -public class FixedInPullRequestCriteria extends IssueCriteria {
     17 +public class FixedInPullRequestCriteria extends Criteria<Issue> {
    17 18   
    18 19   private static final long serialVersionUID = 1L;
    19 20   
    20  - private final PullRequest request;
     21 + private final Project project;
    21 22  
    22 23   private final String value;
    23 24  
     25 + private transient PullRequest request;
     26 +
    24 27   public FixedInPullRequestCriteria(@Nullable Project project, String value) {
    25  - request = EntityQuery.getPullRequest(project, value);
     28 + this.project = project;
    26 29   this.value = value;
    27 30   }
    28 31   
    29 32   public FixedInPullRequestCriteria(PullRequest request) {
    30 33   this.request = request;
     34 + project = request.getProject();
    31 35   value = request.getFQN().toString();
    32 36   }
    33 37  
     38 + public PullRequest getRequest() {
     39 + if (request == null)
     40 + request = EntityQuery.getPullRequest(project, value);
     41 + return request;
     42 + }
     43 +
    34 44   @Override
    35 45   public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    36  - Collection<Long> fixedIssueNumbers = request.getFixedIssueNumbers();
     46 + Collection<Long> fixedIssueNumbers = getRequest().getFixedIssueNumbers();
    37 47   if (!fixedIssueNumbers.isEmpty()) {
    38 48   return builder.and(
    39  - builder.equal(from.get(Issue.PROP_PROJECT), request.getTargetProject()),
     49 + builder.equal(from.get(Issue.PROP_PROJECT), getRequest().getTargetProject()),
    40 50   from.get(Issue.PROP_NUMBER).in(fixedIssueNumbers));
    41 51   } else {
    42 52   return builder.disjunction();
    skipped 2 lines
    45 55   
    46 56   @Override
    47 57   public boolean matches(Issue issue) {
    48  - return issue.getProject().equals(request.getTargetProject())
    49  - && request.getFixedIssueNumbers().contains(issue.getNumber());
     58 + return issue.getProject().equals(getRequest().getTargetProject())
     59 + && getRequest().getFixedIssueNumbers().contains(issue.getNumber());
    50 60   }
    51 61   
    52 62   @Override
    skipped 6 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/HasLinkCriteria.java
    skipped 12 lines
    13 13  import io.onedev.server.model.Issue;
    14 14  import io.onedev.server.model.IssueLink;
    15 15  import io.onedev.server.model.LinkSpec;
     16 +import io.onedev.server.util.LinkSide;
     17 +import io.onedev.server.util.criteria.Criteria;
    16 18   
    17  -public class HasLinkCriteria extends IssueCriteria {
     19 +public class HasLinkCriteria extends Criteria<Issue> {
    18 20   
    19 21   private static final long serialVersionUID = 1L;
    20 22  
    21  - private final LinkSpec linkSpec;
     23 + private String linkName;
    22 24  
    23  - private final boolean opposite;
     25 + private transient LinkSide linkSide;
    24 26  
    25  - public HasLinkCriteria(LinkSpec linkSpec, boolean opposite) {
    26  - this.linkSpec = linkSpec;
    27  - this.opposite = opposite;
     27 + public HasLinkCriteria(String linkName) {
     28 + this.linkName = linkName;
     29 + }
     30 +
     31 + public HasLinkCriteria(LinkSide linkSide) {
     32 + linkName = linkSide.getName();
     33 + this.linkSide = linkSide;
    28 34   }
    29 35  
    30 36   @Override
    skipped 3 lines
    34 40   linkQuery.select(linkRoot);
    35 41  
    36 42   List<Predicate> predicates = new ArrayList<>();
    37  - predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SPEC), linkSpec));
     43 + predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SPEC), getLinkSide().getSpec()));
    38 44  
    39  - if (opposite) {
     45 + if (getLinkSide().isOpposite()) {
    40 46   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_TARGET), from));
    41  - } else if (linkSpec.getOpposite() != null) {
     47 + } else if (getLinkSide().getSpec().getOpposite() != null) {
    42 48   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SOURCE), from));
    43 49   } else {
    44 50   predicates.add(builder.or(
    skipped 5 lines
    50 56   return builder.exists(linkQuery.where(builder.and(predicates.toArray(new Predicate[0]))));
    51 57   }
    52 58   
     59 + private LinkSide getLinkSide() {
     60 + if (linkSide == null)
     61 + linkSide = new LinkSide(linkName);
     62 + return linkSide;
     63 + }
     64 +
    53 65   @Override
    54 66   public boolean matches(Issue issue) {
    55  - if (opposite)
    56  - return issue.getSourceLinks().stream().anyMatch(it->it.getSpec().equals(linkSpec));
    57  - else if (linkSpec.getOpposite() != null)
    58  - return issue.getTargetLinks().stream().anyMatch(it->it.getSpec().equals(linkSpec));
     67 + LinkSpec spec = getLinkSide().getSpec();
     68 + if (getLinkSide().isOpposite())
     69 + return issue.getSourceLinks().stream().anyMatch(it->it.getSpec().equals(spec));
     70 + else if (spec.getOpposite() != null)
     71 + return issue.getTargetLinks().stream().anyMatch(it->it.getSpec().equals(spec));
    59 72   else
    60  - return issue.getLinks().stream().anyMatch(it->it.getSpec().equals(linkSpec));
     73 + return issue.getLinks().stream().anyMatch(it->it.getSpec().equals(spec));
     74 + }
     75 +
     76 + @Override
     77 + public void onRenameLink(String oldName, String newName) {
     78 + if (linkName.equals(oldName)) {
     79 + linkName = newName;
     80 + linkSide = null;
     81 + }
     82 + }
     83 + 
     84 + @Override
     85 + public boolean isUsingLink(String linkName) {
     86 + return this.linkName.equals(linkName);
    61 87   }
    62 88   
    63 89   @Override
    64 90   public String toStringWithoutParens() {
    65  - return IssueQuery.getRuleName(IssueQueryLexer.HasAny) + " " + quote(linkSpec.getName(opposite));
     91 + return IssueQuery.getRuleName(IssueQueryLexer.HasAny) + " " + quote(linkName);
    66 92   }
    67 93   
    68 94  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/IssueCriteria.java
    1  -package io.onedev.server.search.entity.issue;
    2  - 
    3  -import java.util.Collection;
    4  -import java.util.HashSet;
    5  -import java.util.List;
    6  -import java.util.Map;
    7  - 
    8  -import javax.annotation.Nullable;
    9  - 
    10  -import io.onedev.server.model.Issue;
    11  -import io.onedev.server.search.entity.EntityCriteria;
    12  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    13  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    14  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    15  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    16  - 
    17  -public abstract class IssueCriteria extends EntityCriteria<Issue> {
    18  -
    19  - private static final long serialVersionUID = 1L;
    20  -
    21  - public void fill(Issue issue) {
    22  - }
    23  -
    24  - public Collection<String> getUndefinedStates() {
    25  - return new HashSet<>();
    26  - }
    27  - 
    28  - public Collection<String> getUndefinedFields() {
    29  - return new HashSet<>();
    30  - }
    31  -
    32  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    33  - return new HashSet<>();
    34  - }
    35  - 
    36  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    37  - return true;
    38  - }
    39  -
    40  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    41  - return true;
    42  - }
    43  -
    44  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    45  - return true;
    46  - }
    47  -
    48  - @Nullable
    49  - public static IssueCriteria and(List<IssueCriteria> criterias) {
    50  - if (criterias.size() > 1)
    51  - return new AndIssueCriteria(criterias);
    52  - else if (criterias.size() == 1)
    53  - return criterias.iterator().next();
    54  - else
    55  - return null;
    56  - }
    57  - 
    58  - @Nullable
    59  - public static IssueCriteria or(List<IssueCriteria> criterias) {
    60  - if (criterias.size() > 1)
    61  - return new OrIssueCriteria(criterias);
    62  - else if (criterias.size() == 1)
    63  - return criterias.iterator().next();
    64  - else
    65  - return null;
    66  - }
    67  -
    68  -}
    69  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/IssueFieldCriteria.java
    skipped 15 lines
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    19  - private final Issue issue;
     19 + private final Project project;
    20 20  
    21 21   private final String value;
    22 22  
     23 + private transient Issue issue;
     24 +
    23 25   public IssueFieldCriteria(String name, @Nullable Project project, String value) {
    24 26   super(name);
    25  - issue = EntityQuery.getIssue(project, value);
     27 + this.project = project;
    26 28   this.value = value;
    27 29   }
    28 30  
     31 + private Issue getIssue() {
     32 + if (issue == null)
     33 + issue = EntityQuery.getIssue(project, value);
     34 + return issue;
     35 + }
     36 + 
    29 37   @Override
    30 38   protected Predicate getValuePredicate(From<Issue, Issue> issueFrom, From<IssueField, IssueField> fieldFrom,
    31 39   CriteriaBuilder builder) {
    32  - return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), IssueFieldCriteria.this.issue.getId());
     40 + return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), getIssue().getId());
    33 41   }
    34 42   
    35 43   @Override
    36 44   public boolean matches(Issue issue) {
    37 45   Object fieldValue = issue.getFieldValue(getFieldName());
    38  - return issue.getProject().equals(this.issue.getProject()) && Objects.equals(fieldValue, this.issue.getNumber());
     46 + return issue.getProject().equals(getIssue().getProject()) && Objects.equals(fieldValue, getIssue().getId());
    39 47   }
    40 48   
    41 49   @Override
    42 50   public void fill(Issue issue) {
    43  - issue.setFieldValue(getFieldName(), this.issue.getNumber());
     51 + issue.setFieldValue(getFieldName(), getIssue().getId());
    44 52   }
    45 53  
    46 54   @Override
    skipped 8 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/IssueQuery.java
    skipped 2 lines
    3 3  import java.util.ArrayList;
    4 4  import java.util.Collection;
    5 5  import java.util.HashSet;
     6 +import java.util.Iterator;
    6 7  import java.util.List;
    7 8  import java.util.Map;
    8 9  import java.util.Set;
    skipped 14 lines
    23 24  import io.onedev.server.entitymanager.SettingManager;
    24 25  import io.onedev.server.model.Issue;
    25 26  import io.onedev.server.model.IssueSchedule;
    26  -import io.onedev.server.model.LinkSpec;
    27 27  import io.onedev.server.model.Project;
    28 28  import io.onedev.server.model.support.administration.GlobalIssueSetting;
    29 29  import io.onedev.server.model.support.issue.field.spec.BooleanField;
    skipped 25 lines
    55 55  import io.onedev.server.search.entity.issue.IssueQueryParser.ParensCriteriaContext;
    56 56  import io.onedev.server.search.entity.issue.IssueQueryParser.QueryContext;
    57 57  import io.onedev.server.search.entity.issue.IssueQueryParser.RevisionCriteriaContext;
     58 +import io.onedev.server.util.criteria.AndCriteria;
     59 +import io.onedev.server.util.criteria.Criteria;
     60 +import io.onedev.server.util.criteria.NotCriteria;
     61 +import io.onedev.server.util.criteria.OrCriteria;
    58 62  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
     63 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution.FixType;
    59 64  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    60 65  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    61 66  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    skipped 4 lines
    66 71   
    67 72   private static final long serialVersionUID = 1L;
    68 73   
    69  - private final IssueCriteria criteria;
     74 + private final Criteria<Issue> criteria;
    70 75  
    71 76   private final List<EntitySort> sorts;
    72 77  
    73  - public IssueQuery(@Nullable IssueCriteria criteria, List<EntitySort> sorts) {
     78 + public IssueQuery(@Nullable Criteria<Issue> criteria, List<EntitySort> sorts) {
    74 79   this.criteria = criteria;
    75 80   this.sorts = sorts;
    76 81   }
    77 82   
    78  - public IssueQuery(@Nullable IssueCriteria criteria) {
     83 + public IssueQuery(@Nullable Criteria<Issue> criteria) {
    79 84   this(criteria, new ArrayList<>());
    80 85   }
    81 86  
    skipped 2 lines
    84 89   }
    85 90  
    86 91   @Nullable
    87  - public IssueCriteria getCriteria() {
     92 + public Criteria<Issue> getCriteria() {
    88 93   return criteria;
    89 94   }
    90 95   
    skipped 2 lines
    93 98   }
    94 99   
    95 100   public static IssueQuery parse(@Nullable Project project, @Nullable String queryString,
    96  - boolean validate, boolean withCurrentUserCriteria, boolean withCurrentBuildCriteria,
    97  - boolean withCurrentPullRequestCriteria, boolean withCurrentCommitCriteria,
    98  - boolean withCurrentIssueCriteria) {
     101 + IssueQueryParseOption option, boolean validate) {
    99 102   if (queryString != null) {
    100 103   CharStream is = CharStreams.fromString(queryString);
    101 104   IssueQueryLexer lexer = new IssueQueryLexer(is);
    skipped 14 lines
    116 119  
    117 120   QueryContext queryContext = parser.query();
    118 121   CriteriaContext criteriaContext = queryContext.criteria();
    119  - IssueCriteria issueCriteria;
     122 + Criteria<Issue> issueCriteria;
    120 123   if (criteriaContext != null) {
    121  - issueCriteria = new IssueQueryBaseVisitor<IssueCriteria>() {
     124 + issueCriteria = new IssueQueryBaseVisitor<Criteria<Issue>>() {
    122 125   
    123 126   private long getValueOrdinal(ChoiceField field, String value) {
    124 127   List<String> choices = new ArrayList<>(field.getChoiceProvider().getChoices(true).keySet());
    skipped 1 lines
    126 129   }
    127 130  
    128 131   @Override
    129  - public IssueCriteria visitOperatorCriteria(OperatorCriteriaContext ctx) {
     132 + public Criteria<Issue> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    130 133   switch (ctx.operator.getType()) {
    131 134   case IssueQueryLexer.SubmittedByMe:
    132  - if (!withCurrentUserCriteria)
     135 + if (!option.withCurrentUserCriteria())
    133 136   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    134 137   return new SubmittedByMeCriteria();
    135 138   case IssueQueryLexer.FixedInCurrentBuild:
    136  - if (!withCurrentBuildCriteria)
     139 + if (!option.withCurrentBuildCriteria())
    137 140   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    138 141   return new FixedInCurrentBuildCriteria();
    139 142   case IssueQueryLexer.FixedInCurrentPullRequest:
    140  - if (!withCurrentPullRequestCriteria)
     143 + if (!option.withCurrentPullRequestCriteria())
    141 144   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    142 145   return new FixedInCurrentPullRequestCriteria();
    143 146   case IssueQueryLexer.FixedInCurrentCommit:
    144  - if (!withCurrentCommitCriteria)
     147 + if (!option.withCurrentCommitCriteria())
    145 148   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    146 149   return new FixedInCurrentCommitCriteria();
    147 150   case IssueQueryLexer.CurrentIssue:
    148  - if (!withCurrentIssueCriteria)
     151 + if (!option.withCurrentIssueCriteria())
    149 152   throw new ExplicitException("Criteria '" + ctx.operator.getText() + "' is not supported here");
    150 153   return new CurrentIssueCriteria();
    151 154   default:
    skipped 2 lines
    154 157   }
    155 158  
    156 159   @Override
    157  - public IssueCriteria visitFieldOperatorCriteria(FieldOperatorCriteriaContext ctx) {
     160 + public Criteria<Issue> visitFieldOperatorCriteria(FieldOperatorCriteriaContext ctx) {
    158 161   String fieldName = getValue(ctx.Quoted().getText());
    159 162   int operator = ctx.operator.getType();
    160  - if (validate) {
    161  - checkField(fieldName, operator, withCurrentUserCriteria, withCurrentBuildCriteria,
    162  - withCurrentPullRequestCriteria, withCurrentCommitCriteria, withCurrentIssueCriteria);
    163  - }
     163 + if (validate)
     164 + checkField(fieldName, operator, option);
    164 165   if (fieldName.equals(IssueSchedule.NAME_MILESTONE)) {
    165 166   return new MilestoneIsEmptyCriteria();
    166 167   } else {
    skipped 6 lines
    173 174   }
    174 175  
    175 176   @Override
    176  - public IssueCriteria visitLinkMatchCriteria(LinkMatchCriteriaContext ctx) {
     177 + public Criteria<Issue> visitLinkMatchCriteria(LinkMatchCriteriaContext ctx) {
    177 178   String linkName = getValue(ctx.Quoted().getText());
    178  - LinkSpec linkSpec = getLinkSpec(linkName);
    179  - boolean opposite = !linkName.equals(linkSpec.getName());
    180 179   boolean allMatch = ctx.All() != null;
    181  - IssueCriteria criteria = visit(ctx.criteria());
    182  - return new LinkMatchCriteria(linkSpec, opposite, criteria, allMatch);
     180 + Criteria<Issue> criteria = visit(ctx.criteria());
     181 + return new LinkMatchCriteria(linkName, criteria, allMatch);
    183 182   }
    184 183  
    185  - public IssueCriteria visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     184 + public Criteria<Issue> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    186 185   String value = getValue(ctx.Quoted().getText());
    187  - if (ctx.SubmittedBy() != null) {
     186 + if (ctx.SubmittedBy() != null)
    188 187   return new SubmittedByCriteria(getUser(value));
    189  - } else if (ctx.FixedInBuild() != null) {
     188 + else if (ctx.FixedInBuild() != null)
    190 189   return new FixedInBuildCriteria(project, value);
    191  - } else if (ctx.FixedInPullRequest() != null) {
     190 + else if (ctx.FixedInPullRequest() != null)
    192 191   return new FixedInPullRequestCriteria(project, value);
    193  - } else if (ctx.FixedInCommit() != null) {
     192 + else if (ctx.FixedInCommit() != null)
    194 193   return new FixedInCommitCriteria(project, value);
    195  - } else if (ctx.HasAny() != null) {
    196  - LinkSpec linkSpec = getLinkSpec(value);
    197  - return new HasLinkCriteria(linkSpec, !value.equals(linkSpec.getName()));
    198  - } else {
     194 + else if (ctx.HasAny() != null)
     195 + return new HasLinkCriteria(value);
     196 + else
    199 197   throw new RuntimeException("Unexpected operator: " + ctx.operator.getText());
    200  - }
    201 198   }
    202 199  
    203 200   @Override
    204  - public IssueCriteria visitFixedBetweenCriteria(FixedBetweenCriteriaContext ctx) {
     201 + public Criteria<Issue> visitFixedBetweenCriteria(FixedBetweenCriteriaContext ctx) {
    205 202   RevisionCriteriaContext firstRevision = ctx.revisionCriteria(0);
    206 203   int firstType = firstRevision.revisionType.getType();
    207 204   String firstValue = getValue(firstRevision.Quoted().getText());
    skipped 6 lines
    214 211   }
    215 212  
    216 213   @Override
    217  - public IssueCriteria visitParensCriteria(ParensCriteriaContext ctx) {
    218  - return (IssueCriteria) visit(ctx.criteria()).withParens(true);
     214 + public Criteria<Issue> visitParensCriteria(ParensCriteriaContext ctx) {
     215 + return (Criteria<Issue>) visit(ctx.criteria()).withParens(true);
    219 216   }
    220 217   
    221 218   @Override
    222  - public IssueCriteria visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     219 + public Criteria<Issue> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    223 220   String fieldName = getValue(ctx.Quoted(0).getText());
    224 221   String value = getValue(ctx.Quoted(1).getText());
    225 222   int operator = ctx.operator.getType();
    226  - if (validate) {
    227  - checkField(fieldName, operator, withCurrentUserCriteria, withCurrentBuildCriteria,
    228  - withCurrentPullRequestCriteria, withCurrentCommitCriteria, withCurrentIssueCriteria);
    229  - }
     223 + if (validate)
     224 + checkField(fieldName, operator, option);
    230 225  
    231 226   switch (operator) {
    232 227   case IssueQueryLexer.IsUntil:
    skipped 76 lines
    309 304   }
    310 305  
    311 306   @Override
    312  - public IssueCriteria visitOrCriteria(OrCriteriaContext ctx) {
    313  - List<IssueCriteria> childCriterias = new ArrayList<>();
     307 + public Criteria<Issue> visitOrCriteria(OrCriteriaContext ctx) {
     308 + List<Criteria<Issue>> childCriterias = new ArrayList<>();
    314 309   for (CriteriaContext childCtx: ctx.criteria())
    315 310   childCriterias.add(visit(childCtx));
    316  - return new OrIssueCriteria(childCriterias);
     311 + return new OrCriteria<Issue>(childCriterias);
    317 312   }
    318 313   
    319 314   @Override
    320  - public IssueCriteria visitAndCriteria(AndCriteriaContext ctx) {
    321  - List<IssueCriteria> childCriterias = new ArrayList<>();
     315 + public Criteria<Issue> visitAndCriteria(AndCriteriaContext ctx) {
     316 + List<Criteria<Issue>> childCriterias = new ArrayList<>();
    322 317   for (CriteriaContext childCtx: ctx.criteria())
    323 318   childCriterias.add(visit(childCtx));
    324  - return new AndIssueCriteria(childCriterias);
     319 + return new AndCriteria<Issue>(childCriterias);
    325 320   }
    326 321   
    327 322   @Override
    328  - public IssueCriteria visitNotCriteria(NotCriteriaContext ctx) {
    329  - return new NotIssueCriteria(visit(ctx.criteria()));
     323 + public Criteria<Issue> visitNotCriteria(NotCriteriaContext ctx) {
     324 + return new NotCriteria<Issue>(visit(ctx.criteria()));
    330 325   }
    331 326  
    332 327   }.visit(criteriaContext);
    skipped 38 lines
    371 366   return new ExplicitException("Field '" + fieldName + "' is not applicable for operator '" + getRuleName(operator) + "'");
    372 367   }
    373 368  
    374  - public static void checkField(String fieldName, int operator,
    375  - boolean withCurrentUserCriteria, boolean withCurrentBuildCriteria,
    376  - boolean withCurrentPullRequestCriteria, boolean withCurrentCommitCriteria,
    377  - boolean withCurrentIssueCriteria) {
     369 + public static void checkField(String fieldName, int operator, IssueQueryParseOption option) {
    378 370   FieldSpec fieldSpec = getGlobalIssueSetting().getFieldSpec(fieldName);
    379 371   if (fieldSpec == null && !Issue.QUERY_FIELDS.contains(fieldName))
    380 372   throw new ExplicitException("Field not found: " + fieldName);
    skipped 5 lines
    386 378   }
    387 379   break;
    388 380   case IssueQueryLexer.IsMe:
    389  - if (!(fieldSpec instanceof UserChoiceField && withCurrentUserCriteria))
     381 + if (!(fieldSpec instanceof UserChoiceField && option.withCurrentUserCriteria()))
    390 382   throw newOperatorException(fieldName, operator);
    391 383   break;
    392 384   case IssueQueryLexer.IsCurrent:
    393  - if (!(fieldSpec instanceof BuildChoiceField && withCurrentBuildCriteria
    394  - || fieldSpec instanceof PullRequestChoiceField && withCurrentPullRequestCriteria)
    395  - || fieldSpec instanceof CommitField && withCurrentCommitCriteria)
     385 + if (!(fieldSpec instanceof BuildChoiceField && option.withCurrentBuildCriteria()
     386 + || fieldSpec instanceof PullRequestChoiceField && option.withCurrentPullRequestCriteria())
     387 + || fieldSpec instanceof CommitField && option.withCurrentCommitCriteria())
    396 388   throw newOperatorException(fieldName, operator);
    397 389   break;
    398 390   case IssueQueryLexer.IsPrevious:
    399  - if (!(fieldSpec instanceof BuildChoiceField && withCurrentBuildCriteria))
     391 + if (!(fieldSpec instanceof BuildChoiceField && option.withCurrentBuildCriteria()))
    400 392   throw newOperatorException(fieldName, operator);
    401 393   break;
    402 394   case IssueQueryLexer.IsUntil:
    skipped 57 lines
    460 452   return AntlrUtils.getLexerRule(IssueQueryLexer.ruleNames, operatorName);
    461 453   }
    462 454  
     455 + public IssueQuery onRenameLink(String oldName, String newName) {
     456 + if (getCriteria() != null)
     457 + getCriteria().onRenameLink(oldName, newName);
     458 + return this;
     459 + }
     460 +
     461 + public boolean isUsingLink(String linkName) {
     462 + if (getCriteria() != null)
     463 + return getCriteria().isUsingLink(linkName);
     464 + else
     465 + return false;
     466 + }
     467 +
    463 468   public Collection<String> getUndefinedStates() {
    464 469   if (criteria != null)
    465 470   return criteria.getUndefinedStates();
    skipped 30 lines
    496 501   }
    497 502  
    498 503   public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    499  - if (criteria != null)
    500  - return criteria.fixUndefinedFields(resolutions);
    501  - else
    502  - return true;
     504 + if (criteria != null && !criteria.fixUndefinedFields(resolutions))
     505 + return false;
     506 + for (Iterator<EntitySort> it = sorts.iterator(); it.hasNext();) {
     507 + EntitySort sort = it.next();
     508 + UndefinedFieldResolution resolution = resolutions.get(sort.getField());
     509 + if (resolution != null) {
     510 + if (resolution.getFixType() == FixType.CHANGE_TO_ANOTHER_FIELD)
     511 + sort.setField(resolution.getNewField());
     512 + else
     513 + it.remove();
     514 + }
     515 + }
     516 + return true;
    503 517   }
    504 518  
    505 519   public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    skipped 4 lines
    510 524   }
    511 525  
    512 526   public static IssueQuery merge(IssueQuery query1, IssueQuery query2) {
    513  - List<IssueCriteria> criterias = new ArrayList<>();
     527 + List<Criteria<Issue>> criterias = new ArrayList<>();
    514 528   if (query1.getCriteria() != null)
    515 529   criterias.add(query1.getCriteria());
    516 530   if (query2.getCriteria() != null)
    skipped 1 lines
    518 532   List<EntitySort> sorts = new ArrayList<>();
    519 533   sorts.addAll(query1.getSorts());
    520 534   sorts.addAll(query2.getSorts());
    521  - return new IssueQuery(IssueCriteria.and(criterias), sorts);
     535 + return new IssueQuery(Criteria.andCriterias(criterias), sorts);
    522 536   }
    523 537  
    524 538  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/IssueQueryParseOption.java
     1 +package io.onedev.server.search.entity.issue;
     2 + 
     3 +import java.io.Serializable;
     4 + 
     5 +public class IssueQueryParseOption implements Serializable {
     6 + 
     7 + private static final long serialVersionUID = 1L;
     8 + 
     9 + private boolean withCurrentUserCriteria;
     10 +
     11 + private boolean withCurrentIssueCriteria;
     12 +
     13 + private boolean withCurrentBuildCriteria;
     14 +
     15 + private boolean withCurrentPullRequestCriteria;
     16 +
     17 + private boolean withCurrentCommitCriteria;
     18 +
     19 + private boolean withOrder = true;
     20 +
     21 + public boolean withCurrentUserCriteria() {
     22 + return withCurrentUserCriteria;
     23 + }
     24 + 
     25 + public IssueQueryParseOption withCurrentUserCriteria(boolean withCurrentUserCriteria) {
     26 + this.withCurrentUserCriteria = withCurrentUserCriteria;
     27 + return this;
     28 + }
     29 + 
     30 + public boolean withCurrentIssueCriteria() {
     31 + return withCurrentIssueCriteria;
     32 + }
     33 + 
     34 + public IssueQueryParseOption withCurrentIssueCriteria(boolean withCurrentIssueCriteria) {
     35 + this.withCurrentIssueCriteria = withCurrentIssueCriteria;
     36 + return this;
     37 + }
     38 + 
     39 + public boolean withCurrentBuildCriteria() {
     40 + return withCurrentBuildCriteria;
     41 + }
     42 + 
     43 + public IssueQueryParseOption withCurrentBuildCriteria(boolean withCurrentBuildCriteria) {
     44 + this.withCurrentBuildCriteria = withCurrentBuildCriteria;
     45 + return this;
     46 + }
     47 + 
     48 + public boolean withCurrentPullRequestCriteria() {
     49 + return withCurrentPullRequestCriteria;
     50 + }
     51 + 
     52 + public IssueQueryParseOption withCurrentPullRequestCriteria(boolean withCurrentPullRequestCriteria) {
     53 + this.withCurrentPullRequestCriteria = withCurrentPullRequestCriteria;
     54 + return this;
     55 + }
     56 + 
     57 + public boolean withCurrentCommitCriteria() {
     58 + return withCurrentCommitCriteria;
     59 + }
     60 + 
     61 + public IssueQueryParseOption withCurrentCommitCriteria(boolean withCurrentCommitCriteria) {
     62 + this.withCurrentCommitCriteria = withCurrentCommitCriteria;
     63 + return this;
     64 + }
     65 + 
     66 + public boolean withOrder() {
     67 + return withOrder;
     68 + }
     69 + 
     70 + public IssueQueryParseOption withOrder(boolean withOrder) {
     71 + this.withOrder = withOrder;
     72 + return this;
     73 + }
     74 + 
     75 + public IssueQueryParseOption enableAll(boolean enabled) {
     76 + withCurrentBuildCriteria = enabled;
     77 + withCurrentCommitCriteria = enabled;
     78 + withCurrentIssueCriteria = enabled;
     79 + withCurrentPullRequestCriteria = enabled;
     80 + withCurrentUserCriteria = enabled;
     81 + withOrder = enabled;
     82 + return this;
     83 + }
     84 +
     85 +}
     86 + 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/IssueQueryUpdater.java
     1 +package io.onedev.server.search.entity.issue;
     2 + 
     3 +import java.util.ArrayList;
     4 +import java.util.Collection;
     5 +import java.util.Map;
     6 + 
     7 +import javax.annotation.Nullable;
     8 + 
     9 +import io.onedev.server.util.usage.Usage;
     10 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
     11 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
     12 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
     13 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
     14 + 
     15 +public abstract class IssueQueryUpdater {
     16 + 
     17 + public void onRenameLink(String oldName, String newName) {
     18 + setIssueQuery(IssueQuery
     19 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     20 + .onRenameLink(oldName, newName)
     21 + .toString());
     22 + }
     23 + 
     24 + public Usage onDeleteLink(String linkName) {
     25 + if (IssueQuery
     26 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     27 + .isUsingLink(linkName)) {
     28 + return getUsage();
     29 + } else {
     30 + return new Usage();
     31 + }
     32 + }
     33 +
     34 + public void onMoveProject(String oldPath, String newPath) {
     35 + setIssueQuery(IssueQuery
     36 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     37 + .onMoveProject(oldPath, newPath)
     38 + .toString());
     39 + }
     40 + 
     41 + public Usage onDeleteProject(String projectPath) {
     42 + if (IssueQuery
     43 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     44 + .isUsingProject(projectPath)) {
     45 + return getUsage();
     46 + } else {
     47 + return new Usage();
     48 + }
     49 + }
     50 +
     51 + public Collection<String> getUndefinedStates() {
     52 + try {
     53 + return IssueQuery
     54 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     55 + .getUndefinedStates();
     56 + } catch (Exception e) {
     57 + return new ArrayList<>();
     58 + }
     59 + }
     60 +
     61 + public Collection<String> getUndefinedFields() {
     62 + try {
     63 + return IssueQuery
     64 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     65 + .getUndefinedFields();
     66 + } catch (Exception e) {
     67 + return new ArrayList<>();
     68 + }
     69 + }
     70 + 
     71 + public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
     72 + try {
     73 + return IssueQuery
     74 + .parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false)
     75 + .getUndefinedFieldValues();
     76 + } catch (Exception e) {
     77 + return new ArrayList<>();
     78 + }
     79 + }
     80 +
     81 + public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
     82 + try {
     83 + IssueQuery parsedQuery = IssueQuery.parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false);
     84 + if (parsedQuery.fixUndefinedStates(resolutions))
     85 + setIssueQuery(parsedQuery.toString());
     86 + else if (isAllowEmpty())
     87 + setIssueQuery(null);
     88 + else
     89 + return false;
     90 + } catch (Exception e) {
     91 + }
     92 + return true;
     93 + }
     94 + 
     95 + public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
     96 + try {
     97 + IssueQuery parsedQuery = IssueQuery.parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false);
     98 + if (parsedQuery.fixUndefinedFields(resolutions))
     99 + setIssueQuery(parsedQuery.toString());
     100 + else if (isAllowEmpty())
     101 + setIssueQuery(null);
     102 + else
     103 + return false;
     104 + } catch (Exception e) {
     105 + }
     106 + return true;
     107 + }
     108 +
     109 + public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
     110 + try {
     111 + IssueQuery parsedQuery = IssueQuery.parse(null, getIssueQuery(), new IssueQueryParseOption().enableAll(true), false);
     112 + if (parsedQuery.fixUndefinedFieldValues(resolutions))
     113 + setIssueQuery(parsedQuery.toString());
     114 + else if (isAllowEmpty())
     115 + setIssueQuery(null);
     116 + else
     117 + return false;
     118 + } catch (Exception e) {
     119 + }
     120 + return true;
     121 + }
     122 +
     123 + protected abstract Usage getUsage();
     124 +
     125 + protected abstract boolean isAllowEmpty();
     126 +
     127 + @Nullable
     128 + protected abstract String getIssueQuery();
     129 +
     130 + protected abstract void setIssueQuery(@Nullable String issueQuery);
     131 +
     132 +}
     133 + 
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/LinkMatchCriteria.java
    1 1  package io.onedev.server.search.entity.issue;
    2 2   
     3 +import static io.onedev.server.search.entity.issue.IssueQuery.getRuleName;
     4 +import static io.onedev.server.search.entity.issue.IssueQueryLexer.All;
     5 +import static io.onedev.server.search.entity.issue.IssueQueryLexer.Any;
     6 + 
    3 7  import java.util.ArrayList;
     8 +import java.util.Collection;
    4 9  import java.util.List;
     10 +import java.util.Map;
    5 11   
    6 12  import javax.persistence.criteria.CriteriaBuilder;
    7 13  import javax.persistence.criteria.CriteriaQuery;
    skipped 7 lines
    15 21  import io.onedev.server.model.Issue;
    16 22  import io.onedev.server.model.IssueLink;
    17 23  import io.onedev.server.model.LinkSpec;
     24 +import io.onedev.server.util.LinkSide;
     25 +import io.onedev.server.util.criteria.Criteria;
     26 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
     27 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
     28 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
     29 +import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    18 30   
    19  -public class LinkMatchCriteria extends IssueCriteria {
     31 +public class LinkMatchCriteria extends Criteria<Issue> {
    20 32   
    21 33   private static final long serialVersionUID = 1L;
    22 34  
    23  - private final LinkSpec linkSpec;
    24  -
    25  - private final boolean opposite;
     35 + private String linkName;
    26 36   
    27  - private final IssueCriteria criteria;
     37 + private final Criteria<Issue> criteria;
    28 38  
    29 39   private final boolean allMatch;
    30 40  
    31  - public LinkMatchCriteria(LinkSpec linkSpec, boolean opposite, IssueCriteria criteria, boolean allMatch) {
    32  - this.linkSpec = linkSpec;
    33  - this.opposite = opposite;
     41 + private transient LinkSide linkSide;
     42 +
     43 + public LinkMatchCriteria(String linkName, Criteria<Issue> criteria, boolean allMatch) {
     44 + this.linkName = linkName;
    34 45   this.criteria = criteria;
    35 46   this.allMatch = allMatch;
    36 47   }
    skipped 3 lines
    40 51   Subquery<IssueLink> linkQuery = query.subquery(IssueLink.class);
    41 52   Root<IssueLink> linkRoot = linkQuery.from(IssueLink.class);
    42 53   linkQuery.select(linkRoot);
     54 +
     55 + LinkSpec spec = getLinkSide().getSpec();
     56 + boolean opposite = getLinkSide().isOpposite();
    43 57  
    44 58   List<Predicate> predicates = new ArrayList<>();
    45  - predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SPEC), linkSpec));
     59 + predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SPEC), spec));
    46 60  
    47 61   if (allMatch) {
    48 62   if (opposite) {
    49 63   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_TARGET), from));
    50 64   Join<Issue, Issue> linkSourceJoin = linkRoot.join(IssueLink.PROP_SOURCE, JoinType.INNER);
    51 65   predicates.add(builder.not(criteria.getPredicate(query, linkSourceJoin, builder)));
    52  - } else if (linkSpec.getOpposite() != null) {
     66 + } else if (spec.getOpposite() != null) {
    53 67   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SOURCE), from));
    54 68   Join<Issue, Issue> linkTargetJoin = linkRoot.join(IssueLink.PROP_TARGET, JoinType.INNER);
    55 69   predicates.add(builder.not(criteria.getPredicate(query, linkTargetJoin, builder)));
    skipped 12 lines
    68 82   
    69 83   return builder.and(
    70 84   builder.not(builder.exists(linkQuery.where(builder.and(predicates.toArray(new Predicate[0]))))),
    71  - new HasLinkCriteria(linkSpec, opposite).getPredicate(query, from, builder));
     85 + new HasLinkCriteria(getLinkSide()).getPredicate(query, from, builder));
    72 86   } else {
    73 87   if (opposite) {
    74 88   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_TARGET), from));
    75 89   Join<Issue, Issue> linkSourceJoin = linkRoot.join(IssueLink.PROP_SOURCE, JoinType.INNER);
    76 90   predicates.add(criteria.getPredicate(query, linkSourceJoin, builder));
    77  - } else if (linkSpec.getOpposite() != null) {
     91 + } else if (spec.getOpposite() != null) {
    78 92   predicates.add(builder.equal(linkRoot.get(IssueLink.PROP_SOURCE), from));
    79 93   Join<Issue, Issue> linkTargetJoin = linkRoot.join(IssueLink.PROP_TARGET, JoinType.INNER);
    80 94   predicates.add(criteria.getPredicate(query, linkTargetJoin, builder));
    skipped 14 lines
    95 109   }
    96 110   }
    97 111  
     112 + private LinkSide getLinkSide() {
     113 + if (linkSide == null)
     114 + linkSide = new LinkSide(linkName);
     115 + return linkSide;
     116 + }
     117 + 
    98 118   @Override
    99 119   public boolean matches(Issue issue) {
    100  - if (allMatch) {
     120 + LinkSpec spec = getLinkSide().getSpec();
     121 + boolean opposite = getLinkSide().isOpposite();
     122 + if (allMatch) {
    101 123   if (opposite) {
    102 124   boolean hasLink = false;
    103 125   for (IssueLink link: issue.getSourceLinks()) {
    104  - if (link.getSpec().equals(linkSpec)) {
     126 + if (link.getSpec().equals(spec)) {
    105 127   hasLink = true;
    106 128   if (!criteria.matches(link.getSource()))
    107 129   return false;
    108 130   }
    109 131   }
    110 132   return hasLink;
    111  - } else if (linkSpec.getOpposite() != null) {
     133 + } else if (spec.getOpposite() != null) {
    112 134   boolean hasLink = false;
    113 135   for (IssueLink link: issue.getTargetLinks()) {
    114  - if (link.getSpec().equals(linkSpec)) {
     136 + if (link.getSpec().equals(spec)) {
    115 137   hasLink = true;
    116 138   if (!criteria.matches(link.getTarget()))
    117 139   return false;
    skipped 3 lines
    121 143   } else {
    122 144   boolean hasLink = false;
    123 145   for (IssueLink link: issue.getLinks()) {
    124  - if (link.getSpec().equals(linkSpec)) {
     146 + if (link.getSpec().equals(spec)) {
    125 147   hasLink = true;
    126 148   if (!criteria.matches(link.getLinked(issue)))
    127 149   return false;
    skipped 4 lines
    132 154   } else {
    133 155   if (opposite) {
    134 156   for (IssueLink link: issue.getSourceLinks()) {
    135  - if (link.getSpec().equals(linkSpec) && criteria.matches(link.getSource()))
     157 + if (link.getSpec().equals(spec) && criteria.matches(link.getSource()))
    136 158   return true;
    137 159   }
    138 160   return false;
    139  - } else if (linkSpec.getOpposite() != null) {
     161 + } else if (spec.getOpposite() != null) {
    140 162   for (IssueLink link: issue.getTargetLinks()) {
    141  - if (link.getSpec().equals(linkSpec) && criteria.matches(link.getTarget()))
     163 + if (link.getSpec().equals(spec) && criteria.matches(link.getTarget()))
    142 164   return true;
    143 165   }
    144 166   return false;
    145 167   } else {
    146 168   for (IssueLink link: issue.getLinks()) {
    147  - if (link.getSpec().equals(linkSpec) && criteria.matches(link.getLinked(issue)))
     169 + if (link.getSpec().equals(spec) && criteria.matches(link.getLinked(issue)))
    148 170   return true;
    149 171   }
    150 172   return false;
    skipped 2 lines
    153 175   }
    154 176  
    155 177   @Override
     178 + public void onRenameLink(String oldName, String newName) {
     179 + if (linkName.equals(oldName)) {
     180 + linkName = newName;
     181 + linkSide = null;
     182 + }
     183 + criteria.onRenameLink(oldName, newName);
     184 + }
     185 + 
     186 + @Override
     187 + public boolean isUsingLink(String linkName) {
     188 + if (this.linkName.equals(linkName))
     189 + return true;
     190 + else
     191 + return criteria.isUsingLink(linkName);
     192 + }
     193 +
     194 + @Override
     195 + public Collection<String> getUndefinedStates() {
     196 + return criteria.getUndefinedStates();
     197 + }
     198 + 
     199 + @Override
     200 + public Collection<String> getUndefinedFields() {
     201 + return criteria.getUndefinedFields();
     202 + }
     203 + 
     204 + @Override
     205 + public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
     206 + return criteria.getUndefinedFieldValues();
     207 + }
     208 + 
     209 + @Override
     210 + public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
     211 + return criteria.fixUndefinedStates(resolutions);
     212 + }
     213 + 
     214 + @Override
     215 + public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
     216 + return criteria.fixUndefinedFields(resolutions);
     217 + }
     218 + 
     219 + @Override
     220 + public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
     221 + return criteria.fixUndefinedFieldValues(resolutions);
     222 + }
     223 + 
     224 + @Override
    156 225   public String toStringWithoutParens() {
    157  - return allMatch?IssueQuery.getRuleName(IssueQueryLexer.All):IssueQuery.getRuleName(IssueQueryLexer.Any)
    158  - + quote(linkSpec.getName(opposite)) + " "
    159  - + IssueQuery.getRuleName(IssueQueryLexer.Matching)
     226 + return (allMatch?getRuleName(All):getRuleName(Any))
     227 + + " " + quote(linkName) + " "
     228 + + getRuleName(IssueQueryLexer.Matching)
    160 229   + "(" + criteria.toString() + ")";
    161 230   }
    162 231   
    skipped 2 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/MilestoneCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.Issue;
    13 13  import io.onedev.server.model.IssueSchedule;
    14 14  import io.onedev.server.model.Milestone;
     15 +import io.onedev.server.util.criteria.Criteria;
    15 16  import io.onedev.server.util.match.WildcardUtils;
    16 17   
    17  -public class MilestoneCriteria extends IssueCriteria {
     18 +public class MilestoneCriteria extends Criteria<Issue> {
    18 19   
    19 20   private static final long serialVersionUID = 1L;
    20 21  
    skipped 44 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/MilestoneIsEmptyCriteria.java
    skipped 6 lines
    7 7   
    8 8  import io.onedev.server.model.Issue;
    9 9  import io.onedev.server.model.IssueSchedule;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11   
    11  -public class MilestoneIsEmptyCriteria extends IssueCriteria {
     12 +public class MilestoneIsEmptyCriteria extends Criteria<Issue> {
    12 13   
    13 14   private static final long serialVersionUID = 1L;
    14 15  
    skipped 18 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/NotIssueCriteria.java
    1  -package io.onedev.server.search.entity.issue;
    2  - 
    3  -import java.util.Collection;
    4  -import java.util.Map;
    5  - 
    6  -import javax.persistence.criteria.CriteriaBuilder;
    7  -import javax.persistence.criteria.CriteriaQuery;
    8  -import javax.persistence.criteria.From;
    9  -import javax.persistence.criteria.Predicate;
    10  - 
    11  -import io.onedev.server.model.Issue;
    12  -import io.onedev.server.search.entity.NotEntityCriteria;
    13  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    14  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    15  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    16  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    17  - 
    18  -public class NotIssueCriteria extends IssueCriteria {
    19  -
    20  - private static final long serialVersionUID = 1L;
    21  - 
    22  - private final IssueCriteria criteria;
    23  -
    24  - public NotIssueCriteria(IssueCriteria criteria) {
    25  - this.criteria = criteria;
    26  - }
    27  - 
    28  - @Override
    29  - public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    30  - return new NotEntityCriteria<Issue>(criteria).getPredicate(query, from, builder);
    31  - }
    32  - 
    33  - @Override
    34  - public boolean matches(Issue issue) {
    35  - return new NotEntityCriteria<Issue>(criteria).matches(issue);
    36  - }
    37  - 
    38  - @Override
    39  - public String toStringWithoutParens() {
    40  - return new NotEntityCriteria<Issue>(criteria).toStringWithoutParens();
    41  - }
    42  -
    43  - @Override
    44  - public Collection<String> getUndefinedStates() {
    45  - return criteria.getUndefinedStates();
    46  - }
    47  - 
    48  - @Override
    49  - public Collection<String> getUndefinedFields() {
    50  - return criteria.getUndefinedFields();
    51  - }
    52  - 
    53  - @Override
    54  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    55  - return criteria.getUndefinedFieldValues();
    56  - }
    57  - 
    58  - @Override
    59  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    60  - return criteria.fixUndefinedStates(resolutions);
    61  - }
    62  - 
    63  - @Override
    64  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    65  - return criteria.fixUndefinedFields(resolutions);
    66  - }
    67  - 
    68  - @Override
    69  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    70  - return criteria.fixUndefinedFieldValues(resolutions);
    71  - }
    72  -
    73  -}
    74  - 
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/NumberCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Project;
    12 12  import io.onedev.server.search.entity.EntityQuery;
    13 13  import io.onedev.server.util.ProjectScopedNumber;
     14 +import io.onedev.server.util.criteria.Criteria;
    14 15   
    15  -public class NumberCriteria extends IssueCriteria {
     16 +public class NumberCriteria extends Criteria<Issue> {
    16 17   
    17 18   private static final long serialVersionUID = 1L;
    18 19   
     20 + private final Project project;
     21 +
    19 22   private final int operator;
    20 23  
    21 24   private final String value;
    22 25  
    23  - private final ProjectScopedNumber number;
     26 + private transient ProjectScopedNumber number;
    24 27  
    25 28   public NumberCriteria(@Nullable Project project, String value, int operator) {
     29 + this.project = project;
    26 30   this.operator = operator;
    27 31   this.value = value;
    28  - number = EntityQuery.getProjectScopedNumber(project, value);
     32 + }
     33 + 
     34 + private ProjectScopedNumber getNumber() {
     35 + if (number == null)
     36 + number = EntityQuery.getProjectScopedNumber(project, value);
     37 + return number;
    29 38   }
    30 39  
    31 40   @Override
    skipped 2 lines
    34 43   Predicate numberPredicate;
    35 44  
    36 45   if (operator == IssueQueryLexer.Is)
    37  - numberPredicate = builder.equal(attribute, number.getNumber());
     46 + numberPredicate = builder.equal(attribute, getNumber().getNumber());
    38 47   else if (operator == IssueQueryLexer.IsGreaterThan)
    39  - numberPredicate = builder.greaterThan(attribute, number.getNumber());
     48 + numberPredicate = builder.greaterThan(attribute, getNumber().getNumber());
    40 49   else
    41  - numberPredicate = builder.lessThan(attribute, number.getNumber());
     50 + numberPredicate = builder.lessThan(attribute, getNumber().getNumber());
    42 51  
    43 52   return builder.and(
    44  - builder.equal(from.get(Issue.PROP_PROJECT), number.getProject()),
     53 + builder.equal(from.get(Issue.PROP_PROJECT), getNumber().getProject()),
    45 54   numberPredicate);
    46 55   }
    47 56   
    48 57   @Override
    49 58   public boolean matches(Issue issue) {
    50  - if (issue.getProject().equals(number.getProject())) {
     59 + if (issue.getProject().equals(getNumber().getProject())) {
    51 60   if (operator == IssueQueryLexer.Is)
    52  - return issue.getNumber() == number.getNumber();
     61 + return issue.getNumber() == getNumber().getNumber();
    53 62   else if (operator == IssueQueryLexer.IsGreaterThan)
    54  - return issue.getNumber() > number.getNumber();
     63 + return issue.getNumber() > getNumber().getNumber();
    55 64   else
    56  - return issue.getNumber() < number.getNumber();
     65 + return issue.getNumber() < getNumber().getNumber();
    57 66   } else {
    58 67   return false;
    59 68   }
    skipped 11 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/OrIssueCriteria.java
    1  -package io.onedev.server.search.entity.issue;
    2  - 
    3  -import java.util.ArrayList;
    4  -import java.util.Collection;
    5  -import java.util.HashSet;
    6  -import java.util.Iterator;
    7  -import java.util.List;
    8  -import java.util.Map;
    9  -import java.util.Set;
    10  - 
    11  -import javax.persistence.criteria.CriteriaBuilder;
    12  -import javax.persistence.criteria.CriteriaQuery;
    13  -import javax.persistence.criteria.From;
    14  -import javax.persistence.criteria.Predicate;
    15  - 
    16  -import io.onedev.server.model.Issue;
    17  -import io.onedev.server.search.entity.OrEntityCriteria;
    18  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution;
    19  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
    20  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValuesResolution;
    21  -import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    22  - 
    23  -public class OrIssueCriteria extends IssueCriteria {
    24  -
    25  - private static final long serialVersionUID = 1L;
    26  - 
    27  - private final List<IssueCriteria> criterias;
    28  -
    29  - public OrIssueCriteria(List<IssueCriteria> criterias) {
    30  - this.criterias = criterias;
    31  - }
    32  - 
    33  - @Override
    34  - public Predicate getPredicate(CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {
    35  - return new OrEntityCriteria<Issue>(criterias).getPredicate(query, from, builder);
    36  - }
    37  - 
    38  - @Override
    39  - public boolean matches(Issue issue) {
    40  - return new OrEntityCriteria<Issue>(criterias).matches(issue);
    41  - }
    42  - 
    43  - @Override
    44  - public String toStringWithoutParens() {
    45  - return new OrEntityCriteria<Issue>(criterias).toStringWithoutParens();
    46  - }
    47  -
    48  - @Override
    49  - public Collection<String> getUndefinedStates() {
    50  - List<String> undefinedStates = new ArrayList<>();
    51  - for (IssueCriteria criteria: criterias)
    52  - undefinedStates.addAll(criteria.getUndefinedStates());
    53  - return undefinedStates;
    54  - }
    55  -
    56  - @Override
    57  - public Collection<String> getUndefinedFields() {
    58  - Set<String> undefinedFields = new HashSet<>();
    59  - for (IssueCriteria criteria: criterias)
    60  - undefinedFields.addAll(criteria.getUndefinedFields());
    61  - return undefinedFields;
    62  - }
    63  - 
    64  - @Override
    65  - public Collection<UndefinedFieldValue> getUndefinedFieldValues() {
    66  - Set<UndefinedFieldValue> undefinedFieldValues = new HashSet<>();
    67  - for (IssueCriteria criteria: criterias)
    68  - undefinedFieldValues.addAll(criteria.getUndefinedFieldValues());
    69  - return undefinedFieldValues;
    70  - }
    71  -
    72  - @Override
    73  - public boolean fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions) {
    74  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    75  - if (!it.next().fixUndefinedStates(resolutions))
    76  - it.remove();
    77  - }
    78  - return !criterias.isEmpty();
    79  - }
    80  -
    81  - @Override
    82  - public boolean fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions) {
    83  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    84  - if (!it.next().fixUndefinedFields(resolutions))
    85  - it.remove();
    86  - }
    87  - return !criterias.isEmpty();
    88  - }
    89  -
    90  - @Override
    91  - public boolean fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions) {
    92  - for (Iterator<IssueCriteria> it = criterias.iterator(); it.hasNext();) {
    93  - if (!it.next().fixUndefinedFieldValues(resolutions))
    94  - it.remove();
    95  - }
    96  - return !criterias.isEmpty();
    97  - }
    98  - 
    99  -}
    100  - 
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/ProjectCriteria.java
    skipped 8 lines
    9 9  import io.onedev.server.OneDev;
    10 10  import io.onedev.server.entitymanager.ProjectManager;
    11 11  import io.onedev.server.model.Issue;
     12 +import io.onedev.server.model.Project;
     13 +import io.onedev.server.util.criteria.Criteria;
    12 14  import io.onedev.server.util.match.WildcardUtils;
    13 15   
    14  -public class ProjectCriteria extends IssueCriteria {
     16 +public class ProjectCriteria extends Criteria<Issue> {
    15 17   
    16 18   private static final long serialVersionUID = 1L;
    17 19  
    18  - private final String projectPath;
     20 + private String projectPath;
    19 21   
    20 22   public ProjectCriteria(String projectPath) {
    21 23   this.projectPath = projectPath;
    skipped 8 lines
    30 32   @Override
    31 33   public boolean matches(Issue issue) {
    32 34   return WildcardUtils.matchPath(projectPath, issue.getProject().getPath());
     35 + }
     36 + 
     37 + @Override
     38 + public void onMoveProject(String oldPath, String newPath) {
     39 + projectPath = Project.substitutePath(projectPath, oldPath, newPath);
     40 + }
     41 + 
     42 + @Override
     43 + public boolean isUsingProject(String projectPath) {
     44 + return Project.containsPath(this.projectPath, projectPath);
    33 45   }
    34 46   
    35 47   @Override
    skipped 8 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/PullRequestFieldCriteria.java
    skipped 16 lines
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    20  - private final PullRequest request;
     20 + private final Project project;
    21 21  
    22 22   private final String value;
    23 23  
     24 + private transient PullRequest request;
     25 +
    24 26   public PullRequestFieldCriteria(String name, @Nullable Project project, String value) {
    25 27   super(name);
    26  - request = EntityQuery.getPullRequest(project, value);
     28 + this.project = project;
    27 29   this.value = value;
    28 30   }
    29 31  
     32 + private PullRequest getRequest() {
     33 + if (request == null)
     34 + request = EntityQuery.getPullRequest(project, value);
     35 + return request;
     36 + }
     37 + 
    30 38   @Override
    31 39   protected Predicate getValuePredicate(From<Issue, Issue> issueFrom, From<IssueField, IssueField> fieldFrom,
    32 40   CriteriaBuilder builder) {
    33  - return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), request.getId());
     41 + return builder.equal(fieldFrom.get(IssueField.PROP_ORDINAL), getRequest().getId());
    34 42   }
    35 43   
    36 44   @Override
    37 45   public boolean matches(Issue issue) {
    38 46   Object fieldValue = issue.getFieldValue(getFieldName());
    39  - return issue.getProject().equals(request.getTargetProject()) && Objects.equals(fieldValue, request.getNumber());
     47 + return issue.getProject().equals(getRequest().getTargetProject())
     48 + && Objects.equals(fieldValue, getRequest().getId());
    40 49   }
    41 50   
    42 51   @Override
    43 52   public void fill(Issue issue) {
    44  - issue.setFieldValue(getFieldName(), request.getNumber());
     53 + issue.setFieldValue(getFieldName(), getRequest().getId());
    45 54   }
    46 55  
    47 56   @Override
    skipped 8 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/StateCriteria.java
    skipped 13 lines
    14 14  import io.onedev.server.OneDev;
    15 15  import io.onedev.server.entitymanager.SettingManager;
    16 16  import io.onedev.server.model.Issue;
     17 +import io.onedev.server.util.criteria.Criteria;
    17 18  import io.onedev.server.web.component.issue.workflowreconcile.UndefinedStateResolution;
    18 19   
    19  -public class StateCriteria extends IssueCriteria {
     20 +public class StateCriteria extends Criteria<Issue> {
    20 21   
    21 22   private static final long serialVersionUID = 1L;
    22 23   
    skipped 47 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/SubmitDateCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Issue;
    12 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    13 14   
    14  -public class SubmitDateCriteria extends IssueCriteria {
     15 +public class SubmitDateCriteria extends Criteria<Issue> {
    15 16   
    16 17   private static final long serialVersionUID = 1L;
    17 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/SubmittedByCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.Issue;
    12 12  import io.onedev.server.model.User;
     13 +import io.onedev.server.util.criteria.Criteria;
    13 14   
    14  -public class SubmittedByCriteria extends IssueCriteria {
     15 +public class SubmittedByCriteria extends Criteria<Issue> {
    15 16   
    16 17   private static final long serialVersionUID = 1L;
    17 18   
    skipped 24 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/SubmittedByMeCriteria.java
    skipped 8 lines
    9 9  import io.onedev.commons.utils.ExplicitException;
    10 10  import io.onedev.server.model.Issue;
    11 11  import io.onedev.server.model.User;
     12 +import io.onedev.server.util.criteria.Criteria;
    12 13   
    13  -public class SubmittedByMeCriteria extends IssueCriteria {
     14 +public class SubmittedByMeCriteria extends Criteria<Issue> {
    14 15   
    15 16   private static final long serialVersionUID = 1L;
    16 17   
    skipped 25 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/TitleCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Issue;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11  import io.onedev.server.util.match.WildcardUtils;
    11 12   
    12  -public class TitleCriteria extends IssueCriteria {
     13 +public class TitleCriteria extends Criteria<Issue> {
    13 14   
    14 15   private static final long serialVersionUID = 1L;
    15 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/UpdateDateCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.support.LastUpdate;
    13 13  import io.onedev.server.search.entity.EntityQuery;
    14 14  import io.onedev.server.util.DateUtils;
     15 +import io.onedev.server.util.criteria.Criteria;
    15 16   
    16  -public class UpdateDateCriteria extends IssueCriteria {
     17 +public class UpdateDateCriteria extends Criteria<Issue> {
    17 18   
    18 19   private static final long serialVersionUID = 1L;
    19 20   
    skipped 44 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/issue/VoteCountCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Issue;
     10 +import io.onedev.server.util.criteria.Criteria;
    10 11   
    11  -public class VoteCountCriteria extends IssueCriteria {
     12 +public class VoteCountCriteria extends Criteria<Issue> {
    12 13   
    13 14   private static final long serialVersionUID = 1L;
    14 15   
    skipped 39 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/ChildrenOfCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.OneDev;
    11 11  import io.onedev.server.entitymanager.ProjectManager;
    12 12  import io.onedev.server.model.Project;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.util.criteria.Criteria;
    15 14  import io.onedev.server.util.match.WildcardUtils;
    16 15   
    17  -public class ChildrenOfCriteria extends EntityCriteria<Project> {
     16 +public class ChildrenOfCriteria extends Criteria<Project> {
    18 17   
    19 18   private static final long serialVersionUID = 1L;
    20 19   
    skipped 33 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/DescriptionCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Project;
    10  -import io.onedev.server.search.entity.EntityCriteria;
    11 10  import io.onedev.server.util.criteria.Criteria;
    12 11  import io.onedev.server.util.match.WildcardUtils;
    13 12   
    14  -public class DescriptionCriteria extends EntityCriteria<Project> {
     13 +public class DescriptionCriteria extends Criteria<Project> {
    15 14   
    16 15   private static final long serialVersionUID = 1L;
    17 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/ForkRootsCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Project;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class ForkRootsCriteria extends EntityCriteria<Project> {
     11 +public class ForkRootsCriteria extends Criteria<Project> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/ForksOfCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.OneDev;
    11 11  import io.onedev.server.entitymanager.ProjectManager;
    12 12  import io.onedev.server.model.Project;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.util.criteria.Criteria;
    15 14  import io.onedev.server.util.match.WildcardUtils;
    16 15   
    17  -public class ForksOfCriteria extends EntityCriteria<Project> {
     16 +public class ForksOfCriteria extends Criteria<Project> {
    18 17   
    19 18   private static final long serialVersionUID = 1L;
    20 19   
    skipped 33 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/NameCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.Project;
    10  -import io.onedev.server.search.entity.EntityCriteria;
    11 10  import io.onedev.server.util.criteria.Criteria;
    12 11  import io.onedev.server.util.match.WildcardUtils;
    13 12   
    14  -public class NameCriteria extends EntityCriteria<Project> {
     13 +public class NameCriteria extends Criteria<Project> {
    15 14   
    16 15   private static final long serialVersionUID = 1L;
    17 16   
    skipped 26 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/OwnedByCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.Role;
    13 13  import io.onedev.server.model.User;
    14 14  import io.onedev.server.model.UserAuthorization;
    15  -import io.onedev.server.search.entity.EntityCriteria;
    16 15  import io.onedev.server.util.criteria.Criteria;
    17 16   
    18  -public class OwnedByCriteria extends EntityCriteria<Project> {
     17 +public class OwnedByCriteria extends Criteria<Project> {
    19 18   
    20 19   private static final long serialVersionUID = 1L;
    21 20   
    skipped 45 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/OwnedByMeCriteria.java
    skipped 7 lines
    8 8  import io.onedev.commons.utils.ExplicitException;
    9 9  import io.onedev.server.model.Project;
    10 10  import io.onedev.server.model.User;
    11  -import io.onedev.server.search.entity.EntityCriteria;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class OwnedByMeCriteria extends EntityCriteria<Project> {
     13 +public class OwnedByMeCriteria extends Criteria<Project> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 23 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/OwnedByNoneCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Project;
    12 12  import io.onedev.server.model.Role;
    13 13  import io.onedev.server.model.UserAuthorization;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class OwnedByNoneCriteria extends EntityCriteria<Project> {
     16 +public class OwnedByNoneCriteria extends Criteria<Project> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 32 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/PathCriteria.java
    skipped 7 lines
    8 8  import io.onedev.server.OneDev;
    9 9  import io.onedev.server.entitymanager.ProjectManager;
    10 10  import io.onedev.server.model.Project;
    11  -import io.onedev.server.search.entity.EntityCriteria;
    12 11  import io.onedev.server.util.criteria.Criteria;
    13 12  import io.onedev.server.util.match.WildcardUtils;
    14 13   
    15  -public class PathCriteria extends EntityCriteria<Project> {
     14 +public class PathCriteria extends Criteria<Project> {
    16 15   
    17 16   private static final long serialVersionUID = 1L;
    18 17   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/ProjectQuery.java
    skipped 15 lines
    16 16  import io.onedev.commons.codeassist.AntlrUtils;
    17 17  import io.onedev.commons.utils.ExplicitException;
    18 18  import io.onedev.server.model.Project;
    19  -import io.onedev.server.search.entity.AndEntityCriteria;
    20  -import io.onedev.server.search.entity.EntityCriteria;
    21 19  import io.onedev.server.search.entity.EntityQuery;
    22 20  import io.onedev.server.search.entity.EntitySort;
    23 21  import io.onedev.server.search.entity.EntitySort.Direction;
    24  -import io.onedev.server.search.entity.NotEntityCriteria;
    25  -import io.onedev.server.search.entity.OrEntityCriteria;
    26 22  import io.onedev.server.search.entity.project.ProjectQueryParser.AndCriteriaContext;
    27 23  import io.onedev.server.search.entity.project.ProjectQueryParser.CriteriaContext;
    28 24  import io.onedev.server.search.entity.project.ProjectQueryParser.FieldOperatorValueCriteriaContext;
    skipped 4 lines
    33 29  import io.onedev.server.search.entity.project.ProjectQueryParser.OrderContext;
    34 30  import io.onedev.server.search.entity.project.ProjectQueryParser.ParensCriteriaContext;
    35 31  import io.onedev.server.search.entity.project.ProjectQueryParser.QueryContext;
     32 +import io.onedev.server.util.criteria.AndCriteria;
     33 +import io.onedev.server.util.criteria.Criteria;
     34 +import io.onedev.server.util.criteria.NotCriteria;
     35 +import io.onedev.server.util.criteria.OrCriteria;
    36 36   
    37 37  public class ProjectQuery extends EntityQuery<Project> {
    38 38   
    39 39   private static final long serialVersionUID = 1L;
    40 40   
    41  - private final EntityCriteria<Project> criteria;
     41 + private final Criteria<Project> criteria;
    42 42  
    43 43   private final List<EntitySort> sorts;
    44 44  
    45  - public ProjectQuery(@Nullable EntityCriteria<Project> criteria, List<EntitySort> sorts) {
     45 + public ProjectQuery(@Nullable Criteria<Project> criteria, List<EntitySort> sorts) {
    46 46   this.criteria = criteria;
    47 47   this.sorts = sorts;
    48 48   }
    49 49   
    50  - public ProjectQuery(@Nullable EntityCriteria<Project> criteria) {
     50 + public ProjectQuery(@Nullable Criteria<Project> criteria) {
    51 51   this(criteria, new ArrayList<>());
    52 52   }
    53 53  
    skipped 2 lines
    56 56   }
    57 57  
    58 58   @Nullable
    59  - public EntityCriteria<Project> getCriteria() {
     59 + public Criteria<Project> getCriteria() {
    60 60   return criteria;
    61 61   }
    62 62   
    skipped 21 lines
    84 84   parser.setErrorHandler(new BailErrorStrategy());
    85 85   QueryContext queryContext = parser.query();
    86 86   CriteriaContext criteriaContext = queryContext.criteria();
    87  - EntityCriteria<Project> projectCriteria;
     87 + Criteria<Project> projectCriteria;
    88 88   if (criteriaContext != null) {
    89  - projectCriteria = new ProjectQueryBaseVisitor<EntityCriteria<Project>>() {
     89 + projectCriteria = new ProjectQueryBaseVisitor<Criteria<Project>>() {
    90 90   
    91 91   @Override
    92  - public EntityCriteria<Project> visitOperatorCriteria(OperatorCriteriaContext ctx) {
     92 + public Criteria<Project> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    93 93   if (ctx.operator.getType() == ProjectQueryLexer.Roots)
    94 94   return new RootsCriteria();
    95 95   else if (ctx.operator.getType() == ProjectQueryLexer.ForkRoots)
    skipped 4 lines
    100 100   return new OwnedByNoneCriteria();
    101 101   }
    102 102  
    103  - public EntityCriteria<Project> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     103 + public Criteria<Project> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    104 104   String value = getValue(ctx.Quoted().getText());
    105 105   if (ctx.operator.getType() == ProjectQueryLexer.ChildrenOf)
    106 106   return new ChildrenOfCriteria(value);
    skipped 4 lines
    111 111   }
    112 112  
    113 113   @Override
    114  - public EntityCriteria<Project> visitParensCriteria(ParensCriteriaContext ctx) {
    115  - return (EntityCriteria<Project>) visit(ctx.criteria()).withParens(true);
     114 + public Criteria<Project> visitParensCriteria(ParensCriteriaContext ctx) {
     115 + return (Criteria<Project>) visit(ctx.criteria()).withParens(true);
    116 116   }
    117 117   
    118 118   @Override
    119  - public EntityCriteria<Project> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     119 + public Criteria<Project> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    120 120   String fieldName = getValue(ctx.Quoted(0).getText());
    121 121   String value = getValue(ctx.Quoted(1).getText());
    122 122   int operator = ctx.operator.getType();
    skipped 16 lines
    139 139   }
    140 140  
    141 141   @Override
    142  - public EntityCriteria<Project> visitOrCriteria(OrCriteriaContext ctx) {
    143  - List<EntityCriteria<Project>> childCriterias = new ArrayList<>();
     142 + public Criteria<Project> visitOrCriteria(OrCriteriaContext ctx) {
     143 + List<Criteria<Project>> childCriterias = new ArrayList<>();
    144 144   for (CriteriaContext childCtx: ctx.criteria())
    145 145   childCriterias.add(visit(childCtx));
    146  - return new OrEntityCriteria<Project>(childCriterias);
     146 + return new OrCriteria<Project>(childCriterias);
    147 147   }
    148 148   
    149 149   @Override
    150  - public EntityCriteria<Project> visitAndCriteria(AndCriteriaContext ctx) {
    151  - List<EntityCriteria<Project>> childCriterias = new ArrayList<>();
     150 + public Criteria<Project> visitAndCriteria(AndCriteriaContext ctx) {
     151 + List<Criteria<Project>> childCriterias = new ArrayList<>();
    152 152   for (CriteriaContext childCtx: ctx.criteria())
    153 153   childCriterias.add(visit(childCtx));
    154  - return new AndEntityCriteria<Project>(childCriterias);
     154 + return new AndCriteria<Project>(childCriterias);
    155 155   }
    156 156   
    157 157   @Override
    158  - public EntityCriteria<Project> visitNotCriteria(NotCriteriaContext ctx) {
    159  - return new NotEntityCriteria<Project>(visit(ctx.criteria()));
     158 + public Criteria<Project> visitNotCriteria(NotCriteriaContext ctx) {
     159 + return new NotCriteria<Project>(visit(ctx.criteria()));
    160 160   }
    161 161  
    162 162   }.visit(criteriaContext);
    skipped 47 lines
    210 210   }
    211 211  
    212 212   public static ProjectQuery merge(ProjectQuery query1, ProjectQuery query2) {
    213  - List<EntityCriteria<Project>> criterias = new ArrayList<>();
     213 + List<Criteria<Project>> criterias = new ArrayList<>();
    214 214   if (query1.getCriteria() != null)
    215 215   criterias.add(query1.getCriteria());
    216 216   if (query2.getCriteria() != null)
    skipped 1 lines
    218 218   List<EntitySort> sorts = new ArrayList<>();
    219 219   sorts.addAll(query1.getSorts());
    220 220   sorts.addAll(query2.getSorts());
    221  - return new ProjectQuery(EntityCriteria.andCriterias(criterias), sorts);
     221 + return new ProjectQuery(Criteria.andCriterias(criterias), sorts);
    222 222   }
    223 223  
    224 224   @Override
    skipped 14 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/RootsCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.Project;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class RootsCriteria extends EntityCriteria<Project> {
     11 +public class RootsCriteria extends Criteria<Project> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    skipped 17 lines
  • ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/project/UpdateDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.Project;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
    14 13  import io.onedev.server.util.criteria.Criteria;
    15 14   
    16  -public class UpdateDateCriteria extends EntityCriteria<Project> {
     15 +public class UpdateDateCriteria extends Criteria<Project> {
    17 16   
    18 17   private static final long serialVersionUID = 1L;
    19 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/ApprovedByCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.PullRequestReview;
    13 13  import io.onedev.server.model.User;
    14 14  import io.onedev.server.model.support.pullrequest.ReviewResult;
    15  -import io.onedev.server.search.entity.EntityCriteria;
    16 15  import io.onedev.server.search.entity.EntityQuery;
     16 +import io.onedev.server.util.criteria.Criteria;
    17 17   
    18  -public class ApprovedByCriteria extends EntityCriteria<PullRequest> {
     18 +public class ApprovedByCriteria extends Criteria<PullRequest> {
    19 19   
    20 20   private static final long serialVersionUID = 1L;
    21 21   
    skipped 31 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/ApprovedByMeCriteria.java
    skipped 12 lines
    13 13  import io.onedev.server.model.PullRequestReview;
    14 14  import io.onedev.server.model.User;
    15 15  import io.onedev.server.model.support.pullrequest.ReviewResult;
    16  -import io.onedev.server.search.entity.EntityCriteria;
    17 16  import io.onedev.server.search.entity.EntityQuery;
     17 +import io.onedev.server.util.criteria.Criteria;
    18 18   
    19  -public class ApprovedByMeCriteria extends EntityCriteria<PullRequest> {
     19 +public class ApprovedByMeCriteria extends Criteria<PullRequest> {
    20 20   
    21 21   private static final long serialVersionUID = 1L;
    22 22   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/AssignedToCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.PullRequestAssignment;
    13 13  import io.onedev.server.model.User;
    14  -import io.onedev.server.search.entity.EntityCriteria;
    15 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class AssignedToCriteria extends EntityCriteria<PullRequest> {
     17 +public class AssignedToCriteria extends Criteria<PullRequest> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/AssignedToMeCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.PullRequest;
    13 13  import io.onedev.server.model.PullRequestAssignment;
    14 14  import io.onedev.server.model.User;
    15  -import io.onedev.server.search.entity.EntityCriteria;
    16 15  import io.onedev.server.search.entity.EntityQuery;
     16 +import io.onedev.server.util.criteria.Criteria;
    17 17   
    18  -public class AssignedToMeCriteria extends EntityCriteria<PullRequest> {
     18 +public class AssignedToMeCriteria extends Criteria<PullRequest> {
    19 19   
    20 20   private static final long serialVersionUID = 1L;
    21 21   
    skipped 28 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/CloseDateCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.support.pullrequest.CloseInfo;
    13  -import io.onedev.server.search.entity.EntityCriteria;
    14 13  import io.onedev.server.search.entity.EntityQuery;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class CloseDateCriteria extends EntityCriteria<PullRequest> {
     16 +public class CloseDateCriteria extends Criteria<PullRequest> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 42 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/CommentCountCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class CommentCountCriteria extends EntityCriteria<PullRequest> {
     12 +public class CommentCountCriteria extends Criteria<PullRequest> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    skipped 39 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/CommentCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.PullRequestComment;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class CommentCriteria extends EntityCriteria<PullRequest> {
     15 +public class CommentCriteria extends Criteria<PullRequest> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/DescriptionCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class DescriptionCriteria extends EntityCriteria<PullRequest> {
     13 +public class DescriptionCriteria extends Criteria<PullRequest> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/DiscardedByCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.User;
    13 13  import io.onedev.server.model.support.pullrequest.CloseInfo;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class DiscardedByCriteria extends EntityCriteria<PullRequest> {
     16 +public class DiscardedByCriteria extends Criteria<PullRequest> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/DiscardedByMeCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.model.PullRequest;
    11 11  import io.onedev.server.model.User;
    12 12  import io.onedev.server.model.support.pullrequest.CloseInfo;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class DiscardedByMeCriteria extends EntityCriteria<PullRequest> {
     15 +public class DiscardedByMeCriteria extends Criteria<PullRequest> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 25 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/DiscardedCriteria.java
    skipped 6 lines
    7 7   
    8 8  import io.onedev.server.model.PullRequest;
    9 9  import io.onedev.server.model.support.pullrequest.CloseInfo;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class DiscardedCriteria extends EntityCriteria<PullRequest> {
     12 +public class DiscardedCriteria extends Criteria<PullRequest> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    16  - private EntityCriteria<PullRequest> getCriteria() {
     16 + private Criteria<PullRequest> getCriteria() {
    17 17   return new StatusCriteria(CloseInfo.Status.DISCARDED.toString());
    18 18   }
    19 19  
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/HasFailedBuildsCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.Build;
    12 12  import io.onedev.server.model.PullRequest;
    13 13  import io.onedev.server.model.support.pullrequest.MergePreview;
    14  -import io.onedev.server.search.entity.EntityCriteria;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class HasFailedBuildsCriteria extends EntityCriteria<PullRequest> {
     16 +public class HasFailedBuildsCriteria extends Criteria<PullRequest> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 36 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/HasMergeConflictsCriteria.java
    skipped 7 lines
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10 10  import io.onedev.server.model.support.pullrequest.MergePreview;
    11  -import io.onedev.server.search.entity.EntityCriteria;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class HasMergeConflictsCriteria extends EntityCriteria<PullRequest> {
     13 +public class HasMergeConflictsCriteria extends Criteria<PullRequest> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 22 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/HasPendingReviewsCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.PullRequestReview;
    13 13  import io.onedev.server.model.support.pullrequest.ReviewResult;
    14  -import io.onedev.server.search.entity.EntityCriteria;
    15 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class HasPendingReviewsCriteria extends EntityCriteria<PullRequest> {
     17 +public class HasPendingReviewsCriteria extends Criteria<PullRequest> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/IncludesCommitCriteria.java
    skipped 13 lines
    14 14  import io.onedev.server.infomanager.PullRequestInfoManager;
    15 15  import io.onedev.server.model.Project;
    16 16  import io.onedev.server.model.PullRequest;
    17  -import io.onedev.server.search.entity.EntityCriteria;
    18 17  import io.onedev.server.search.entity.EntityQuery;
    19 18  import io.onedev.server.util.ProjectScopedCommit;
     19 +import io.onedev.server.util.criteria.Criteria;
    20 20   
    21  -public class IncludesCommitCriteria extends EntityCriteria<PullRequest> {
     21 +public class IncludesCommitCriteria extends Criteria<PullRequest> {
    22 22   
    23 23   private static final long serialVersionUID = 1L;
    24 24   
    skipped 41 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/IncludesIssueCriteria.java
    skipped 16 lines
    17 17  import io.onedev.server.model.Issue;
    18 18  import io.onedev.server.model.Project;
    19 19  import io.onedev.server.model.PullRequest;
    20  -import io.onedev.server.search.entity.EntityCriteria;
    21 20  import io.onedev.server.search.entity.EntityQuery;
     21 +import io.onedev.server.util.criteria.Criteria;
    22 22   
    23  -public class IncludesIssueCriteria extends EntityCriteria<PullRequest> {
     23 +public class IncludesIssueCriteria extends Criteria<PullRequest> {
    24 24   
    25 25   private static final long serialVersionUID = 1L;
    26 26   
    skipped 41 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/MergeStrategyCriteria.java
    skipped 7 lines
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10 10  import io.onedev.server.model.support.pullrequest.MergeStrategy;
    11  -import io.onedev.server.search.entity.EntityCriteria;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class MergeStrategyCriteria extends EntityCriteria<PullRequest> {
     13 +public class MergeStrategyCriteria extends Criteria<PullRequest> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 26 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/MergedCriteria.java
    skipped 6 lines
    7 7   
    8 8  import io.onedev.server.model.PullRequest;
    9 9  import io.onedev.server.model.support.pullrequest.CloseInfo;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11   
    12  -public class MergedCriteria extends EntityCriteria<PullRequest> {
     12 +public class MergedCriteria extends Criteria<PullRequest> {
    13 13   
    14 14   private static final long serialVersionUID = 1L;
    15 15   
    16  - private EntityCriteria<PullRequest> getCriteria() {
     16 + private Criteria<PullRequest> getCriteria() {
    17 17   return new StatusCriteria(CloseInfo.Status.MERGED.toString());
    18 18   }
    19 19  
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/NumberCriteria.java
    skipped 8 lines
    9 9   
    10 10  import io.onedev.server.model.Project;
    11 11  import io.onedev.server.model.PullRequest;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
    14 13  import io.onedev.server.util.ProjectScopedNumber;
     14 +import io.onedev.server.util.criteria.Criteria;
    15 15   
    16  -public class NumberCriteria extends EntityCriteria<PullRequest> {
     16 +public class NumberCriteria extends Criteria<PullRequest> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 52 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/OpenCriteria.java
    skipped 5 lines
    6 6  import javax.persistence.criteria.Predicate;
    7 7   
    8 8  import io.onedev.server.model.PullRequest;
    9  -import io.onedev.server.search.entity.EntityCriteria;
     9 +import io.onedev.server.util.criteria.Criteria;
    10 10   
    11  -public class OpenCriteria extends EntityCriteria<PullRequest> {
     11 +public class OpenCriteria extends Criteria<PullRequest> {
    12 12   
    13 13   private static final long serialVersionUID = 1L;
    14 14   
    15  - private EntityCriteria<PullRequest> getCriteria() {
     15 + private Criteria<PullRequest> getCriteria() {
    16 16   return new StatusCriteria(PullRequest.STATE_OPEN);
    17 17   }
    18 18  
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/PullRequestQuery.java
    skipped 17 lines
    18 18  import io.onedev.server.model.Project;
    19 19  import io.onedev.server.model.PullRequest;
    20 20  import io.onedev.server.model.support.pullrequest.MergeStrategy;
    21  -import io.onedev.server.search.entity.AndEntityCriteria;
    22  -import io.onedev.server.search.entity.EntityCriteria;
    23 21  import io.onedev.server.search.entity.EntityQuery;
    24 22  import io.onedev.server.search.entity.EntitySort;
    25 23  import io.onedev.server.search.entity.EntitySort.Direction;
    26  -import io.onedev.server.search.entity.NotEntityCriteria;
    27  -import io.onedev.server.search.entity.OrEntityCriteria;
    28 24  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.AndCriteriaContext;
    29 25  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.CriteriaContext;
    30 26  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.FieldOperatorValueCriteriaContext;
    skipped 4 lines
    35 31  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.OrderContext;
    36 32  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.ParensCriteriaContext;
    37 33  import io.onedev.server.search.entity.pullrequest.PullRequestQueryParser.QueryContext;
     34 +import io.onedev.server.util.criteria.AndCriteria;
     35 +import io.onedev.server.util.criteria.Criteria;
     36 +import io.onedev.server.util.criteria.NotCriteria;
     37 +import io.onedev.server.util.criteria.OrCriteria;
    38 38   
    39 39  public class PullRequestQuery extends EntityQuery<PullRequest> {
    40 40   
    41 41   private static final long serialVersionUID = 1L;
    42 42   
    43  - private final EntityCriteria<PullRequest> criteria;
     43 + private final Criteria<PullRequest> criteria;
    44 44  
    45 45   private final List<EntitySort> sorts;
    46 46  
    47  - public PullRequestQuery(@Nullable EntityCriteria<PullRequest> criteria, List<EntitySort> sorts) {
     47 + public PullRequestQuery(@Nullable Criteria<PullRequest> criteria, List<EntitySort> sorts) {
    48 48   this.criteria = criteria;
    49 49   this.sorts = sorts;
    50 50   }
    51 51   
    52  - public PullRequestQuery(@Nullable EntityCriteria<PullRequest> criteria) {
     52 + public PullRequestQuery(@Nullable Criteria<PullRequest> criteria) {
    53 53   this(criteria, new ArrayList<>());
    54 54   }
    55 55  
    skipped 21 lines
    77 77   parser.setErrorHandler(new BailErrorStrategy());
    78 78   QueryContext queryContext = parser.query();
    79 79   CriteriaContext criteriaContext = queryContext.criteria();
    80  - EntityCriteria<PullRequest> requestCriteria;
     80 + Criteria<PullRequest> requestCriteria;
    81 81   if (criteriaContext != null) {
    82  - requestCriteria = new PullRequestQueryBaseVisitor<EntityCriteria<PullRequest>>() {
     82 + requestCriteria = new PullRequestQueryBaseVisitor<Criteria<PullRequest>>() {
    83 83   
    84 84   @Override
    85  - public EntityCriteria<PullRequest> visitOperatorCriteria(OperatorCriteriaContext ctx) {
     85 + public Criteria<PullRequest> visitOperatorCriteria(OperatorCriteriaContext ctx) {
    86 86   switch (ctx.operator.getType()) {
    87 87   case PullRequestQueryLexer.Open:
    88 88   return new OpenCriteria();
    skipped 29 lines
    118 118   }
    119 119  
    120 120   @Override
    121  - public EntityCriteria<PullRequest> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
     121 + public Criteria<PullRequest> visitOperatorValueCriteria(OperatorValueCriteriaContext ctx) {
    122 122   String value = getValue(ctx.Quoted().getText());
    123 123   switch (ctx.operator.getType()) {
    124 124   case PullRequestQueryLexer.ToBeReviewedBy:
    skipped 18 lines
    143 143   }
    144 144  
    145 145   @Override
    146  - public EntityCriteria<PullRequest> visitParensCriteria(ParensCriteriaContext ctx) {
    147  - return (EntityCriteria<PullRequest>) visit(ctx.criteria()).withParens(true);
     146 + public Criteria<PullRequest> visitParensCriteria(ParensCriteriaContext ctx) {
     147 + return (Criteria<PullRequest>) visit(ctx.criteria()).withParens(true);
    148 148   }
    149 149   
    150 150   @Override
    151  - public EntityCriteria<PullRequest> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
     151 + public Criteria<PullRequest> visitFieldOperatorValueCriteria(FieldOperatorValueCriteriaContext ctx) {
    152 152   String fieldName = getValue(ctx.Quoted(0).getText());
    153 153   String value = getValue(ctx.Quoted(1).getText());
    154 154   int operator = ctx.operator.getType();
    skipped 58 lines
    213 213   }
    214 214  
    215 215   @Override
    216  - public EntityCriteria<PullRequest> visitOrCriteria(OrCriteriaContext ctx) {
    217  - List<EntityCriteria<PullRequest>> childCriterias = new ArrayList<>();
     216 + public Criteria<PullRequest> visitOrCriteria(OrCriteriaContext ctx) {
     217 + List<Criteria<PullRequest>> childCriterias = new ArrayList<>();
    218 218   for (CriteriaContext childCtx: ctx.criteria())
    219 219   childCriterias.add(visit(childCtx));
    220  - return new OrEntityCriteria<PullRequest>(childCriterias);
     220 + return new OrCriteria<PullRequest>(childCriterias);
    221 221   }
    222 222   
    223 223   @Override
    224  - public EntityCriteria<PullRequest> visitAndCriteria(AndCriteriaContext ctx) {
    225  - List<EntityCriteria<PullRequest>> childCriterias = new ArrayList<>();
     224 + public Criteria<PullRequest> visitAndCriteria(AndCriteriaContext ctx) {
     225 + List<Criteria<PullRequest>> childCriterias = new ArrayList<>();
    226 226   for (CriteriaContext childCtx: ctx.criteria())
    227 227   childCriterias.add(visit(childCtx));
    228  - return new AndEntityCriteria<PullRequest>(childCriterias);
     228 + return new AndCriteria<PullRequest>(childCriterias);
    229 229   }
    230 230   
    231 231   @Override
    232  - public EntityCriteria<PullRequest> visitNotCriteria(NotCriteriaContext ctx) {
    233  - return new NotEntityCriteria<PullRequest>(visit(ctx.criteria()));
     232 + public Criteria<PullRequest> visitNotCriteria(NotCriteriaContext ctx) {
     233 + return new NotCriteria<PullRequest>(visit(ctx.criteria()));
    234 234   }
    235 235   
    236 236   }.visit(criteriaContext);
    skipped 75 lines
    312 312   }
    313 313  
    314 314   @Override
    315  - public EntityCriteria<PullRequest> getCriteria() {
     315 + public Criteria<PullRequest> getCriteria() {
    316 316   return criteria;
    317 317   }
    318 318   
    skipped 3 lines
    322 322   }
    323 323  
    324 324   public static PullRequestQuery merge(PullRequestQuery query1, PullRequestQuery query2) {
    325  - List<EntityCriteria<PullRequest>> criterias = new ArrayList<>();
     325 + List<Criteria<PullRequest>> criterias = new ArrayList<>();
    326 326   if (query1.getCriteria() != null)
    327 327   criterias.add(query1.getCriteria());
    328 328   if (query2.getCriteria() != null)
    skipped 1 lines
    330 330   List<EntitySort> sorts = new ArrayList<>();
    331 331   sorts.addAll(query1.getSorts());
    332 332   sorts.addAll(query2.getSorts());
    333  - return new PullRequestQuery(EntityCriteria.andCriterias(criterias), sorts);
     333 + return new PullRequestQuery(Criteria.andCriterias(criterias), sorts);
    334 334   }
    335 335  
    336 336  }
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/RequestedForChangesByCriteria.java
    skipped 11 lines
    12 12  import io.onedev.server.model.PullRequestReview;
    13 13  import io.onedev.server.model.User;
    14 14  import io.onedev.server.model.support.pullrequest.ReviewResult;
    15  -import io.onedev.server.search.entity.EntityCriteria;
    16 15  import io.onedev.server.search.entity.EntityQuery;
     16 +import io.onedev.server.util.criteria.Criteria;
    17 17   
    18  -public class RequestedForChangesByCriteria extends EntityCriteria<PullRequest> {
     18 +public class RequestedForChangesByCriteria extends Criteria<PullRequest> {
    19 19   
    20 20   private static final long serialVersionUID = 1L;
    21 21   
    skipped 30 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/RequestedForChangesByMeCriteria.java
    skipped 12 lines
    13 13  import io.onedev.server.model.PullRequestReview;
    14 14  import io.onedev.server.model.User;
    15 15  import io.onedev.server.model.support.pullrequest.ReviewResult;
    16  -import io.onedev.server.search.entity.EntityCriteria;
    17 16  import io.onedev.server.search.entity.EntityQuery;
     17 +import io.onedev.server.util.criteria.Criteria;
    18 18   
    19  -public class RequestedForChangesByMeCriteria extends EntityCriteria<PullRequest> {
     19 +public class RequestedForChangesByMeCriteria extends Criteria<PullRequest> {
    20 20   
    21 21   private static final long serialVersionUID = 1L;
    22 22   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SomeoneRequestedForChangesCriteria.java
    skipped 10 lines
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.PullRequestReview;
    13 13  import io.onedev.server.model.support.pullrequest.ReviewResult;
    14  -import io.onedev.server.search.entity.EntityCriteria;
    15 14  import io.onedev.server.search.entity.EntityQuery;
     15 +import io.onedev.server.util.criteria.Criteria;
    16 16   
    17  -public class SomeoneRequestedForChangesCriteria extends EntityCriteria<PullRequest> {
     17 +public class SomeoneRequestedForChangesCriteria extends Criteria<PullRequest> {
    18 18   
    19 19   private static final long serialVersionUID = 1L;
    20 20   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SourceBranchCriteria.java
    skipped 6 lines
    7 7  import javax.persistence.criteria.Predicate;
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10  -import io.onedev.server.search.entity.EntityCriteria;
     10 +import io.onedev.server.util.criteria.Criteria;
    11 11  import io.onedev.server.util.match.WildcardUtils;
    12 12   
    13  -public class SourceBranchCriteria extends EntityCriteria<PullRequest> {
     13 +public class SourceBranchCriteria extends Criteria<PullRequest> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 27 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SourceProjectCriteria.java
    skipped 9 lines
    10 10  import io.onedev.server.entitymanager.ProjectManager;
    11 11  import io.onedev.server.model.Project;
    12 12  import io.onedev.server.model.PullRequest;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14  import io.onedev.server.util.match.WildcardUtils;
    15 15   
    16  -public class SourceProjectCriteria extends EntityCriteria<PullRequest> {
     16 +public class SourceProjectCriteria extends Criteria<PullRequest> {
    17 17   
    18 18   private static final long serialVersionUID = 1L;
    19 19   
    skipped 30 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/StatusCriteria.java
    skipped 7 lines
    8 8   
    9 9  import io.onedev.server.model.PullRequest;
    10 10  import io.onedev.server.model.support.pullrequest.CloseInfo;
    11  -import io.onedev.server.search.entity.EntityCriteria;
     11 +import io.onedev.server.util.criteria.Criteria;
    12 12   
    13  -public class StatusCriteria extends EntityCriteria<PullRequest> {
     13 +public class StatusCriteria extends Criteria<PullRequest> {
    14 14   
    15 15   private static final long serialVersionUID = 1L;
    16 16   
    skipped 32 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SubmitDateCriteria.java
    skipped 8 lines
    9 9  import javax.persistence.criteria.Predicate;
    10 10   
    11 11  import io.onedev.server.model.PullRequest;
    12  -import io.onedev.server.search.entity.EntityCriteria;
    13 12  import io.onedev.server.search.entity.EntityQuery;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class SubmitDateCriteria extends EntityCriteria<PullRequest> {
     15 +public class SubmitDateCriteria extends Criteria<PullRequest> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 38 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SubmittedByCriteria.java
    skipped 9 lines
    10 10   
    11 11  import io.onedev.server.model.PullRequest;
    12 12  import io.onedev.server.model.User;
    13  -import io.onedev.server.search.entity.EntityCriteria;
     13 +import io.onedev.server.util.criteria.Criteria;
    14 14   
    15  -public class SubmittedByCriteria extends EntityCriteria<PullRequest> {
     15 +public class SubmittedByCriteria extends Criteria<PullRequest> {
    16 16   
    17 17   private static final long serialVersionUID = 1L;
    18 18   
    skipped 24 lines
  • ■ ■ ■ ■ ■ ■
    server-core/src/main/java/io/onedev/server/search/entity/pullrequest/SubmittedByMeCriteria.java
    skipped 8 lines
    9 9  import io.onedev.commons.utils.ExplicitException;
    10 10  import io.onedev.server.model.PullRequest;
    11 11  import io.onedev.server.model.User;
    12  -import io.onedev.server.search.entity.EntityCriteria;
     12 +import io.onedev.server.util.criteria.Criteria;
    13 13   
    14  -public class SubmittedByMeCriteria extends EntityCriteria<PullRequest> {
     14 +public class SubmittedByMeCriteria extends Criteria<PullRequest> {
    15 15   
    16 16   private static final long serialVersionUID = 1L;
    17 17   
    skipped 25 lines
Please wait...
Page is in error, reload to recover