Skip to content

5.Provider

codingPao edited this page May 14, 2021 · 5 revisions

因为在某些场景下,定义实体已经无法表示非直接的查询条件,所以我们提供了Provider,使用Provider提供这些条件

  • AggProvider
  • CollapseProvider
  • IdProvider
  • MultiMatchFieldProvider
  • ScoreFunctionProvider
  • ScriptFieldProvider
  • ScriptProvider
  • ScrollProvider
  • SortProvider
  • SourceProvider
  • VersionProvider
  • HighlighterProvider

排序

排序

排序需要实现SortProvider接口。

@Data
public class SampleRecentOrderCondition implements SortProvider {
    private static final Sort[] SORTS = {
            //字段升序
            Sort.fieldAsc("createTime"),
            //脚本降序
            Sort.scriptStringDesc(Script.stored("order_script"))};
    @Must
    private Long cargoId;

    @Override
    public Sort[] getSorts() {
        return new Sort[0];
    }
}

Script Field 脚本字段

脚本字段需要实现ScriptFieldProvider接口。

@Data
public class SampleRecentOrderCondition implements ScriptFieldProvider {
    private static final ScriptField[] SCRIPT_FIELDS = new ScriptField[]{
            ScriptField.of("createTime", Script.stored("order_script"))
    };
    @Must
    private Long cargoId;

    @Override
    public ScriptField[] getScriptFields() {
        return new ScriptField[0];
    }
}

指定返回字段

自定返回字段,可以通过两种方式实现:

实现SourceProvider接口

public class ProductCondition implements SourceProvider {
    private static final String[] INCLUDE_FIELDS = {"id", "name"};
    private static final String[] EXCLUDE_FIELDS = {"label"};
    /**
     * 获取包含的字段列表
     *
     * @return 字段列表
     */
     @Override
    public String[] getIncludeFields() {
      return INCLUDE_FIELDS;
    }

    /**
     * 获取排除的字段列表
     *
     * @return 字段列表
     */
     @Override
    public String[] getExcludeFields() {
        return EXCLUDE_FIELDS;
    }
}

返回值实体类型定义

@Data
public class Product {
    private Long id;
    private String name;
    @Ignore
    private String label;
}

此返回值类型,说明返回的字段为:["id", "name"]

高亮搜索

搜索条件实现HighlighterProvider接口

@Data
public class SampleRecentOrderCondition implements HighlighterProvider {
    @Must(queryType = QueryType.MATCH)
    private String loadAddress = "河北";
    
    @Override
    public HighlighterBuilder highlighterBuilder() {
        return Highlighter.highlighter().addFields(Highlighter.field("loadAddress"));
    }
}

返回实体实现HighlightSource接口

@Data
public class RecentOrder implements HighlightSource {
    private Map<String, List<String>> highlightSource;

    /**
     * ebatis回调该方法传入高亮结果
     * @param highlightSource 高亮结果
     */
    @Override
    public void setHighlightSource(Map<String, List<String>> highlightSource) {
        this.highlightSource = highlightSource;
    }
}