update scan

This commit is contained in:
Shaun Chyxion 2018-03-31 09:15:10 +08:00
parent e61db1f379
commit 896d8cf61e
3 changed files with 40 additions and 30 deletions

View File

@ -19,10 +19,10 @@
</parent>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.8.RELEASE</spring.version>
<spring-boot.version>1.5.4.RELEASE</spring-boot.version>
<spring-boot.version>1.5.10.RELEASE</spring-boot.version>
<slf4j.version>1.7.23</slf4j.version>
<log4j.version>2.7</log4j.version>
<shiro.version>1.3.2</shiro.version>

View File

@ -1,8 +1,9 @@
package me.chyxion.tigon.service;
import java.util.List;
import javax.validation.constraints.Min;
import java.util.function.Function;
import me.chyxion.tigon.mybatis.Search;
import javax.validation.constraints.Min;
import me.chyxion.tigon.model.BaseModel;
import me.chyxion.tigon.model.ViewModel;
import me.chyxion.tigon.model.ListResult;
@ -89,14 +90,14 @@ public interface BaseQueryService<PrimaryKey,
* scan model of all
* @param scanner scanner
*/
Model scan(@NotNull Scanner<Model> scanner);
Model scan(@NotNull Function<Model, Boolean> scanner);
/**
* scan model by search
* @param search search
* @param scanner scanner
*/
Model scan(Search search, @NotNull Scanner<Model> scanner);
Model scan(Search search, @NotNull Function<Model, Boolean> scanner);
/**
* scan model by search
@ -104,15 +105,11 @@ public interface BaseQueryService<PrimaryKey,
* @param search search
* @param scanner scanner
*/
Model scan(@Min(1) int batchSize, Search search, @NotNull Scanner<Model> scanner);
Model scan(@Min(1) int batchSize, Search search, @NotNull Function<Model, Boolean> scanner);
interface Scanner<T> {
/**
* scan model
* @param model model
* @return false to break
*/
boolean found(T model);
}
Model scan(@Min(1) int batchSize,
Search search,
@NotNull Function<Search, List<Model>> dataQuerier,
@NotNull Function<Search, Integer> countQuerier,
@NotNull Function<Model, Boolean> scanner);
}

View File

@ -2,8 +2,9 @@ package me.chyxion.tigon.service.support;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import me.chyxion.tigon.model.BaseModel;
import java.util.function.Function;
import me.chyxion.tigon.mybatis.Search;
import me.chyxion.tigon.model.BaseModel;
import me.chyxion.tigon.model.ViewModel;
import me.chyxion.tigon.model.ListResult;
import me.chyxion.tigon.mybatis.BaseMapper;
@ -116,7 +117,7 @@ public class BaseQueryServiceSupport
* {@inheritDoc}
*/
@Override
public Model scan(Scanner<Model> scanner) {
public Model scan(Function<Model, Boolean> scanner) {
return scan(null, scanner);
}
@ -124,7 +125,7 @@ public class BaseQueryServiceSupport
* {@inheritDoc}
*/
@Override
public Model scan(Search search, Scanner<Model> scanner) {
public Model scan(Search search, Function<Model, Boolean> scanner) {
return scan(scanBatchSize(), search, scanner);
}
@ -132,28 +133,40 @@ public class BaseQueryServiceSupport
* {@inheritDoc}
*/
@Override
public Model scan(int batchSize, Search search, Scanner<Model> scanner) {
log.info("Scan Model By Search [{}].", search);
int total = count(search);
public Model scan(int batchSize, Search search, Function<Model, Boolean> scanner) {
return scan(batchSize, search, this::list, this::count, scanner);
}
/**
* {@inheritDoc}
*/
@Override
public Model scan(final int batchSize,
Search search,
final Function<Search, List<Model>> dataQuerier,
final Function<Search, Integer> countQuerier,
final Function<Model, Boolean> scanner) {
log.info("Scan model by search [{}].", search);
int total = countQuerier.apply(search);
if (total > 0) {
if (search == null) {
log.debug("Scan Search Is Null, Use Default.");
log.debug("Scan search is null, use default.");
search = new Search();
}
for (int start = 0; start < total; start += batchSize) {
for (Model model : list(
search.offset(start)
.limit(Math.min(batchSize, total - start)))) {
if (scanner.found(model)) {
log.info("Model [{}] Found By Scanner.", model);
for (Model model : dataQuerier.apply(
search.offset(start)
.limit(Math.min(batchSize, total - start)))) {
if (scanner.apply(model)) {
log.info("Model [{}] found by scanner, stop scan.", model);
return model;
}
}
}
log.debug("No Matched Model Found By Scanner.");
log.info("Scan completed, no matched model found by scanner.");
}
else {
log.info("No Model To Scan By Search [{}].", search);
log.info("No model to scan by search [{}].", search);
}
return null;
}