Example #1
0
 public static void SetupQueryEngine(QueryEngine qe)
 {
     qe.AddFilter("i", o => ((TestObject)o).id);
     qe.AddFilter("n", o => ((TestObject)o).name, new[] { ":", "=", "!=" });
     qe.AddFilter("s", o => ((TestObject)o).state, new[] { "=", "!=", "<", ">", "<=", ">=" });
     qe.AddFilter("a", o => ((TestObject)o).active, new[] { "=", "!=" });
     qe.AddFilter("v", o => ((TestObject)o).value);
     qe.AddFilter <string>("is", IsFilterResolver);
     qe.AddFilter <int, int>("inc", ((o, context) => ((TestObject)o).id + context));
     qe.AddOperatorHandler("=", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev == fv);
     qe.AddOperatorHandler("!=", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev != fv);
     qe.AddOperatorHandler("<", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev < fv);
     qe.AddOperatorHandler(">", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev > fv);
     qe.AddOperatorHandler("<=", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev <= fv);
     qe.AddOperatorHandler(">=", (TestObject.TestEnum ev, TestObject.TestEnum fv) => ev >= fv);
     qe.SetSearchDataCallback(o =>
     {
         var to = o as TestObject;
         return(new[] { to.name, to.id.ToString() });
     });
 }
Example #2
0
        public void FilterWithParameter()
        {
            // Simple
            var data = new List <TestObject>
            {
                new TestObject {
                    id = 1, name = "name1", active = false, state = TestObject.TestEnum.ValueA, value = 10.0f
                },
                new TestObject {
                    id = 2, name = "name2", active = true, state = TestObject.TestEnum.ValueB, value = 1000.0f
                },
                new TestObject {
                    id = 3, name = "Name With Spaces", active = true, state = TestObject.TestEnum.ValueC, value = 100.0f
                },
            };
            var query = m_QE.Parse("inc(1)=3");

            ValidateNoErrors(query);

            var filteredValues = query.Apply(data).ToList();

            Assert.IsNotEmpty(filteredValues);
            Assert.AreEqual(1, filteredValues.Count);
            Assert.Contains(data[1], filteredValues);

            // With transform function
            m_QE.AddFilter("dist", ((o, context) => Mathf.Abs(((TestObject)o).value - context.value)), param =>
            {
                foreach (var testObject in data)
                {
                    if (testObject.name == param)
                    {
                        return new TestParam()
                        {
                            target = testObject, value = testObject.value
                        }
                    }
                    ;
                }
                return(default(TestParam));
            });
            query = m_QE.Parse("dist(name2)<10.0");

            ValidateNoErrors(query);

            filteredValues = query.Apply(data).ToList();
            Assert.IsNotEmpty(filteredValues);
            Assert.AreEqual(1, filteredValues.Count);
            Assert.Contains(data[1], filteredValues);

            // Multiple params
            m_QE.AddFilter("func", ((o, context) => Math.Abs(((TestObject)o).value - context.value) < Mathf.Epsilon || ((TestObject)o).state == context.target.state), param =>
            {
                var testParam = new TestParam();
                if (string.IsNullOrEmpty(param))
                {
                    return(testParam);
                }
                var paramTokens = param.Split(';');
                var targetName  = paramTokens[0].Trim('"');
                testParam.value = float.Parse(paramTokens[1], CultureInfo.InvariantCulture.NumberFormat);
                foreach (var testObject in data)
                {
                    if (testObject.name == targetName)
                    {
                        testParam.target = testObject;
                    }
                }
                return(testParam);
            });
            query = m_QE.Parse("func(\"Name With Spaces\";10.0)=true");

            ValidateNoErrors(query);

            filteredValues = query.Apply(data).ToList();
            Assert.IsNotEmpty(filteredValues);
            Assert.AreEqual(2, filteredValues.Count);
            Assert.Contains(data[0], filteredValues);
            Assert.Contains(data[2], filteredValues);
        }