Lovefield - динамически создавать предикат lf.op.and () - PullRequest
0 голосов
/ 31 марта 2020

У меня возникли проблемы с динамическим построением предиката с использованием Lovefield. Я имею в виду, что я хочу получить все элементы из таблицы, которые имеют статус = 0 и флаг = 2.

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

Допустим, я держу предикат для переменной и использую его в своем запросе так: db.select().from(myTable).where(pred).exec()

По умолчанию Предикат будет выглядеть так:

var pred = lf.op.and(myTable.Status.eq(0), myTable.Flag.eq(2))

Когда пользователь введет SearchText, я хочу иметь возможность изменить предикат на это:

var pred = lf.op.and(myTable.Status.eq(0), myTable.Flag.eq(2), myTable.SearchableText.eq(userInput));

Поскольку пользователь может выбрать множество фильтров в моем приложении, таких как текст, даты и т. Д. c .. Я хочу иметь возможность строить предикат на основе выбора пользователя.

Я попытался создать и передать массив типа [myTable.Status.eq(0), myTable.Flag.eq(2)] to lf.op.and (), но он не работает.


[ОБНОВЛЕНИЕ]

В случае, если кто-то столкнется с той же проблемой, мне удалось сделать это работать с этим: https://github.com/google/lovefield/blob/master/demos/olympia_db/angular/demo.js#L342 -L345

В моем случае я сделал это:

var predicates = [myTable.Status.eq(0), myTable.Flag.eq(2)];
if(userInput!=null && userInput.length>0)
   predicated.push(myTable.SearchableText.eq(userInput));

var pred  = lf.op.and.apply(null, predicates);
db.select().from(myTable).where(pred).exec();
...