dp2 icon indicating copy to clipboard operation
dp2 copied to clipboard

dp2library GetSearchResult() API 增加结果集排序功能

Open DigitalPlatform opened this issue 4 years ago • 10 comments

dp2library 最新版为 GetSearchResult() API 增加了创建本地结果集并进行排序的功能。所谓本地是指 dp2library 模块本地,即结果集会被完整获取到 dp2library 本地,然后进行排序。

通过在 strBrowseInfoStyle 参数中增加 "sort:xxx" 子参数来启用本地结果集和排序功能,其中 xxx 表示排序列定义。例如,"sort:1|2",表示按照第一列和第二列排序。1 表示 Cols 中的第一列,而 0 表示 Path。如果数字为负数,表示按照降序排序。例如,"sort:-1|2",表示按照第一列降序排序,如果第一列相同则按照第二列升序排序。

当 Searchxxx() API 检索命中的结果集中记录太多的时候,用上述命令创建 dp2library 本地结果集速度会较慢。解决办法是:1) 限制 Searchxxx() API 的最大命中数;2) 通过为 GetSearchResult() API 的 strBrowseInfoStyle 参数中增加 "sortmaxcount:xxx" 子参数来限制创建的本地结果集中的记录数(其中 xxx 是一个数字)。

使用含有 sort 子参数的 GetSearchResult() API 第一次调用的时候,时间会较长。前端要注意为 LibraryChannel 设置恰当的 Timeout 值,以避免时间不够用于创建本地结果集。后继的调用速度则会很快。

GetSearchResult() API 的 strResultSetName 参数用来指定结果集名。结果集名分为 Session 和全局两类。全局结果集名的特点是第一字符为 #

dp2library 为 Session 创建的本地结果集,存储在 Session 临时目录中;为全局创建的本地结果集,存储在 dp2library 的临时目录中。前者在 Session 结束销毁的时候自动删除;后者在本地结果集最后一次使用以后 24 小时自动删除。

DigitalPlatform avatar Sep 12 '21 13:09 DigitalPlatform

测试要点

建议用 testrestlibrary 小前端来进行测试。

  1. 先用 SearchBiblio() API 对书目库进行检索。然后用 GetSearchResult() API 获取和观察结果集里面的记录,strBrowseInfoStyle 参数里面注意包含 sort:xxx 命令。
  2. 先用 SearchBiblio() API 对书目库进行检索,命中较多记录条数。然后用 GetSearchResult() API 获取结果集里面记录的时候,strBrowseInfoStyle 参数里面除了包含 sort:xxx 命令外,还要包含 sortmaxcount:xxx 命令,以验证可以获取到比 SearchBiblio() 时候命中的数量更少的记录。从 GetSearchResult() API 的 result.Value 值能看出这个较少的数量。
  3. 观察 dp2library Session 失效时候,本地结果集文件是否被自动删除。
  4. 检索产生全局结果集(结果集名字第一字符为 #),并使用带有 sort:xxx 命令的 GetSearchResult() API 一次或多次,令 dp2library 创建本地全局结果集,在 dp2library 临时目录里面能观察到它的临时文件。等 24 小时再观察,这个临时文件应该被自动删除。此时再用 GetSearchResult() API 去获取应该找不到这个结果集。
  5. 理论上 strBrowseInfoStyle 参数里面应该包含 id,cols 命令。如果不包含 id 命令,则无法返回记录路径;如果不包含 cols 命令,则无法返回浏览列。这两类信息对于创建 dp2library 本地结果集至关重要。dp2library 中首次执行(带有 sort:xxx 的) GetSearchResult() API 的时候,无论前端请求的 strBrowseInfoStyle 中是否包含 id,cols,程序都会自动加上这两项用于创建 dp2library 本地结果集,但当返回浏览记录给前端的时候,仍会按照 strBrowseInfoStyle 中是否包含了 id,cols 来准确返回,测试时候请测试包含和不包含 id,cols 方式并观察结果是否正确。

DigitalPlatform avatar Sep 12 '21 13:09 DigitalPlatform

测试目录:

  1. 观察getsearchresult()获取时不加sort字符时的检索速度----应比加了sort速度快很多(需大数据量测试)
  2. 观察不加sort时,是否产生session临时文件
  3. 观察加了sort之后 ,是否产生session临时文件----预期:应产生

测试sort新功能

  1. 测试sort:xxx是否按照XXX排序。 1.1 配置sort:xxx按照ID号排序时,观察是否符合预期 1.2 配置sort:xxx按照刊名排序时,观察是否符合预期 1.3 配置sort:xxx按照ISBN排序时,观察是否符合预期
  2. 观察sort:-1是否按照第一列倒续排列
  3. 观察sort:1|2是否优先按照第一列排序,再按照第二列排序

wuayang001 avatar Sep 13 '21 03:09 wuayang001

测试用例 1

测试目的:

观察getsearchresult()获取时不加sort字符时的检索速度----应比加了sort速度快很多(需大数据量测试)

测试步骤:

  1. 大备份恢复数据量较大的dp2library。(至少书目条数在10000以上)
  2. 打开testrestlibrary 登录管理员账号
  3. 点击SearchBiblio接口,
fromstyle:recid,bibliodbname:中文图书,strResultSetName:test,nPerMax:-1
  1. 点击searchbiblio,检索结果如下:
{"SearchBiblioResult":{"ErrorCode":0,"ErrorInfo":"","Value":39582},"strQueryXml":"<target list='中文图书:__id'><option warning='0'\/><item><word><\/word><match><\/match><relation>=<\/relation><dataType>string<\/dataType><maxCount>-1<\/maxCount><\/item><lang><\/lang><\/target>"}
  1. 点击getsearchresult接口,
strResultSetName:test,IStart:0,ICount:10
  1. 点击getsearchresult,检索时间大概不到一秒钟。结果如下:
{"GetSearchResultResult":{"ErrorCode":0,"ErrorInfo":"","Value":39582},"searchresults":[{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null}]}
  1. 随后,点击getsearchresult接口。在strBrowserinfostyle:sort1|2,点击getsearchresult
  2. 界面卡顿了大概十秒钟后出现如下结果:加了sort之后,会后明显的时间上的差异 符合预期
{"GetSearchResultResult":{"ErrorCode":0,"ErrorInfo":"","Value":39582},"searchresults":[{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null},{"Cols":null,"Keys":null,"Path":"","RecordBody":null}]}

测试结果:

20210913-wy:dp2library测试版:3.92 加了sort之后检索时间上会变慢很多,因为他会把检索集中的所有结果获取一遍再重新排序,最后再根据命中数(10)显示出前10条记录 测试结果符合预期

wuayang001 avatar Sep 13 '21 04:09 wuayang001

测试用例 2

测试目的:

观察不加sort时,是否产生session临时文件---预期:不产生session临时文件

测试步骤:

  1. 打开实例对应的数据文件夹
  2. 观察到文件夹下面新增session文件
  3. 点击之后,清空里面文件,创建测试的全新环境
  4. 打开testrestlibrary 登录管理员账号。
  5. 点击SearchBiblio接口,fromstyle:recid,bibliodbname:中文图书,strResultSetName:test,nPerMax:-1
  6. 点击getsearchresult接口,strResultSetName:test,IStart:0,ICount:10,执行检索
  7. 随后打开session文件,点击之后观察里面的内容为空。

测试结果:

20210913-wy:dp2library测试版:3.92 测试结果符合预期

wuayang001 avatar Sep 13 '21 05:09 wuayang001

测试用例 3

测试目的:

观察加了sort之后 ,是否产生session临时文件----预期:应产生

测试步骤:

  1. 打开实例对应的数据文件夹
  2. 观察到文件夹下面新增session文件
  3. 点击之后,清空里面文件,创建测试的全新环境
  4. 打开testrestlibrary 登录管理员账号。
  5. 点击SearchBiblio接口,fromstyle:recid,bibliodbname:中文图书,strResultSetName:test,nPerMax:-1
  6. 点击getsearchresult接口,strResultSetName:test,IStart:0,ICount:10,strBrowserinfostyle:sort1|2,执行检索
  7. 随后打开session文件,点击之后观察里面新增50599928文件夹,点击之后里面有一条sort_test文件。创建时间为:20219/13 13:37

测试结果:

20210913-wy:dp2library测试版:3.92 测试结果符合预期

文件夹名字取名含义:

这是每个 Session 对象的 HashCode,就是 .NET 为对象分配的一个唯一的编号,对象生存期间确保这个编号不会变化,也不会和其它任何对象重复。代码用了简单的办法来创建 Session 的临时文件目录,直接用了这个编号

wuayang001 avatar Sep 13 '21 05:09 wuayang001

测试用例 1.1

测试目的:

1.1 配置sort:xxx按照题名排序时,观察是否符合预期

测试步骤:

  1. 打开testrestlibrary测试工具。连接测试所需的服务器
  2. 登录supervisor账号,点击searchbioblio接口
  3. 书目库名选择:中文图书;检索结果名字选择输入:test;检索条数:-1。点击searchbioblio
  4. 点击getsearchresult接口。检索结果输入:test;start:1;count:-1;browseinfostyle:id,cols,sort:1
  5. 检索出的结果,以书目的第二列升序排列。(第二列为书名,升序指的是按照首字拼音首字母升序) 符合预期

测试结果:

20210915-wy:dp2library正式版:3.93 测试结果符合预期

wuayang001 avatar Sep 15 '21 06:09 wuayang001

测试用例 1.2

测试目的:

1.1 配置sort:xxx按照ID号排序时,观察是否符合预期

测试步骤:

  1. 打开testrestlibrary测试工具。连接测试所需的服务器
  2. 登录supervisor账号,点击searchbioblio接口
  3. 书目库名选择:中文图书;检索结果名字选择输入:test;检索条数:-1。点击searchbioblio
  4. 点击getsearchresult接口。检索结果输入:test;start:1;count:-1;browseinfostyle:id,cols,sort:0
  5. 检索出的结果,以id号升序排序。

测试结果:

20210915-wy:dp2library正式版:3.93 测试结果符合预期

wuayang001 avatar Sep 15 '21 08:09 wuayang001

测试用例 1.3

测试目的:

配置sort:xxx按照ISBN排序时,观察是否符合预期

测试步骤:

  1. 打开内务,登录服务器。进入书目检索窗,检索全部图书。观察到ISBN号在第九列。
  2. 打开testrestlibrary测试工具。连接测试所需的服务器
  3. 登录supervisor账号,点击searchbioblio接口
  4. 书目库名选择:中文图书;检索结果名字选择输入:test;检索条数:-1。点击searchbioblio
  5. 点击getsearchresult接口。检索结果输入:test;start:1;count:-1;browseinfostyle:id,cols,sort:8
  6. 检索出的结果,以ISBN号升序排列,符合预期

测试结果:

20210915-wy:dp2library正式版:3.93 测试结果符合预期

wuayang001 avatar Sep 15 '21 08:09 wuayang001

测试用例 2

测试目的:

观察sort:-0是否按照id号倒续排列

测试步骤:

  1. 打开testrestlibrary测试工具。连接测试所需的服务器
  2. 登录supervisor账号,点击searchbioblio接口
  3. 书目库名选择:中文图书;检索结果名字选择输入:test;检索条数:-1。点击searchbioblio
  4. 点击getsearchresult接口。检索结果输入:test;start:1;count:-1;browseinfostyle:id,cols,sort:0
  5. 检索出的结果,以id号升序排序。

测试结果:

20210915-wy:dp2library正式版:3.93 测试结果符合预期

wuayang001 avatar Sep 15 '21 08:09 wuayang001

测试用例 3

测试目的:

观察sort:8|0是否优先按照ISBN排序,当有两个ISBN重复时再按照第ID号排序

测试环境:

创建两个相同的ISBN号书目

测试步骤:

  1. 打开testrestlibrary测试工具。连接测试所需的服务器
  2. 登录supervisor账号,点击searchbioblio接口
  3. 书目库名选择:中文图书;检索结果名字选择输入:test;检索条数:-1。点击searchbioblio
  4. 点击getsearchresult接口。检索结果输入:test;start:1;count:-1;browseinfostyle:id,cols,sort:8|-0
  5. 检索出的结果,首先按照ISBN号排列,然后当碰见相同的ISBN号时,再按照降序id号排列, 符合预期

测试结果:

20210915-wy:dp2library正式版:3.93 测试结果符合预期

wuayang001 avatar Sep 15 '21 08:09 wuayang001