Допустим, у меня есть несколько свойств, по которым я могу или не хочу фильтровать (см. Ниже).
Создать фильтр, который фактически фильтрует по всем свойствам, довольно легко, комбинируя пять вызовов фильтра и добавляяодин объединенный индекс с пятью свойствами.
Но как мне охватить все возможные фильтры, если некоторые свойства не требуют фильтрации?
Один из вариантов - добавить индексы для всех возможных комбинаций, но это быстростановится трудно поддерживать и не кажется мне эффективным решением.
Еще один подход, о котором я думал, - это добавление «фиктивных» фильтров, например, установка milesDriven> -1, однако это исключит любые объекты, которыене имеют значений или имеют нулевые значения для этих полей, что тоже не то, что я хочу.
Какова рекомендуемая практика в этих случаях?
Мой текущий обходной путь выполняет "базовую" фильтрацию с использованиемобъективировать (например, если модель всегда является обязательным полем), а затем делать более полныйx фильтрация с использованием потоковых фильтров Java, однако я не уверен, что это будет достаточно производительным навсегда.
@Entity
public class Car {
@Id Long id;
@Index String model;
@Index String color;
@Index Boolean hasAC;
@Index Integer kilometersDriven;
@Index Date purchaseDate;
}
return objectify.get().load().type(Car.class)
.filter("model", model)
.filter("color", color)
.filter("hasAC", hasAC)
.filter("kilometersDriven", kilometersDriven)
.filter("purchaseDate", purchaseDate)
.list();
<datastore-index kind="Car">
<property name="model"/>
<property name="color"/>
<property name="hasAC"/>
<property name="kilometersDriven"/>
<property name="purchaseDate"/>
</datastore-index>