2012-03-26 29 views
2

假設我有一個散列,其中包含傳遞驅動程序列表(對於傳統的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" 
    } 
] 

回答

2

不知道散列的形式,這是不可能給你一個明確的答案,但你可以使用排序操作者進行排序,然後使用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