public void TestNodeGetSet() { FilterHandle exprOne = new SupportFilterHandle(); // Check pre-conditions Assert.IsTrue(testNode.NodeRWLock != null); Assert.IsFalse(testNode.Contains(exprOne)); Assert.AreEqual(0, testNode.FilterCallbackCount); Assert.AreEqual(0, testNode.Indizes.Count); Assert.IsTrue(testNode.IsEmpty()); testNode.Add(exprOne); // Check after add Assert.IsTrue(testNode.Contains(exprOne)); Assert.AreEqual(1, testNode.FilterCallbackCount); Assert.IsFalse(testNode.IsEmpty()); // Add an indexOne EventType eventType = SupportEventTypeFactory .GetInstance(container) .CreateBeanType(typeof(SupportBean)); SupportExprEventEvaluator eval = new SupportExprEventEvaluator(eventType.GetGetter("IntPrimitive")); ExprFilterSpecLookupable lookupable = new ExprFilterSpecLookupable( "IntPrimitive", eval, null, eventType.GetPropertyType("IntPrimitive"), false, null); FilterParamIndexBase indexOne = new SupportFilterParamIndex(lookupable); testNode.Add(indexOne); // Check after add Assert.AreEqual(1, testNode.Indizes.Count); Assert.AreEqual(indexOne, testNode.Indizes[0]); // Check removes Assert.IsTrue(testNode.Remove(exprOne)); Assert.IsFalse(testNode.IsEmpty()); Assert.IsFalse(testNode.Remove(exprOne)); Assert.IsTrue(testNode.Remove(indexOne)); Assert.IsFalse(testNode.Remove(indexOne)); Assert.IsTrue(testNode.IsEmpty()); }
private static bool RemoveFromNode( FilterHandle filterCallback, FilterHandleSetNode currentNode, FilterValueSetParam[] @params, int currentLevel) { // No remaining filter parameters if (currentLevel == @params.Length) { using (currentNode.NodeRWLock.WriteLock.Acquire()) { return currentNode.Remove(filterCallback); } } if (currentLevel > @params.Length) { Log.Warn( ".removeFromNode (" + Thread.CurrentThread.ManagedThreadId + ") Current level exceed parameter length, node=" + currentNode + " filterCallback=" + filterCallback); return false; } // Remove from index using (currentNode.NodeRWLock.WriteLock.Acquire()) { FilterParamIndexBase indexFound = null; // find matching index foreach (var index in currentNode.Indizes) { for (var i = 0; i < @params.Length; i++) { var param = @params[i]; var indexMatch = false; if (index is FilterParamIndexLookupableBase) { var baseIndex = (FilterParamIndexLookupableBase) index; if (param.Lookupable.Expression.Equals(baseIndex.Lookupable.Expression) && param.FilterOperator.Equals(baseIndex.FilterOperator)) { indexMatch = true; } } else if (index is FilterParamIndexBooleanExpr && param.FilterOperator == FilterOperator.BOOLEAN_EXPRESSION) { indexMatch = true; } if (indexMatch) { bool found = RemoveFromIndex(filterCallback, index, @params, currentLevel + 1, param.FilterForValue); if (found) { indexFound = index; break; } } } if (indexFound != null) { break; } } if (indexFound == null) { return false; } // Remove the index if the index is now empty if (indexFound.IsEmpty) { var isRemoved = currentNode.Remove(indexFound); if (!isRemoved) { Log.Warn( ".removeFromNode (" + Thread.CurrentThread.ManagedThreadId + ") Could not find the index in index list for removal, index=" + indexFound + " filterCallback=" + filterCallback); return true; } } return true; } }