refactor: use index mechanism to query extension point definitions (#6011)

#### 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
```
pull/6009/head
guqing 2024-05-30 15:49:15 +08:00 committed by GitHub
parent e881ee9a89
commit 9f6a441288
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 7 deletions

View File

@ -72,7 +72,13 @@ public class SchemeInitializer implements ApplicationListener<ApplicationContext
// plugin.halo.run
schemeManager.register(Plugin.class);
schemeManager.register(SearchEngine.class);
schemeManager.register(ExtensionPointDefinition.class);
schemeManager.register(ExtensionPointDefinition.class, indexSpecs -> {
indexSpecs.add(new IndexSpec()
.setName("spec.className")
.setIndexFunc(simpleAttribute(ExtensionPointDefinition.class,
definition -> definition.getSpec().getClassName())
));
});
schemeManager.register(ExtensionDefinition.class);
schemeManager.register(RoleBinding.class);

View File

@ -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<ExtensionPointDefinition> fetchExtensionPointDefinition(
Class<? extends ExtensionPoint> 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)));
}
}