Кажется, я не могу найти указатель в правильном направлении, я даже не уверен, каковы условия, которые я должен исследовать, но бесчисленные часы поиска в Google, кажется, вращают меня в кругах, так что, надеюсь, коллективный улей может помочь интеллект переполнения стека.
Проблема в том, что мне нужен способ фильтрации данных в том, что я могу назвать только составным логическим деревом. В настоящее время система реализует простую систему фильтрации AND. Например, допустим, у нас есть набор данных людей. Вы добавляете несколько фильтров, которые показывают всем людям, где (Пол = Женщина) И (Возраст> 23) И (Возраст <30) И (Статус = Одинокий). Достаточно просто, перебирать каждый элемент, добавлять в допустимую коллекцию элементов, только если каждое условие выполняется. </p>
Проблема, с которой я сталкиваюсь, заключается в том, как мне справиться с тем, что пользователь может создавать сложные запросы, и / или или? Я имею в виду что-то вроде дерева, где каждый узел представляет, а выражение оценивает его потомков как true или false. В качестве упрощенного примера можно привести фильтр ((Пол == Мужчина И Возраст == 25) ИЛИ (Пол == Женский И Статус == Одинокий)) И IQ> 120. Извините, я не могу придумать лучшего примера в момент Но как бы вы представили дерево выражений такого типа и оценили элементы в коллекции по этим фильтрам? Какие ссылки могут помочь? Черт, что за чертов поиск в Google может привести к положительному направлению?!
Спасибо всем, кто может оказать любую помощь.
Вот пример составного запроса в древовидной форме с использованием набора данных людей
- Запрос - Покажите мне всех людей, где секс мужской или глаза зеленые или женский, глаза голубые или одинокий статус.
В паренской форме (Секс == Мужской && Глаза == Зеленый) || (Секс == Женский && (Глаза == Синий || Статус == Одинокий))
Так в древовидной форме я думаю
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
Я полагаю, что решение состоит в том, чтобы представить каждый узел, такой в структуре данных, как
Node
{
OpType - AND or OR
ExpressionField - The field to evaluate
ExpressionOp - =, !=, >, >=, <, <=
ExpressionValue - the value to compare the field's value against
Function Evaluate() - returns a bool
}
Таким образом, для данного узла оцените детей, если вы являетесь узлом AND, а затем верните true, если ваше выражение приводит к true, а все ваши дочерние элементы AND оцениваются как true или любой дочерний элемент OR оценивается как true и повторяется. *
Кажется, что удовлетворяет каждому концептуальному условию, которое я могу бросить, но мы сделаем это, как только я его осуществлю. Я опубликую реальный код позже, когда он будет работать, и картинки, чтобы лучше описать эту проблему для других.