private FilterOperationBase BuildFilter(FilterTreeNode node)
        {
            // Если узел - операция
            OperationTreeNode operationNode = node as OperationTreeNode;
            {
                if (operationNode != null)
                {
                    FilterOperation operation = new FilterOperation(operationNode.Operation);
                    foreach (object obj in operationNode.Items)
                    {
                        FilterTreeNode childNode = obj as FilterTreeNode;
                        if (childNode != null)
                        {
                            FilterOperationBase filter = BuildFilter(childNode);
                            if (filter != null)
                            {
                                operation.Children.Add(filter);
                            }
                        }
                    }
                    return operation;
                }
            }

            // Если узел - операнд
            OperandTreeNode operand = node as OperandTreeNode;
            if (operand != null)
            {
                return operand.Operand;
            }

            return null;
        }
        public void ByDefaultOperatorToExpressionConvertersAreTakenFromStaticProperty()
        {
            var  marker1    = "MARKER1";
            var  marker2    = "MARKER2";
            var  wasCalled  = false;
            Type typePassed = null;

            Config.DefaultOperatorToExpressionConverters.Add(marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
            {
                wasCalled  = true;
                typePassed = propTypeUnwrapped;
                return(Expression.Equal(Expression.Constant(marker1), Expression.Constant(marker1)));
            }));

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker2
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (\"MARKER1\" == \"MARKER1\"))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(wasCalled, Is.EqualTo(true));
            Assert.That(typePassed, Is.EqualTo(typeof(Int32)));
            Assert.That(result, Is.EquivalentTo(Collection));
        }
Exemple #3
0
        public void InOrNullTest()
        {
            var filter =
                new FilterTreeNode(
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "E",
                StringValue = "null",
                Operator    = "isnull"
            }),
                    LogicalOpertor.OR,
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "E",
                StringValue = "[1,2]",
                Operator    = "in"
            }));

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation =
                "Linq.GridQuery.Test.TestSubject[].Where(par => (Not(par.E.HasValue) Or IIF(par.E.HasValue, value(Linq.GridQuery.Test.TestEnum[]).Contains(par.E.Value), False)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(2)));
        }
        void item_ctrl_CustomCommandClick(object sender, CustomItemEventArgs e)
        {
            switch (e.Type)
            {
                case CustomControlTypes.Clear:
                    this.Items.Clear();
                    break;
                case CustomControlTypes.Delete:
                    FilterTreeNode node = this.Parent as FilterTreeNode;
                    if (node != null)
                    {
                        node.Items.Remove(this);
                    }
                    break;
                case CustomControlTypes.AddOperation:
                    OperationTreeNode operationNode = new OperationTreeNode(OperationTypes.And, false, m_Properties);
                    operationNode.ApplyFilter += new EventHandler(OnApplyFilter);
                    this.Items.Add(operationNode);
                    OperandTreeNode operand1_Node = new OperandTreeNode(m_Properties);
                    operand1_Node.ApplyFilter += new EventHandler(OnApplyFilter);
                    operationNode.Items.Add(operand1_Node);
                    break;
                case CustomControlTypes.AddOperand:
                    OperandTreeNode operandNode = new OperandTreeNode(m_Properties);
                    operandNode.ApplyFilter += new EventHandler(OnApplyFilter);
                    this.Items.Add(operandNode);
                    break;

            }
        }
Exemple #5
0
        public void IsNotNull()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "E",
                StringValue = "null",
                Operator    = "isnotnull"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => par.E.HasValue)";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(1)));

            filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "B",
                StringValue = "null",
                Operator    = "isnotnull"
            });

            query  = filter.WrapFilter(Collection);
            result = query.ToArray();

            expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.B != null))";
            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(2)));
        }
Exemple #6
0
        private FilterOperationBase BuildFilter(FilterTreeNode node)
        {
            // Если узел - операция
            OperationTreeNode operationNode = node as OperationTreeNode;
            {
                if (operationNode != null)
                {
                    FilterOperation operation = new FilterOperation(operationNode.Operation);
                    foreach (object obj in operationNode.Items)
                    {
                        FilterTreeNode childNode = obj as FilterTreeNode;
                        if (childNode != null)
                        {
                            FilterOperationBase filter = BuildFilter(childNode);
                            if (filter != null)
                            {
                                operation.Children.Add(filter);
                            }
                        }
                    }
                    return(operation);
                }
            }

            // Если узел - операнд
            OperandTreeNode operand = node as OperandTreeNode;

            if (operand != null)
            {
                return(operand.Operand);
            }

            return(null);
        }
        public void ByDefaultValueDeserializationFunctionIsTakenFromConfig()
        {
            var    marker1     = "MARKER1";
            string valCapture  = null;
            Type   typeCapture = null;

            Config.DefaultValueDeserialiationFunction = (val, type) =>
            {
                valCapture  = val;
                typeCapture = type;
                return(5);
            };

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = marker1,
                Operator    = "eq"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A == 5))";

            Assert.That(valCapture, Is.EqualTo(marker1));
            Assert.That(typeCapture, Is.EqualTo(typeof(int)));
            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(1));
            Assert.That(query.Single().A, Is.EqualTo(5));
        }
 public TreeNodeViewModel(
     FilterTreeNode filterTreeNode,
     IMessageBus messageBus)
 {
     _filterTreeNode = filterTreeNode;
     _messageBus     = messageBus;
 }
        public void TwoBranchesQueryWorks()
        {
            var filter = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "3",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "5",
                Operator    = "eq"
            })
                );

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => ((par.A == 3) Or (par.A == 5)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(2));
            Assert.That(query.ElementAt(0).A, Is.EqualTo(3));
            Assert.That(query.ElementAt(1).A, Is.EqualTo(5));
        }
        public void FullTest()
        {
            var filter =
                new FilterTreeNode(
                    new GridFilter("A", "gt", "3"),
                    LogicalOpertor.AND,
                    new FilterTreeNode(
                        new GridFilter("E", "isnull", "null"),
                        LogicalOpertor.OR,
                        new GridFilter("E", "in", "[1,2]")));

            var sort = new[]
            {
                new GridSort("C", isDescending: false, treatNullLowest: true),
                new GridSort("E", isDescending: true)
            };

            var gridQuery = new GridRequest()
            {
                Filter = filter,
                Sort   = sort,
                Skip   = 1,
                Take   = 5
            };

            var query  = gridQuery.WrapQuery(Collection);
            var result = query.ToArray();

            var expectation =
                "Linq.GridQuery.Test.TestSubject[].Where(par => " +
                "((par.A > 3) And (Not(par.E.HasValue) " +
                "Or IIF(par.E.HasValue, value(Linq.GridQuery.Test.TestEnum[]).Contains(par.E.Value), False))))" +
                ".OrderBy(Param_0 => Param_0.C.HasValue)" +
                ".ThenBy(Param_0 => Param_0.C)" +
                ".ThenByDescending(Param_1 => Param_1.E)" +
                ".Skip(1).Take(5)";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(new []
            {
                Collection.ElementAt(8),
                Collection.ElementAt(11),
                Collection.ElementAt(9),
                Collection.ElementAt(12),
                Collection.ElementAt(7)
            }));

            var queryWithCount = gridQuery.WrapQueryWithCount(Collection);
            var result2        = queryWithCount.Query.ToArray();

            Assert.That(result, Is.EquivalentTo(result2));
            Assert.That(queryWithCount.Count, Is.EqualTo(7));

            var resultWithCount = gridQuery.GetQueryResultWithCount(Collection);
            var result3         = resultWithCount.Result.ToArray();

            Assert.That(result, Is.EquivalentTo(result3));
            Assert.That(resultWithCount.Count, Is.EqualTo(7));
        }
Exemple #11
0
 void item_ctrl_CustomCommandClick(object sender, CustomItemEventArgs e)
 {
     switch (e.Type)
     {
     case CustomControlTypes.Delete:
         FilterTreeNode node = this.Parent as FilterTreeNode;
         if (node != null)
         {
             node.Items.Remove(this);
         }
         break;
     }
 }
Exemple #12
0
 public FilterOperationBase GetFilter()
 {
     if (Tree.Items.Count > 0)
     {
         FilterTreeNode node = Tree.Items[0] as FilterTreeNode;
         if (node != null)
         {
             FilterOperationBase res = BuildFilter(node);
             return(res);
         }
     }
     return(null);
 }
        public void FilterOnWrongPropertyThrows()
        {
            Assert.Throws <ArgumentException>(() =>
            {
                var filter = new FilterTreeNode(
                    new GridFilter()
                {
                    PropName    = "X",
                    StringValue = "4",
                    Operator    = "gt"
                });

                var query = filter.WrapFilter(Collection);
            });
        }
        public void ThrowsIfOperatorToExpressionConverterIsNotFound()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = "IGNORE"
            });

            Assert.Throws <ArgumentException>(() =>
            {
                var query = filter.WrapFilter(Collection);
            });
        }
Exemple #15
0
        public void IsNotNullThrowsForNonNullableTypes()
        {
            Assert.Throws <ArgumentException>(() =>
            {
                var filter = new FilterTreeNode(
                    new GridFilter()
                {
                    PropName    = "A",
                    StringValue = "0",
                    Operator    = "isnotnull"
                });

                var query  = filter.WrapFilter(Collection);
                var result = query.ToArray();
            });
        }
        public void GetLambdaExpressionTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "gt"
            });

            var lambdaExpression = filter.GetLambdaExpression <TestSubject>();

            var expectation = "par => (par.A > 4)";

            Assert.That(lambdaExpression.ToString(), Is.EqualTo(expectation));
        }
        public void NoValueDeserializationFunctionFoundThrowsOnWrap()
        {
            Config.DefaultValueDeserialiationFunction = null;

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "1",
                Operator    = "eq"
            });

            Assert.Throws <InvalidOperationException>(() =>
            {
                var query = filter.WrapFilter(Collection);
            });
        }
Exemple #18
0
        public void NotInTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "[1,5]",
                Operator    = "notin"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => Not(value(System.Int32[]).Contains(par.A)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(1).Take(1)));
        }
        public void CanHanldeEnums()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "D",
                StringValue = "3",
                Operator    = "eq"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.D == C))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(2)));
        }
Exemple #20
0
        public void DoesNotContainTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "B",
                StringValue = "'C'",
                Operator    = "doesnotcontain"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF((par.B != null), Not(par.B.Contains(\"C\")), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(1)));
        }
Exemple #21
0
        public void EndsWithTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "B",
                StringValue = "'A'",
                Operator    = "endswith"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF((par.B != null), par.B.EndsWith(\"A\"), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(1)));
        }
Exemple #22
0
        public void LteTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "3",
                Operator    = "lte"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A <= 3))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(2)));
        }
        public void CanHanldeNullables()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "C",
                StringValue = "3",
                Operator    = "gt"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF(par.C.HasValue, (par.C.Value > 3), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(2)));
        }
Exemple #24
0
        public void NotInTestNullableEnum()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "E",
                StringValue = "[1,3]",
                Operator    = "notin"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation =
                "Linq.GridQuery.Test.TestSubject[].Where(par => IIF(par.E.HasValue, Not(value(Linq.GridQuery.Test.TestEnum[]).Contains(par.E.Value)), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(1).Take(1)));
        }
        public void SingleFitlerWorks()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "gt"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A > 4))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(1));
            Assert.That(query.Single().A, Is.EqualTo(5));
        }
        public void AdditionalOperatorToExpressionConvertersProvidedOnPerInstanceBasisOverrideBaseOnesOfTheSameName()
        {
            var  marker1    = "MARKER1";
            var  marker2    = "MARKER2";
            var  wasCalled  = false;
            Type typePassed = null;

            Config.DefaultOperatorToExpressionConverters.Add(marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
            {
                throw new Exception("This should never be called.");
            }));

            var additionalOperatorToExpressionConverters =
                new Dictionary <string, OperatorHandler>()
            {
                { marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        wasCalled  = true;
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker1), Expression.Constant(marker1)));
                    }) }
            };

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker2
            },
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (\"MARKER1\" == \"MARKER1\"))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(wasCalled, Is.EqualTo(true));
            Assert.That(typePassed, Is.EqualTo(typeof(Int32)));
            Assert.That(result, Is.EquivalentTo(Collection));
        }
        public void ValueDeserializationFunctionOverrideCanBeSet()
        {
            var    marker1     = "MARKER1";
            string valCapture  = null;
            Type   typeCapture = null;

            Config.DefaultValueDeserialiationFunction = (val, type) =>
            {
                throw new InvalidOperationException("This should not be called.");
            };

            Func <string, Type, object> actuallyUsedFunc = (val, type) =>
            {
                valCapture  = val;
                typeCapture = type;
                return(5);
            };

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = marker1,
                Operator    = "eq"
            },
                actuallyUsedFunc);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A == 5))";

            Assert.That(filter.ValueDeserializationFunctionOverride, Is.EqualTo(actuallyUsedFunc));
            Assert.That(valCapture, Is.EqualTo(marker1));
            Assert.That(typeCapture, Is.EqualTo(typeof(int)));
            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(1));
            Assert.That(query.Single().A, Is.EqualTo(5));
        }
Exemple #28
0
        public SetMeritForm(FilterTreeNode filter)
        {
            InitializeComponent();

            _filter = filter;

            //Configure the merits for each radio button
            _radioButtonMerits.Add(meritSwCompressorRadioButton, Merit.SWCompressor);
            _radioButtonMerits.Add(meritHwCompressorRadioButton, Merit.HWCompressor);
            _radioButtonMerits.Add(meritDoNotUseRadioButton, Merit.DoNotUse);
            _radioButtonMerits.Add(meritUnlikelyRadioButton, Merit.Unlikely);
            _radioButtonMerits.Add(meritNormalRadioButton, Merit.Normal);
            _radioButtonMerits.Add(meritNormalPlus1RadioButton, Merit.Normal + 1);
            _radioButtonMerits.Add(meritPreferredRadioButton, Merit.Preferred);
            _radioButtonMerits.Add(meritPreferredPlusOneRadioButton, Merit.Preferred + 1);
            _radioButtonMerits.Add(meritPreferredPlus255RadioButton, Merit.Preferred + 255);

            customMeritTextBox.Text = ((uint)_filter.Merit).ToString("x");

            filterNameLabel.Text = _filter.FriendlyName;

            //Check the relevant radio button
            bool matchFound = false;
            foreach (RadioButton key in _radioButtonMerits.Keys)
            {
                if (_radioButtonMerits[key] == _filter.Merit)
                {
                    key.Checked = true;
                    matchFound = true;
                    break;
                }
            }

            if (!matchFound)
            {
                meritCustomRadioButton.Checked = true;
            }
        }
        public void ThreeBranchesQueryWorks2()
        {
            var filter = new FilterTreeNode(
                new FilterTreeNode(
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "gt"
            }),
                    LogicalOpertor.AND,
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "lt"
            })
                    ),
                LogicalOpertor.AND,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "5",
                Operator    = "eq"
            }));

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (((par.A > 2) And (par.A < 4)) And (par.A == 5)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(0));
        }
        public void GetLambdaExpressionThreeBranchesTest()
        {
            var filter = new FilterTreeNode(
                new FilterTreeNode(
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "gt"
            }),
                    LogicalOpertor.AND,
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "lt"
            })
                    ),
                LogicalOpertor.AND,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "5",
                Operator    = "eq"
            }));


            var lambdaExpression = filter.GetLambdaExpression <TestSubject>();

            var expectation = "par => (((par.A > 2) And (par.A < 4)) And (par.A == 5))";

            Assert.That(lambdaExpression.ToString(), Is.EqualTo(expectation));
        }
 public FilterTreeNodeNot(FilterTreeNode a)
 {
     _a = a;
 }
Exemple #32
0
        private void PopulateFilterDetails(FilterTreeNode filter)
        {
            PopulateFilterDetails((FilterDeviceTreeNode)filter);
            AddFilterProperty("File Path", filter.FilePath, filter.FilePathException);
            AddFilterProperty("Version", filter.Version, filter.VersionException);
            AddFilterProperty("File Version", filter.FileVersion, filter.FileVersionException);

            //The buttons are only valid for filters, not filter categories
            showPropertyPageButton.Enabled =
                unregisterButton.Enabled =
                changeMeritButton.Enabled = true;
        }
Exemple #33
0
        private void PopulateFiltersTreeWithFilter(TreeNode parentNode, FilterTreeNode filter)
        {
            TreeNode node = new TreeNode();
            node.Text = filter.FriendlyName;
            if (node.Text == null)
            {
                node.Text = String.Format("!! {0}", filter.FriendlyNameException);
            }
            node.Tag = filter;

            parentNode.Nodes.Add(node);
        }
        public void AdditionalOperatorToExpressionConvertersCanBeSetForRootOfTreeAndFunctionOfEachBranchFlowsDowntreeForNodesWithoutTheirOwn()
        {
            var marker2 = "MARKER2";
            var marker3 = "MARKER3";

            Type typePassed = null;

            var additionalOperatorToExpressionConverters1 =
                new Dictionary <string, OperatorHandler>()
            {
                { marker3, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker3), Expression.Constant(marker3)));
                    }) },
                {
                    marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        throw new Exception("This should never be called.");
                    })
                }
            };

            var additionalOperatorToExpressionConverters2 =
                new Dictionary <string, OperatorHandler>()
            {
                { marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker2), Expression.Constant(marker2)));
                    }) }
            };

            var branchWithOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "1",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker2
            }),
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters2);

            var branchWithoutOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker3
            }));

            var filter = new FilterTreeNode(
                branchWithOwnFunction,
                LogicalOpertor.OR,
                branchWithoutOwnFunction,
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters1);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (((par.A == 1) Or (\"MARKER2\" == \"MARKER2\")) Or ((par.A == 2) Or (\"MARKER3\" == \"MARKER3\"))))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(3));
            Assert.That(query.ElementAt(0).A, Is.EqualTo(1));
            Assert.That(query.ElementAt(1).A, Is.EqualTo(3));
            Assert.That(query.ElementAt(2).A, Is.EqualTo(5));
        }