public void AddFiltersAndReplacePredefinedValuesTests()
        {
            // arrange
            const string columnSystemName = "CreatedBy";
            const string userFullName = "James Bond";

            var sourceFilterList = new List<IFilterDescriptor>
                                       {
                                           new FilterDescriptor(LogicalOperators.And, new MobileObservableCollection<IFilterDescriptor>())
                                               {
                                                   ColumnName = columnSystemName,
                                                   Value = new FilterValue
                                                               {
                                                                   DisplayName = "Current User",
                                                                   SystemName = "user",
                                                                   Type = FilterValueType.SystemVariable
                                                               }
                                               }
                                       };

            var destinationFilterList = new List<IFilterDescriptor>();

            var queryGenerator = new SearchQueryGenerator();
            var tb = new TableDefinition(columnSystemName);
            tb.AddField(columnSystemName, ColumnTypes.String);
            queryGenerator.RootTable = tb;

            var identityMock = Mock.Create<IMQ1Identity>();
            var principalMock = Mock.Create<IPrincipal>();
            Mock.Arrange(() => principalMock.Identity).Returns(identityMock);
            Mock.Arrange(() => identityMock.FullName).Returns(userFullName);
            Csla.ApplicationContext.User = principalMock;

            // act
            QueryGeneratorExtensions.AddFilters(sourceFilterList, destinationFilterList, tb, queryGenerator);

            // assert
            Assert.AreEqual(userFullName, destinationFilterList.First().Value);
        }
        /// <summary>
        /// Adds the filters.
        /// </summary>
        /// <param name="sourceFilterList">The source filter list.</param>
        /// <param name="destinationFilterList">The destination filter list.</param>
        /// <param name="rootTable">The root table.</param>
        /// <param name="queryGenerator">The query generator.</param>
        public static void AddFilters(IEnumerable<IFilterDescriptor> sourceFilterList, IList<IFilterDescriptor> destinationFilterList, TableDefinition rootTable, SearchQueryGenerator queryGenerator)
        {
            if (sourceFilterList == null || destinationFilterList == null || queryGenerator == null)
                return;

            foreach (var filter in sourceFilterList)
            {
                if (filter.FilterDescriptors != null && filter.FilterDescriptors.Count > 0)
                {
                    var list = new List<IFilterDescriptor>();
                    destinationFilterList.Add(new SharedTypes.QueryGenerator.FilterDescriptor(filter.LogicalOperator, list));

                    AddFilters(filter.FilterDescriptors, list, rootTable, queryGenerator);
                }
                else
                {
                    var column = queryGenerator.FindColumn(filter.ColumnName, true, false);
                    if (column != null)
                        destinationFilterList.Add(new SharedTypes.QueryGenerator.FilterDescriptor(column, filter.ColumnName, filter.Operator, filter.Value, filter.MemberType));
                    else
                    {
                        if (!string.IsNullOrWhiteSpace(filter.ColumnName))
                            if (filter.ColumnName.Contains('.'))
                            {
                                var parts = filter.ColumnName.Split('.');
                                if (parts.Count() < 3)
                                    return;

                                var t = new TableDefinition(parts[0]);
                                t.AddField(parts[1], ColumnTypes.Reference);
                                queryGenerator.AddBaseTable(t);
                            }
                            else
                                destinationFilterList.Add(new SharedTypes.QueryGenerator.FilterDescriptor(filter.ColumnName, filter.ColumnName, filter.Operator, filter.Value, filter.MemberType));
                    }
                }
            }
        }