From f33f8e38f413b4b63f17b3c949827f93206ffe3b Mon Sep 17 00:00:00 2001 From: Alexey Belostotskiy Date: Thu, 5 Dec 2019 17:51:07 +0300 Subject: [PATCH] JD-794 improve indexing performance --- pom.xml | 2 +- .../groovy/impl/jql/JqlFieldSearcher.java | 10 +++--- .../jql/indexers/LastUpdatedByIndexer.java | 35 ++++++++++++------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index fe164b88..d31835bb 100644 --- a/pom.xml +++ b/pom.xml @@ -328,7 +328,7 @@ ${jira.version} ${jira.version} - -Xmx2048m -Datlassian.mail.senddisabled=false + -Xmx4096m -Datlassian.mail.senddisabled=false ${atlassian.plugin.key} META-INF/plugin-descriptors diff --git a/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/JqlFieldSearcher.java b/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/JqlFieldSearcher.java index 012393c1..0304da38 100644 --- a/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/JqlFieldSearcher.java +++ b/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/JqlFieldSearcher.java @@ -1,7 +1,6 @@ package ru.mail.jira.plugins.groovy.impl.jql; import com.atlassian.jira.JiraDataTypeImpl; -import com.atlassian.jira.issue.changehistory.ChangeHistoryManager; import com.atlassian.jira.issue.customfields.SingleValueCustomFieldValueProvider; import com.atlassian.jira.issue.customfields.searchers.AbstractInitializationCustomFieldSearcher; import com.atlassian.jira.issue.customfields.searchers.CustomFieldSearcherClauseHandler; @@ -15,6 +14,7 @@ import com.atlassian.jira.issue.search.searchers.renderer.SearchRenderer; import com.atlassian.jira.issue.search.searchers.transformer.SearchInputTransformer; import com.atlassian.jira.jql.validator.ExactTextCustomFieldValidator; +import com.atlassian.jira.ofbiz.OfBizDelegator; import com.atlassian.jira.web.FieldVisibilityManager; import com.atlassian.plugin.spring.scanner.annotation.component.Scanned; import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; @@ -29,7 +29,7 @@ public class JqlFieldSearcher extends AbstractInitializationCustomFieldSearcher { private final FieldVisibilityManager fieldVisibilityManager; private final CustomFieldInputHelper customFieldInputHelper; - private final ChangeHistoryManager changeHistoryManager; + private final OfBizDelegator ofBizDelegator; private final CustomClauseQueryFactory clauseQueryFactory; private CustomFieldSearcherClauseHandler customFieldSearcherClauseHandler; @@ -40,12 +40,12 @@ public class JqlFieldSearcher extends AbstractInitializationCustomFieldSearcher public JqlFieldSearcher( @ComponentImport FieldVisibilityManager fieldVisibilityManager, @ComponentImport CustomFieldInputHelper customFieldInputHelper, - @ComponentImport ChangeHistoryManager changeHistoryManager, + @ComponentImport OfBizDelegator ofBizDelegator, CustomClauseQueryFactory clauseQueryFactory ) { this.fieldVisibilityManager = fieldVisibilityManager; this.customFieldInputHelper = customFieldInputHelper; - this.changeHistoryManager = changeHistoryManager; + this.ofBizDelegator = ofBizDelegator; this.clauseQueryFactory = clauseQueryFactory; } @@ -61,7 +61,7 @@ public void init(CustomField field) { this.searcherInformation = new CustomFieldSearcherInformation( field.getId(), field.getNameKey(), ImmutableList.of( - new LastUpdatedByIndexer(changeHistoryManager, fieldVisibilityManager) + new LastUpdatedByIndexer(fieldVisibilityManager, ofBizDelegator) ), new AtomicReference<>(field) ); diff --git a/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/indexers/LastUpdatedByIndexer.java b/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/indexers/LastUpdatedByIndexer.java index f5d56941..2ee22c6c 100644 --- a/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/indexers/LastUpdatedByIndexer.java +++ b/src/main/java/ru/mail/jira/plugins/groovy/impl/jql/indexers/LastUpdatedByIndexer.java @@ -1,28 +1,29 @@ package ru.mail.jira.plugins.groovy.impl.jql.indexers; import com.atlassian.jira.issue.Issue; -import com.atlassian.jira.issue.changehistory.ChangeHistory; -import com.atlassian.jira.issue.changehistory.ChangeHistoryManager; import com.atlassian.jira.issue.index.indexers.impl.UserFieldIndexer; +import com.atlassian.jira.ofbiz.OfBizDelegator; +import com.atlassian.jira.ofbiz.OfBizListIterator; import com.atlassian.jira.web.FieldVisibilityManager; import com.atlassian.plugin.spring.scanner.annotation.component.Scanned; import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; +import com.google.common.collect.ImmutableList; import org.apache.lucene.document.Document; +import org.ofbiz.core.entity.*; -import java.util.List; @Scanned public class LastUpdatedByIndexer extends UserFieldIndexer { public static final String LAST_UPDATED_BY_FIELD = "mrg_lastupd"; - private final ChangeHistoryManager changeHistoryManager; + private final OfBizDelegator ofBizDelegator; public LastUpdatedByIndexer( - @ComponentImport ChangeHistoryManager changeHistoryManager, - @ComponentImport FieldVisibilityManager fieldVisibilityManager + @ComponentImport FieldVisibilityManager fieldVisibilityManager, + @ComponentImport OfBizDelegator ofBizDelegator ) { super(fieldVisibilityManager); - this.changeHistoryManager = changeHistoryManager; + this.ofBizDelegator = ofBizDelegator; } @Override @@ -42,14 +43,24 @@ public boolean isFieldVisibleAndInScope(Issue issue) { @Override public void addIndex(Document document, Issue issue) { - List changeHistories = changeHistoryManager.getChangeHistories(issue); + OfBizListIterator changeGroups = this.ofBizDelegator.findListIteratorByCondition( + "ChangeGroup", + new EntityExpr("issue", EntityOperator.EQUALS, issue.getId()), + null, + null, + ImmutableList.of("created DESC", "id DESC"), + new EntityFindOptions().maxResults(1) + ); - if (changeHistories.size() > 0) { - ChangeHistory lastHistory = changeHistories.get(changeHistories.size() - 1); + GenericValue changeGroup = changeGroups.next(); + if (changeGroup != null) { + String author = changeGroup.getString("author"); - if (lastHistory.getAuthorKey() != null) { - this.indexUserKey(document, this.getDocumentFieldId(), lastHistory.getAuthorKey(), issue);// 22 + if (author != null) { + this.indexUserKey(document, this.getDocumentFieldId(), author, issue); } } + + changeGroups.close(); } }