对KRL中的哈希执行“ORDER BY ... LIMIT ...”样式查询

问题描述:

假设我有一个散列,其中包含传递驱动程序列表(对于传统的flower shop scenario)。每个驱动程序都有一个评级和一个事件信号URL(ESL)。我只想向该列表中排名前三的车手举办一场比赛,并按排名进行排序。对KRL中的哈希执行“ORDER BY ... LIMIT ...”样式查询

与关系数据库,我会运行这样的查询:

SELECT esl FROM driver ORDER BY ranking LIMIT 3; 

有没有办法在KRL做到这一点?有两个要求:

  1. 排序的哈希
  2. 的一种方式来限制次foreach迭代

第二个可以解决这样的数道:

rule reset_counter { 
    select when rfq delivery_ready 
    noop(); 
    always { 
     clear ent:loop_counter; 
     raise explicit event loop_drivers; 
    } 
} 

rule loop_on_drivers { 
    select when explicit loop_drivers 
    foreach app:drivers setting (driver) 
    pre { 
     esl = driver.pick("$.esl"); 
    } 
    if (ent:loop_counter < 3) then { 
     // Signal the driver's ESL 
    } 
    always { 
     ent:loop_counter += 1 from 0; 
    } 
} 

但是这是一种kludgy。是否有更多的KRL方法可以做到这一点?我应该如何解决订购问题?

编辑:这里是app:drivers阵列格式,让用户轻松回答的问题:

[ 
    { 
     "id": "1", 
     "rating": "5", 
     "esl": "http://example.com/esl" 
    }, 
    { 
     "id": "2", 
     "rating": "3", 
     "esl": "http://example.com/esl2" 
    } 
] 

不知道散列的形式,这是不可能给你一个明确的答案,但你可以使用排序操作者进行排序,然后使用pick操作或哈希

喜欢的东西

driver_data.sort(函数(){...})挑。( “$ ..东西[2]”)

“something”是相关字段散列的名称。

+0

这是否适用于排序功能? '函数(a,b){a.pick(“$ .. rating”)> b.pick(“$ .. rating”); }' – 2012-03-26 16:52:31

+1

是的,排序功能应该给你想要的结果。排序函数的一个变体是'sortedDrivers = app:drivers.sort(function(a,b){a {“rating”}> b {“rating”}});'' – edorcutt 2012-03-26 17:08:48