Riak 2i - обновление удаляет вторичные индексы
Я использую официальный Riak Java клиент v2.0.2. Когда я обновляю ранее записанное значение (с индексами 2i), вторичные индексы не сохраняются.
Вот как я обновляю:
Location location = new Location(this.namespace, key);
UpdateValue updateOp = new UpdateValue.Builder(location)
.withFetchOption(FetchValue.Option.DELETED_VCLOCK, true)
.withUpdate(new RiakKVUpdateValue(values))
.build();
И это мой класс обновления:
public class RiakKVUpdateValue extends Update<Map<String, String>> {
private final Map<String, String> value;
public RiakKVUpdateValue(HashMap<String, ByteIterator> values) {
this.value = StringByteIterator.getStringMap(values);
}
@Override
public Map<String, String> apply(Map<String, String> original) {
return this.value;
}
}
Я не нашел ничего в документах об обновлении объектов с индексами 2i.
- Я делаю что-то не так?
- Должен ли я делать чтение / изменение / запись вручную?
1 ответ
Вы должны получить индекс и записывать его каждый раз, когда обновляете значение. Смотрите 2i Индексация объекта.
Я бы предложил создать поле для хранения индекса и аннотировать его @RiakIndex
, Поле, аннотированное этой аннотацией, автоматически заполняется значениями 2i клиентом Java при получении. Затем скопируйте его значение в RiakKVUpdateValue.apply()
чтобы сохранить его. В качестве альтернативы, получите и запишите две отдельные команды, как вы уже упоминали. Это позволит вам контролировать метаданные, которые вы хотите записать обратно. Не забудьте заполнить VClocks.
PS Сохранение 2i автоматически может быть плохой идеей, поскольку не очевидно, что пользователь захочет сохранить старые значения 2i. Я считаю, что именно поэтому решение остается за пользователем.