1

JQLクエリに苦労しています。

テキストフィールドである「BuildReported」というカスタムフィールドがあります。「4.7.323H」、「5.1.123L」、「3.1.456E」などの値があります。

ユーザー指定のバージョンの後に報告されたすべての問題を取得する簡単なクエリを作成する必要があります。

JQL関数プロトタイプ:searchIssues('Build Integrated'、'>'、 '4.7.323B')

これを行うには、すべての問題についてビルドレポートを取得するJQLクエリを実行します。次に、各問題を繰り返し処理し、文字ごとの比較を実行して、現在の問題のビルドレポートバージョンがより大きいかどうかを判断します。ユーザーが指定したもの。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クエリビルダーに使用できるフィルターは他にないことに注意してください。

4

1 に答える 1

1

質問で説明した問題の代替案を見つけました。JQLを使用する代わりに、直接SELECTを実行することになり、これははるかに高速であることがわかりました。以下の関数は、JQLプラグインの一部です。コードは次のとおりです。

これは私がやったことです:

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');
于 2012-11-12T21:20:23.890 に答える