mirror of https://github.com/halo-dev/halo
refactor: optimize data acquisition from previous to next posts in a post (#5659)
#### What type of PR is this? /kind improvement /area core /milestone 2.15.x #### What this PR does / why we need it: 优化文章上一篇下一篇的查询方式避免瞬时内存占用过高 #### Does this PR introduce a user-facing change? ```release-note 优化文章上一篇下一篇的查询方式避免瞬时内存占用过高 ```pull/5685/head^2
parent
34febb4d5d
commit
3ef1461c32
|
@ -1,5 +1,8 @@
|
||||||
package run.halo.app.theme.finders.impl;
|
package run.halo.app.theme.finders.impl;
|
||||||
|
|
||||||
|
import static run.halo.app.extension.index.query.QueryFactory.and;
|
||||||
|
import static run.halo.app.extension.index.query.QueryFactory.equal;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -104,27 +107,25 @@ public class PostFinderImpl implements PostFinder {
|
||||||
@Override
|
@Override
|
||||||
public Mono<NavigationPostVo> cursor(String currentName) {
|
public Mono<NavigationPostVo> cursor(String currentName) {
|
||||||
return postPredicateResolver.getListOptions()
|
return postPredicateResolver.getListOptions()
|
||||||
.flatMapMany(postListOption ->
|
.flatMap(postListOption -> {
|
||||||
client.listAll(Post.class, postListOption, defaultSort())
|
var postNames = client.indexedQueryEngine()
|
||||||
|
.retrieve(Post.GVK, postListOption,
|
||||||
|
PageRequestImpl.ofSize(0).withSort(defaultSort())
|
||||||
)
|
)
|
||||||
.map(post -> post.getMetadata().getName())
|
.getItems();
|
||||||
.collectList()
|
|
||||||
.flatMap(postNames -> Mono.just(NavigationPostVo.builder())
|
|
||||||
.flatMap(builder -> getByName(currentName)
|
|
||||||
.doOnNext(builder::current)
|
|
||||||
.thenReturn(builder)
|
|
||||||
)
|
|
||||||
.flatMap(builder -> {
|
|
||||||
var previousNextPair = findPostNavigation(postNames, currentName);
|
var previousNextPair = findPostNavigation(postNames, currentName);
|
||||||
String previousPostName = previousNextPair.prev();
|
String previousPostName = previousNextPair.prev();
|
||||||
String nextPostName = previousNextPair.next();
|
String nextPostName = previousNextPair.next();
|
||||||
return fetchByName(previousPostName)
|
var builder = NavigationPostVo.builder();
|
||||||
.doOnNext(builder::previous)
|
var currentMono = getByName(currentName)
|
||||||
.then(fetchByName(nextPostName))
|
.doOnNext(builder::current);
|
||||||
.doOnNext(builder::next)
|
var prevMono = fetchByName(previousPostName)
|
||||||
.thenReturn(builder);
|
.doOnNext(builder::previous);
|
||||||
|
var nextMono = fetchByName(nextPostName)
|
||||||
|
.doOnNext(builder::next);
|
||||||
|
return Mono.when(currentMono, prevMono, nextMono)
|
||||||
|
.then(Mono.fromSupplier(builder::build));
|
||||||
})
|
})
|
||||||
.map(NavigationPostVo.NavigationPostVoBuilder::build))
|
|
||||||
.defaultIfEmpty(NavigationPostVo.empty());
|
.defaultIfEmpty(NavigationPostVo.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,8 +143,7 @@ public class PostFinderImpl implements PostFinder {
|
||||||
String categoryName) {
|
String categoryName) {
|
||||||
var fieldQuery = QueryFactory.all();
|
var fieldQuery = QueryFactory.all();
|
||||||
if (StringUtils.isNotBlank(categoryName)) {
|
if (StringUtils.isNotBlank(categoryName)) {
|
||||||
fieldQuery =
|
fieldQuery = and(fieldQuery, equal("spec.categories", categoryName));
|
||||||
QueryFactory.and(fieldQuery, QueryFactory.equal("spec.categories", categoryName));
|
|
||||||
}
|
}
|
||||||
var listOptions = new ListOptions();
|
var listOptions = new ListOptions();
|
||||||
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
||||||
|
@ -154,8 +154,7 @@ public class PostFinderImpl implements PostFinder {
|
||||||
public Mono<ListResult<ListedPostVo>> listByTag(Integer page, Integer size, String tag) {
|
public Mono<ListResult<ListedPostVo>> listByTag(Integer page, Integer size, String tag) {
|
||||||
var fieldQuery = QueryFactory.all();
|
var fieldQuery = QueryFactory.all();
|
||||||
if (StringUtils.isNotBlank(tag)) {
|
if (StringUtils.isNotBlank(tag)) {
|
||||||
fieldQuery =
|
fieldQuery = and(fieldQuery, equal("spec.tags", tag));
|
||||||
QueryFactory.and(fieldQuery, QueryFactory.equal("spec.tags", tag));
|
|
||||||
}
|
}
|
||||||
var listOptions = new ListOptions();
|
var listOptions = new ListOptions();
|
||||||
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
||||||
|
@ -166,8 +165,7 @@ public class PostFinderImpl implements PostFinder {
|
||||||
public Mono<ListResult<ListedPostVo>> listByOwner(Integer page, Integer size, String owner) {
|
public Mono<ListResult<ListedPostVo>> listByOwner(Integer page, Integer size, String owner) {
|
||||||
var fieldQuery = QueryFactory.all();
|
var fieldQuery = QueryFactory.all();
|
||||||
if (StringUtils.isNotBlank(owner)) {
|
if (StringUtils.isNotBlank(owner)) {
|
||||||
fieldQuery =
|
fieldQuery = and(fieldQuery, equal("spec.owner", owner));
|
||||||
QueryFactory.and(fieldQuery, QueryFactory.equal("spec.owner", owner));
|
|
||||||
}
|
}
|
||||||
var listOptions = new ListOptions();
|
var listOptions = new ListOptions();
|
||||||
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
listOptions.setFieldSelector(FieldSelector.of(fieldQuery));
|
||||||
|
|
Loading…
Reference in New Issue