Как выполнить сортированный поиск с помощью API Apache Directory - PullRequest
0 голосов
/ 06 марта 2019

Я использую API-каталог Apache для запроса сервера OpenLDAP. Я думаю, что этот код должен возвращать результаты, отсортированные по sn, но они возвращаются в случайном порядке.

    SearchRequest req = new SearchRequestImpl();
    req.setScope(SearchScope.ONELEVEL);
    req.addAttributes("*");
    req.setTimeLimit(0);
    req.setBase(searchDn);
    req.setFilter("(objectclass=posixAccount)");

    SortRequest sortRequest = new SortRequestControlImpl();
    sortRequest.addSortKey(new SortKey("sn"));
    req.addControl(sortRequest);

    try (EntryCursor cursor = new EntryCursorImpl(connection.search(req))) {        
        for (Entry entry : cursor) {
            System.out.println("sn: " + entry.get("sn").getString());                
        }
    }

Вывод этого кода из данных моего тестового сервера LDAP:

sn: Trainee 
sn: Admin 
sn: User 
sn: Supervisor 
sn: Supervisor

Я основал код на этом интеграционном тесте https://github.com/apache/directory-server/blob/master/server-integ/src/test/java/org/apache/directory/server/operations/search/SortedSearchIT.java и не вижу, что сделал неправильно.

Может кто-нибудь дать совет? Спасибо.

1 Ответ

0 голосов
/ 11 марта 2019

После долгих раскопок мне пришлось сделать две вещи, чтобы заставить это работать.

Сначала добавьте поддержку sssvlv на мой сервер OpenLDAP

Это ldif

dn: cn=module{0}, cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: sssvlv.la

dn: olcOverlay=sssvlv,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcSssVlvConfig
olcSssVlvMax: 10
olcSssVlvMaxKeys: 5

Затем я должен был указать идентификатор правила соответствия для ключа сортировки

SortKey sk = new SortKey( "sn", SchemaConstants.NUMERIC_STRING_ORDERING_MATCH_MR_OID);

Надеюсь, это кому-нибудь поможет!

...