Выполнение запроса в стиле «ORDER BY ... LIMIT ...» для хеша в KRL - PullRequest
2 голосов
/ 26 марта 2012

Скажем, у меня есть хэш со списком драйверов доставки (для классического сценария цветочного магазина ). Каждый драйвер имеет рейтинг и URL-адрес сигнала события (ESL). Я хочу поднять событие только для трех лучших водителей в этом списке, отсортированных по рейтингу.

С реляционной базой данных я бы запустил такой запрос:

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;
    }
}

Но это немного глупо. Есть ли более KRL-иш способ сделать это? И как мне решить проблему заказа?

РЕДАКТИРОВАТЬ: Вот формат массива app:drivers, чтобы облегчить ответ на вопрос:

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

1 Ответ

2 голосов
/ 26 марта 2012

Не зная форму хеша, невозможно дать вам конкретный ответ, но вы можете использовать оператор сортировки для сортировки, а затем использовать оператор выбора или хеш

Что-то вроде

driver_data.sort (function () {...}). pick ("$ .. что-то [: 2]")

"что-то" - это имя из хэша соответствующего поля.

...