Пример того, как добавить вторичный индекс при сохранении объекта в Riak с Java-клиентом?

Я храню хэш-карту в ведре риака следующим образом:

bucket.store(key, docHashMap).execute();

Я хотел бы сохранить объект со вторичным индексом.

Как бы я это сделал? Я знаю, что у IRiakObject есть метод addIndex, но как мне получить доступ к IRiakObject до его сохранения?

Я бы подумал, что то, что я пытаюсь сделать, - это ожидаемый вариант использования, но я не могу найти никакой документации или примеров по этому поводу. Если вы можете указать мне на один, который был бы очень признателен.

Спасибо!

Обновление:

@Brian Roach ответил на этот вопрос в списке рассылки Riak и ниже. Вот пользовательский класс, который я написал, который расширяет HashMap:

class DocMap extends HashMap<String, Object> {
    /**
     * Generated id
     */
    private static final long serialVersionUID = 5807773481499313384L;

    @RiakIndex(name="status") private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

Я по-прежнему могу использовать объект как обычную хэш-карту и хранить ключи и значения, но он также будет записывать «статус» во вторичный индекс (и в конечном итоге будет называться «status_bin», поскольку это строка.


person chaimp    schedule 08.04.2013    source источник
comment
Поймал это в списке рассылки раньше здесь, но решил скопировать ответ для справки на SO.   -  person Brian Roach    schedule 09.04.2013
comment
Я полагаю, что многим было бы полезно, если бы пример использования класса, расширяющего HashMap, был бы частью документации. Делая это таким образом, вы можете иметь тот же уровень универсальности в клиенте Java, что и в клиенте python (т. е. что вы можете хранить подобные dict объекты — HashMaps — которые могут иметь произвольные имена полей, и все же указать поля для вторичного индекса и тому подобное)   -  person chaimp    schedule 09.04.2013


Ответы (1)


Если вы просто передаете экземпляр основного Java HashMap... вы не можете.

Способ JSONConverter по умолчанию работает с метаданными (такими как индексы) через аннотации.

Передаваемый объект должен иметь поле с аннотацией @RiakIndex("index_name"). Это поле может быть Long/Set<Long> или String/Set<String> (для индексов _int и _bin соответственно).

Они не преобразуются в JSON, поэтому они не повлияют на ваши сериализованные данные. У вас может быть несколько полей для нескольких индексов.

Вам не нужно добавлять «_int» или «_bin» к имени индекса в аннотации — это делается автоматически в зависимости от типа.

Проще всего было бы расширить HashMap и просто добавить аннотированные поля.

person Brian Roach    schedule 08.04.2013