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() }); }); }
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); }