2012-11-05 6 views
1

JQL 쿼리로 어려움을 겪고 있습니다.JQL 성능 - 사용자 정의 텍스트 필드에 대한 자연 정렬

우리는 텍스트 필드 인 'Build Reported'라는 사용자 정의 필드를 가지고 있습니다. '4.7.323H', '5.1.123L', '3.1.456E'등과 같은 값이 있습니다.

사용자 지정 버전 이후에보고 된 모든 문제를 알려주는 간단한 쿼리를 작성해야합니다.

JQL 기능 프로토 타입 : searchIssues ('통합 구축', '>', '4.7.323B')

이렇게하려면, 내가 나에게 모든 문제를보고 빌드를 제공하는 JQL 질의를 발사하고, 그런 다음 각 이슈를 반복하고 char-by-char 비교를 수행하여 현재 이슈의 빌드보고 버전이 사용자가 지정한 버전보다 큰지 여부를 확인합니다. jira 데이터베이스에서 모든 문제를 검색해야하므로 실행하는 데 너무 오래 걸리는 것으로 보입니다.

더 빠른 방법이 있나요? 여기에 지금까지 무엇을 가지고 :

// Get all the arguments 
java.util.List args = operand.getArgs(); 
CustomField cf = customFieldManager.getCustomFieldObjectByName((String)args.get(0)); 
Long cfID = cf.getIdAsLong(); 
String operator = (String)args.get(1); 
String userVersion = (String)args.get(2); 
String jiraVersion = ""; 

java.util.List issues; 
Iterator issuesIterator; 
Issue issue; 

issues = getAllIssues(user, interestedInVersion, cfID); 
issuesIterator = issues.iterator(); 

// Iterate over all the issues 
while(issuesIterator.hasNext()) 
{ 
    issue = (Issue)issuesIterator.next(); 

    // Get the Build reported value 
    jiraVersion = (String)issue.getCustomFieldValue(cf); 

    if(jiraVersion != null && 
     !jiraVersion.equals("")) 
    { 
     // Compare user-specified version to the one retrieved from database 
     if(compareVersions(jiraVersion, userVersion, operator)) 
     { 
      // Add the issue to the result set 
      literals.add(new QueryLiteral(operand, issue.getId())); 
     } 
    } 
} 

// cfID is the ID for the custom field Build Reported 
private java.util.List getAllIssues(User user, Long cfID) throws SearchException, ParseException 
{ 
    JqlQueryBuilder builder = JqlQueryBuilder.newBuilder(); 
    builder.where().project("SDEV").and().customField(cfID).isNotEmpty(); 
    Query query = builder.buildQuery(); 
    SearchResults results = searchService.search(user, query, PagerFilter.getUnlimitedFilter()); 
    return results.getIssues(); 
} 

내가 나를 결과 집합의 크기를 줄이는 데 도움이되는 JQL 쿼리 빌더에 사용할 수있는 다른 필터를 가지고 있지 않음을 유의하시기 바랍니다.

+0

누구를? 부디. –

+0

내가 생각할 수있는 유일한 다른 접근법은 ~ 연산자를 지원하고 BuildIntegrated ~ "3.4 *"또는 BuildIntegrated ~ "4. *"와 같은 쿼리를 수행하는 사용자 검색기를 만드는 것입니다. 그래도 좋은 해결책이 아닙니다. – mdoar

+0

전에 맞춤 검색을 해본 적이 없어요. 좀 읽어보고 효율적으로 사용할 수 있는지 알아 봅시다. 감사. –

답변

1

내 질문에 설명 된 문제의 대안을 찾았습니다. JQL을 사용하는 대신에 직접 SELECT를 실행하는 것으로 끝났다. 아래의 함수는 JQL Plugin의 일부이다.

이것은 내가하고 결국 무엇인가 : 다음은 코드입니다

public java.util.List getValues(@NotNull QueryCreationContext queryCreationContext, @NotNull FunctionOperand operand, @NotNull TerminalClause terminalClause) 
{ 
    try 
    { 
     // User 
     User user = queryCreationContext.getUser(); 

     // Args 
     java.util.List args = operand.getArgs(); 
     CustomField cf = customFieldManager.getCustomFieldObjectByName((String)args.get(0)); 
     Long cfID = cf.getIdAsLong(); 
     String operator = (String)args.get(1); 
     String userVersion = (String)args.get(2); 

     // Locals 
     java.util.List literals = new java.util.LinkedList(); 
     MutableIssue issue = null; 
     String issueId = ""; 
     String jiraVersion = ""; 

     // DB 
     Connection conn = null; 
     String url = "jdbc:jtds:sqlserver://*****:*****/jiradb"; 
     String driver = "net.sourceforge.jtds.jdbc.Driver"; 
     String userName = "*******"; 
     String password = "*******"; 
     String sqlQuery = null; 
     Statement statement = null; 
     ResultSet resultSet = null; 

     Class.forName(driver).newInstance(); 
     conn = DriverManager.getConnection(url, userName, password); 

     // Get all the issues that has the custom field set 
     sqlQuery = " SELECT t2.id AS IssueId, t1.stringvalue AS JiraVersion " + "\n" + 
         " FROM jiradb.jiraschema.customfieldvalue t1 " + "\n" + 
         " INNER JOIN jiradb.jiraschema.jiraissue t2 " + "\n" + 
         " ON  t1.issue = t2.id " + "\n" + 
         " WHERE t1.customfield = " + Long.toString(cfID) + " " + "\n" + 
         " AND t1.stringvalue IS NOT NULL " + "\n" + 
         " AND t1.stringvalue != '' " + "\n" + 
         " AND t2.pkey LIKE 'SDEV-%' "; 

     // Iterate over the result set 
     statement = conn.createStatement(); 
     resultSet = statement.executeQuery(sqlQuery); 
     while (resultSet.next()) 
     { 
      issueId = resultSet.getString("IssueId"); 
      jiraVersion = resultSet.getString("JiraVersion"); 

      // Compare the version from jira with the user provided version 
      // This is my own function that does char-by-char comparison 
      if(compareVersions(jiraVersion, userVersion, operator)) 
      { 
       // Get the issue object to add to the result 
       issue = ComponentManager.getInstance().getIssueManager().getIssueObject(Long.parseLong(issueId)); 

       // Add the issue to the result 
       literals.add(new QueryLiteral(operand, issue.getId())); 
      } 
     } 

     // Return all the matching issues here 
     return literals; 
    } 
    catch(Exception e) 
    { 
     // Exception handling 
    } 

    return null; 
} 

을 그리고이 플러그인을 사용하는 방법은 다음과 같습니다

issue in searchIssues('Build Reported', '>', '5.1.104');