Создавайте объективные фильтры адаптивно - PullRequest
0 голосов
/ 19 сентября 2019

Допустим, у меня есть несколько свойств, по которым я могу или не хочу фильтровать (см. Ниже).

Создать фильтр, который фактически фильтрует по всем свойствам, довольно легко, комбинируя пять вызовов фильтра и добавляяодин объединенный индекс с пятью свойствами.

Но как мне охватить все возможные фильтры, если некоторые свойства не требуют фильтрации?

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

Еще один подход, о котором я думал, - это добавление «фиктивных» фильтров, например, установка 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>

1 Ответ

1 голос
/ 19 сентября 2019

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

Обратитесь к следующему, в котором говорится о зигзагообразном объединении слиянием (кажется, что основная статья о движке приложений больше не доступна)

Appengine ZigZag Merge Join Algo

Это может уменьшить количество индексов, по-прежнему обеспечивая гибкость для ваших фильтров.

...