Скажем, у меня есть хэш со списком драйверов доставки (для классического сценария цветочного магазина ). Каждый драйвер имеет рейтинг и URL-адрес сигнала события (ESL). Я хочу поднять событие только для трех лучших водителей в этом списке, отсортированных по рейтингу.
С реляционной базой данных я бы запустил такой запрос:
SELECT esl FROM driver ORDER BY ranking LIMIT 3;
Есть ли способ сделать это в KRL? Есть два требования:
- Способ сортировки хеша
- Способ ограничения количества итераций
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;
}
}
Но это немного глупо. Есть ли более KRL-иш способ сделать это? И как мне решить проблему заказа?
РЕДАКТИРОВАТЬ: Вот формат массива app:drivers
, чтобы облегчить ответ на вопрос:
[
{
"id": "1",
"rating": "5",
"esl": "http://example.com/esl"
},
{
"id": "2",
"rating": "3",
"esl": "http://example.com/esl2"
}
]