kingso_sort - Taocode

时间:2023-03-10 01:59:30
kingso_sort - Taocode

kingso_sort - Taocode

如何编写新sort

由于排序逻辑多种多样,kingso的排序设计成是由一个个排序对象串起的排序链条组成。排序对象之间可以任意组合(只需要改配置文件),就可以满足不同应用的排序需求。

下面就以SampleSort为例,来说明如何编写新的sort对象:

编写SampleSort对象

sort对象都要继承自SortModeBase

class SampleSort : public SortModeBase {

public:

SampleSort () {}

virtual ~SampleSort () {}

sort对象初始化方法,只会运行一次,一般用于读取配置中的内容

virtual int init(mxml_node_t* xNode, SortOperate* pOperate) {

if (xNode == NULL) {

return -1;

}

return 0;

}

sort对象预处理方法,每次查询都会调用,一般用于解析查询语句中的特定参数

virtual int prepare(SDM* pSDM) {

if (!_pCompareInfo)

return -1;

return 0;

}

sort对象处理方法,每次查询都会调用,算分、排序都会在这里进行

virtual int process(SDM* pSDM, sort_framework::SortQuery* pQuery,

SearchResult *pResult, MemPool *mempool)

{

if (pResult == NULL) {

return 0;

}

获取比较对象

SortCompare* pCompare; if (!(pCompare = pSDM->GetCmp(_pCompareInfo))) {

TLOG("Get Compare error");

return -1;

}

添加并读取加分字段

SDM_ROW *pAddRow = pSDM->AddProfRow("addweight"); if (pAddRow == NULL) {

return -1;

} if (!pAddRow->isLoad()) {

pAddRow->Load();

}

获取第一排序字段

SDM_ROW *pPSRow = pCompare->getRow(0); if (pPSRow == NULL) {

return -1;

}

修改第一排序分数

for (int32_t i=0; i<pPSRow->getDocNum(); i++) {

pPSRow->Add(i, pAddRow->Get(i));

}

return 0;

}

注册SampleSort对象

在AppManage.cpp的CreateModule方法添加:

if (strcasecmp("SampleSort",pModeName) == 0){

pret = new SampleSort;

}

修改sort配置文件

searcher_sort.xml:

<application name="SampleSort" type="SampleSort" compare="COMPARE1">

<condition type="param" name="samplesort" value="yes" />

</application> <application name="HeapSort" type="HeapSort" final="true" compare="COMPARE1">

<condition type="param" name="*" />

</application>

merger_sort.xml:

<application name="SampleSort" type="SampleSort" compare="COMPARE1">

<condition type="param" name="samplesort" value="yes" />

</application> <application name="HeapSort" type="HeapSort" final="true" compare="COMPARE1">

<condition type="param" name="*" />

</application>

如上配置,当query中含有samplesort=yes时,查询就会依次经过SampleSort和HeapSort排序对象。