From 9f6a44128867410b07c1129304d205aeb507a2bf Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Thu, 30 May 2024 15:49:15 +0800 Subject: [PATCH] refactor: use index mechanism to query extension point definitions (#6011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvement /area core /kind milestone 2.16.x #### What this PR does / why we need it: 使用索引机制来查询扩展点定义 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../run/halo/app/infra/SchemeInitializer.java | 8 ++++++- .../DefaultExtensionGetter.java | 21 +++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java index 79fcc0800..660e247bb 100644 --- a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java +++ b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java @@ -72,7 +72,13 @@ public class SchemeInitializer implements ApplicationListener { + indexSpecs.add(new IndexSpec() + .setName("spec.className") + .setIndexFunc(simpleAttribute(ExtensionPointDefinition.class, + definition -> definition.getSpec().getClassName()) + )); + }); schemeManager.register(ExtensionDefinition.class); schemeManager.register(RoleBinding.class); diff --git a/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java b/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java index 1db8faea8..f42177dec 100644 --- a/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java +++ b/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java @@ -1,7 +1,8 @@ package run.halo.app.plugin.extensionpoint; +import static run.halo.app.extension.index.query.QueryFactory.equal; + import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -10,11 +11,16 @@ import org.pf4j.ExtensionPoint; import org.pf4j.PluginManager; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.data.domain.Sort; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import run.halo.app.extension.ListOptions; +import run.halo.app.extension.ListResult; +import run.halo.app.extension.PageRequestImpl; import run.halo.app.extension.ReactiveExtensionClient; +import run.halo.app.extension.router.selector.FieldSelector; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting.ExtensionPointEnabled; @@ -109,11 +115,14 @@ public class DefaultExtensionGetter implements ExtensionGetter { Mono fetchExtensionPointDefinition( Class extensionPoint) { - // TODO Optimize query - return client.list(ExtensionPointDefinition.class, definition -> - extensionPoint.getName().equals(definition.getSpec().getClassName()), - Comparator.comparing(definition -> definition.getMetadata().getCreationTimestamp()) + var listOptions = new ListOptions(); + listOptions.setFieldSelector(FieldSelector.of( + equal("spec.className", extensionPoint.getName()) + )); + var sort = Sort.by("metadata.creationTimestamp", "metadata.name").ascending(); + return client.listBy(ExtensionPointDefinition.class, listOptions, + PageRequestImpl.ofSize(1).withSort(sort) ) - .next(); + .flatMap(list -> Mono.justOrEmpty(ListResult.first(list))); } }