Найти объект, который соответствует большинству критериев - PullRequest
0 голосов
/ 11 января 2011

У меня есть некоторые свойства, скажем,

color = blue
age = 22
name = Tom

Из числа объектов в хранилище данных, как я могу получить объект, который соответствует большинству свойств?Конечно, я мог бы сделать:

query.filter('color =', 'blue')
query.filter('age =', '22')
query.filter('name =', 'Tom')

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

1 Ответ

2 голосов
/ 12 января 2011

Вы в основном запрашиваете оператор ИЛИ, что невозможно сделать с одним запросом. Я думаю, у вас есть два варианта:

1) Добавьте оператор ИЛИ, создав подкласс MultiQuery. Это все еще выполнит несколько запросов под капотом, и упорядочивание и курсоры не будут работать.

2) Предварительно вычислите все возможные комбинации ваших трех свойств, поместите их в StringListProperty, а затем используйте оператор IN. Например, ваша модель будет выглядеть следующим образом:

m.col_age_name = ['c:blue, a:22', 'c:blue, n:Tom', \
                  'a:22, n:Tom', 'a:22, c:blue, n:Tom']

Затем вы запускаете фильтр:

q.filter('col_age_name IN', ['c:blue, a:22', 'c:blue, n:Tom', 'a:22, n:Tom'])

У этого решения есть проблемы: (a) оно выполняет несколько запросов изнутри, (b) вам нужно запустить его три раза (один раз для 1, 2 и 3 свойств), (c) оно не будет поддерживать порядок или курсоры, и (г) это делает управление данными беспорядок. Единственное преимущество заключается в том, что оно уменьшает максимальное количество вызовов фильтра, которое вам нужно сделать, с 7 до 3.

Это явно больше хлопот, чем стоит. Я бы просто выполнил простой запрос семь раз, у которого есть недостатки (a) и (c), но нет (d).

...