コード例 #1
0
        public void TestEqualsFilter()
        {
            EqualsFilter v1 = new EqualsFilter(ConnectorAttributeBuilder.Build("foo", "bar"));
            EqualsFilter v2 = (EqualsFilter)CloneObject(v1);

            Assert.AreEqual(v1.GetAttribute(), v2.GetAttribute());
        }
コード例 #2
0
        protected override String CreateEqualsExpression(EqualsFilter filter, Boolean not)
        {
            // Note: The LDAP equality filter matches any one attribute value,
            // whereas the connector EqualsFilter matches an attribute and
            // its values exactly.

            return(CreateContainsAllValuesExpressionInternal(filter, not));
        }
コード例 #3
0
        public Dictionary <string, object> VisitEqualsFilter(Hashtable p, EqualsFilter filter)
        {
            var values = filter.GetAttribute().Value;

            if (values.Count == 1)
            {
                return(CreateMap("EQUALS", filter.GetAttribute().Name, values[0]));
            }
            throw new NotImplementedException("Equality visitor does not implement multi value attribute");
        }
コード例 #4
0
        public void TestComparisonValueExtractor()
        {
            // testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Score score = new Score(1, 1, 126, 10000L, 1.24f, 1432.55, new decimal(11223344), new RawInt128(new byte[] { 1 }), 1);

            cache.Insert("score1", score);

            IValueExtractor exByte    = new ReflectionExtractor("getByteValue");
            IValueExtractor exShort   = new ReflectionExtractor("getShortValue");
            IValueExtractor exInt     = new ReflectionExtractor("getIntValue");
            IValueExtractor exLong    = new ReflectionExtractor("getLongValue");
            IValueExtractor exFloat   = new ReflectionExtractor("getFloatValue");
            IValueExtractor exDouble  = new ReflectionExtractor("getDoubleValue");
            IValueExtractor exDecimal = new ReflectionExtractor("getBigDecimalValue");
            IValueExtractor exInt128  = new ReflectionExtractor("getBigIntegerValue");

            //different ways to instantiate same extractor
            ComparisonValueExtractor cve1 = new ComparisonValueExtractor(exByte, exShort);
            ComparisonValueExtractor cve2 = new ComparisonValueExtractor(exInt, exLong);
            ComparisonValueExtractor cve3 = new ComparisonValueExtractor(exFloat, exDouble);
            ComparisonValueExtractor cve4 = new ComparisonValueExtractor(exDecimal, exDecimal);
            ComparisonValueExtractor cve5 = new ComparisonValueExtractor(exInt128, exInt128);

            IFilter     filter = new EqualsFilter(cve1, score.ByteValue - score.ShortValue);
            ICollection keys   = cache.GetKeys(filter);

            Assert.IsNotEmpty(keys);
            Assert.IsTrue(keys.Count == 1);

            filter = new EqualsFilter(cve2, score.IntValue - score.LongValue);
            keys   = cache.GetKeys(filter);
            Assert.IsNotEmpty(keys);
            Assert.IsTrue(keys.Count == 1);

            filter = new EqualsFilter(cve3, score.FloatValue - score.DoubleValue);
            keys   = cache.GetKeys(filter);
            Assert.IsNotEmpty(keys);
            Assert.IsTrue(keys.Count == 1);

            filter = new EqualsFilter(cve4, (decimal)0);
            keys   = cache.GetKeys(filter);
            Assert.IsNotEmpty(keys);
            Assert.IsTrue(keys.Count == 1);

            filter = new EqualsFilter(cve5, NumberUtils.DecimalToRawInt128(score.RawInt128Value.ToDecimal() - score.RawInt128Value.ToDecimal()));
            keys   = cache.GetKeys(filter);
            Assert.IsNotEmpty(keys);
            Assert.IsTrue(keys.Count == 1);

            CacheFactory.Shutdown();
        }
コード例 #5
0
        protected override string CreateEqualsExpression(EqualsFilter filter, bool not)
        {
            ConnectorAttribute attr = filter.GetAttribute();

            if (attr.Name.Equals(Name.NAME))
            {
                return("Name:" + attr.Value.First().ToString());
            }

            return(null);
        }
コード例 #6
0
        public void TestViewBuilderWithFilter()
        {
            IFilter     filter = new EqualsFilter("foo", "bar");
            INamedCache cache  = new ViewBuilder(GetCache("v-filter")).Filter(filter).Build();

            Assert.IsInstanceOf(typeof(ContinuousQueryCache), cache);

            ContinuousQueryCache queryCache = (ContinuousQueryCache)cache;

            Assert.That(queryCache.Filter, Is.EqualTo(filter));
        }
        public void ConverterQueryCacheTests()
        {
            IQueryCache cache = InstantiateCache();
            IConverter  cDown = new ConvertDown();
            IConverter  cUp   = new ConvertUp();

            IQueryCache convCache = ConverterCollections.GetQueryCache(cache, cUp, cDown, cUp, cDown);

            Assert.IsNotNull(convCache);
            for (int i = 0; i < 5; i++)
            {
                convCache.Add(i, i + 1);
            }
            Assert.AreEqual(convCache.Count, 5);

            IFilter filter = new EqualsFilter(IdentityExtractor.Instance, cDown.Convert("4"));

            object[] keys = convCache.GetKeys(filter);
            Assert.IsNotNull(keys);
            Assert.AreEqual(keys.Length, 1);
            Assert.AreEqual(keys[0], "3");

            filter = new GreaterEqualsFilter(IdentityExtractor.Instance, "2");
            object[] values = convCache.GetValues(filter);
            Assert.IsNotNull(values);
            Assert.AreEqual(values.Length, 4);
            values = convCache.GetValues(filter, Comparer.DefaultInvariant);
            Assert.IsNotNull(values);
            Assert.AreEqual(values.Length, 4);
            Assert.AreEqual(values[0], "2");

            object[] entries = convCache.GetEntries(filter);
            Assert.IsNotNull(entries);
            Assert.AreEqual(entries.Length, 4);
            entries = convCache.GetEntries(filter, new KeyExtractor(IdentityExtractor.Instance));
            Assert.IsNotNull(entries);
            Assert.AreEqual(entries.Length, 4);
            Assert.IsInstanceOf(typeof(ICacheEntry), entries[0]);
            ICacheEntry e = entries[0] as ICacheEntry;

            Assert.IsNotNull(e);
            Assert.AreEqual(e.Key, "1");
            Assert.AreEqual(e.Value, "2");

            Assert.IsInstanceOf(typeof(ConverterCollections.ConverterQueryCache), convCache);
            ConverterCollections.ConverterQueryCache cqc = convCache as ConverterCollections.ConverterQueryCache;
            Assert.IsNotNull(cqc);
            Assert.AreEqual(cqc.QueryCache, cache);
        }
コード例 #8
0
        public void TestIdentityExtractor()
        {
            IValueExtractor extractor  = IdentityExtractor.Instance;
            IValueExtractor extractor1 = IdentityExtractor.Instance;

            Assert.IsNotNull(extractor);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            object o  = new DictionaryEntry("key", "value");
            object o1 = extractor.Extract(o);

            Assert.AreEqual(o, o1);

            IdentityExtractor ie = extractor as IdentityExtractor;

            Assert.AreEqual(ie.Compare("ana", "cikic"), -1);

            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("1", 1);
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("2", 2);

            Assert.AreEqual(ie.CompareEntries(entry2, entry1), 1);

            //testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Hashtable ht = new Hashtable();

            ht.Add("identityExtractorKey1", 435);
            ht.Add("identityExtractorKey2", 253);
            ht.Add("identityExtractorKey3", 3);
            ht.Add("identityExtractorKey4", null);
            ht.Add("identityExtractorKey5", -3);
            cache.InsertAll(ht);

            IFilter     filter = new EqualsFilter(extractor, 253);
            ICollection keys   = cache.GetKeys(filter);

            Assert.Contains("identityExtractorKey2", (IList)keys);
            Assert.AreEqual(keys.Count, 1);

            CacheFactory.Shutdown();
        }
コード例 #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="p"></param>
        /// <param name="filter"></param>
        /// <exception cref="NotImplementedException"></exception>
        /// <returns></returns>
        public string VisitEqualsFilter(Hashtable p, EqualsFilter filter)
        {
            var name  = filter.GetAttribute().Name;
            var name2 = name as String;

            if (p.ContainsKey(name))
            {
                name2 = p[name] as String;
            }
            var values = filter.GetAttribute().Value;

            if (values.Count == 1)
            {
                return(string.Format("{0} -eq \"{1}\"", name2, values[0]));
            }
            throw new NotImplementedException("Equality visitor does not implement multi value attributes");
        }
コード例 #10
0
        public void testCoh5516()
        {
            IFilter         typeFilter    = new EqualsFilter("getType", "bird");
            IValueExtractor intExtractor  = new ReflectionExtractor("getWings");
            var             condExtractor = new ConditionalExtractor(typeFilter, intExtractor, false);
            IDictionary     map           = new HashDictionary();

            var index = condExtractor.CreateIndex(false, null, map);

            var bird   = new Bird();
            var fish   = new Fish();
            var entry1 = new CacheEntry(0, bird, bird);
            var entry2 = new CacheEntry(1, fish, fish);

            // add entries of type Fish and Bird - only the Bird should get indexed
            index.Insert(entry1);
            index.Insert(entry2);

            // remove entries of type Fish and Bird - only the Bird should get indexed
            index.Delete(entry1);
            index.Delete(entry2);
        }
コード例 #11
0
        protected override String CreateEqualsExpression(EqualsFilter filter, Boolean not)
        {
            // The LDAP equality filter matches any one attribute value,
            // whereas the connector EqualsFilter matches an attribute and
            // its values exactly.
            if (not)
            {
                return(null);
            }

            ConnectorAttribute attr = filter.GetAttribute();

            // if there is only one thing to search on, and it's
            // a uid we need to convert the uid to something we
            // can search on.  NOTE:  only handling the case where
            // we are doing an equality search, and only one item
            // is in the equality search ... It's all that makes
            // sense for uid.
            if (attr is Uid)
            {
                String attrValue = ((Uid)attr).GetUidValue();
                if (LooksLikeGUID(attrValue))
                {
                    String searchGuid = GetUidSearchString(((Uid)attr).GetUidValue());
                    attr = new Uid(searchGuid);
                }
                else
                {
                    attr = new Name(attrValue);
                }
            }


            String[] attrNames = GetLdapNamesForAttribute(attr);
            if (attrNames == null)
            {
                return(null);
            }

            StringBuilder builder = new StringBuilder();

            if (attr.Value == null)
            {
                return(null);
            }
            if (attr.Value.Count == 1)
            {
                BuildEqualityFilter(builder, attrNames,
                                    attr.Value[0]);
            }
            else
            {
                builder.Append("(&");
                foreach (Object value in attr.Value)
                {
                    BuildEqualityFilter(builder, attrNames, value);
                }
                builder.Append(')');
            }

            return(builder.ToString());
        }
コード例 #12
0
 public void TestEqualsFilter()
 {
     EqualsFilter v1 = new EqualsFilter(ConnectorAttributeBuilder.Build("foo", "bar"));
     EqualsFilter v2 = (EqualsFilter)CloneObject(v1);
     Assert.AreEqual(v1.GetAttribute(), v2.GetAttribute());
 }
コード例 #13
0
        protected override String CreateEqualsExpression(EqualsFilter filter, bool not)
        {
            String rv = "( = " + filter.GetAttribute().Name + " [" + filter.GetAttribute().Value[0] + "] )";

            return(Not(rv, not));
        }
コード例 #14
0
 protected override Filter CreateEqualsExpression(EqualsFilter filter, bool not)
 {
     return(not ? FilterBuilder.Not(filter) : filter);
 }
コード例 #15
0
 protected override String CreateEqualsExpression(EqualsFilter filter, Boolean not)
 {
     return(CreateContainsAllValuesExpressionInternal(filter, not));
 }
コード例 #16
0
 protected override IDictionary <String, Object> CreateEqualsExpression(EqualsFilter filter, Boolean not)
 {
     return(CreateFilter("EQUALS", filter, not));
 }
コード例 #17
0
        public void TestKeyExtractor()
        {
            IValueExtractor extractor  = new KeyExtractor((IValueExtractor)null);
            IValueExtractor extractor1 = new KeyExtractor((IValueExtractor)null);
            IValueExtractor extractor2 = IdentityExtractor.Instance;

            Assert.IsNotNull(extractor);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreNotEqual(extractor, extractor2);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            extractor = new KeyExtractor(IdentityExtractor.Instance);
            Assert.IsNotNull(extractor);
            IValueExtractor innerExtractor = (extractor as KeyExtractor).Extractor;

            Assert.IsNotNull(innerExtractor);
            Assert.IsInstanceOf(typeof(IdentityExtractor), innerExtractor);

            object o = "value";

            Assert.AreEqual(o, extractor.Extract(o));

            extractor = new KeyExtractor("field");
            Assert.IsNotNull(extractor);
            innerExtractor = (extractor as KeyExtractor).Extractor;
            Assert.IsNotNull(innerExtractor);
            Assert.IsInstanceOf(typeof(ReflectionExtractor), innerExtractor);
            ReflectionExtractor re = innerExtractor as ReflectionExtractor;

            Assert.AreEqual(re.MemberName, "field");

            o = new ReflectionTestType();
            Assert.AreEqual(extractor.Extract(o), (o as ReflectionTestType).field);

            extractor = new KeyExtractor("InnerMember.field");
            Assert.IsNotNull(extractor);
            innerExtractor = (extractor as KeyExtractor).Extractor;
            Assert.IsNotNull(innerExtractor);
            Assert.IsInstanceOf(typeof(ChainedExtractor), innerExtractor);
            ChainedExtractor ce = innerExtractor as ChainedExtractor;

            Assert.IsNotNull(ce.Extractors);
            Assert.AreEqual(ce.Extractors.Length, 2);
            Assert.AreEqual(extractor.Extract(o), (o as ReflectionTestType).InnerMember.field);

            // testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Hashtable ht = new Hashtable();

            ht.Add("identityExtractorKey1", 435);
            ht.Add("identityExtractorKey2", 253);
            ht.Add("identityExtractorKey3", 3);
            ht.Add("identityExtractorKey4", null);
            ht.Add("identityExtractorKey5", -3);
            cache.InsertAll(ht);

            extractor = new KeyExtractor(IdentityExtractor.Instance);
            IFilter     filter = new EqualsFilter(extractor, "identityExtractorKey3");
            ICollection keys   = cache.GetKeys(filter);

            Assert.Contains("identityExtractorKey3", (IList)keys);
            Assert.AreEqual(keys.Count, 1);

            CacheFactory.Shutdown();
        }
コード例 #18
0
        private void UpdatePropertiesPanel(XmlNode selectedItem)
        {
            if (selectedItem.Name == "input")
            {
                switch (selectedItem.Attributes["type"].Value)
                {
                case "MSMQ":
                    MyGrid = new MSMQIN(selectedItem, this.View);
                    break;

                case "MQ":
                    MyGrid = new MQIN(selectedItem, this.View);
                    break;

                case "FILE":
                    MyGrid = new FILEIN(selectedItem, this.View);
                    break;

                case "KAFKA":
                    MyGrid = new KAFKAIN(selectedItem, this.View);
                    break;

                case "HTTP":
                    MyGrid = new HTTPIN(selectedItem, this.View);
                    break;

                case "RABBITDEFEX":
                    MyGrid = new RABBITIN(selectedItem, this.View);
                    break;

                case "MQTT":
                    MyGrid = new MQTTIN(selectedItem, this.View);
                    break;

                case "TCPSERVER":
                    MyGrid = new TCPIN(selectedItem, this.View);
                    break;

                case "TESTSOURCE":
                    MyGrid = new TESTSOURCE(selectedItem, this.View);
                    break;
                }
            }
            else if (selectedItem.Name == "output" || selectedItem.Name == "altqueue")
            {
                switch (selectedItem.Attributes["type"].Value)
                {
                case "MSMQ":
                    MyGrid = new MSMQOUT(selectedItem, this.View);
                    break;

                case "MQ":
                    MyGrid = new MQOUT(selectedItem, this.View);
                    break;

                case "FILE":
                    MyGrid = new FILEOUT(selectedItem, this.View);
                    break;

                case "KAFKA":
                    MyGrid = new KAFKAOUT(selectedItem, this.View);
                    break;

                case "REST":
                    MyGrid = new RESTOUT(selectedItem, this.View);
                    break;

                case "HTTP":
                    MyGrid = new HTTPOUT(selectedItem, this.View);
                    break;

                case "TCPCLIENT":
                    MyGrid = new TCPOUT(selectedItem, this.View);
                    break;

                case "RABBITDEFEX":
                    MyGrid = new RABBITOUT(selectedItem, this.View);
                    break;

                case "MQTT":
                    MyGrid = new MQTTIN(selectedItem, this.View);
                    break;

                case "SMTP":
                    MyGrid = new SMTPOut(selectedItem, this.View);
                    break;

                case "FTP":
                    MyGrid = new FTPOut(selectedItem, this.View);
                    break;

                case "SINK":
                    MyGrid = new SINK(selectedItem, this.View);
                    break;
                }
            }
            else if (selectedItem.Name == "monitor")
            {
                MyGrid = new MonitorGrid(selectedItem, this.View);
            }
            else if (selectedItem.Name == "filter")
            {
                MyGrid = new Filter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "pipe")
            {
                MyGrid = new PIPE(selectedItem, this.View);
            }
            else if (selectedItem.Name == "namespace")
            {
                MyGrid = new NameSpaceGrid(selectedItem, this.View);
            }
            else if (selectedItem.Name == "service")
            {
                MyGrid = new ServiceSetting(selectedItem, this.View);
            }
            else if (selectedItem.Name == "and" || selectedItem.Name == "or" || selectedItem.Name == "xor" || selectedItem.Name == "not")
            {
                MyGrid = new BooleanExpression(selectedItem, this.View);
            }
            else if (selectedItem.Name == "contains")
            {
                MyGrid = new ContainsFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "equals")
            {
                MyGrid = new EqualsFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "matches")
            {
                MyGrid = new MatchesFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "length")
            {
                MyGrid = new LengthFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "xpexists")
            {
                MyGrid = new XPExistsFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "xpmatches")
            {
                MyGrid = new XPMatchesFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "xpequals")
            {
                MyGrid = new XPEqualsFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "dateRange")
            {
                MyGrid = new DateRangeFilter(selectedItem, this.View);
            }
            else if (selectedItem.Name == "contextContains")
            {
                MyGrid = new ContextFilter(selectedItem, this.View);
            }

            OnPropertyChanged("MyGrid");
        }
コード例 #19
0
        public void TestReflectionExtractor()
        {
            IValueExtractor extractor  = new ReflectionExtractor("field");
            IValueExtractor extractor1 = new ReflectionExtractor("field");
            IValueExtractor extractor2 = IdentityExtractor.Instance;

            Assert.IsNotNull(extractor);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreNotEqual(extractor, extractor2);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            ReflectionTestType o = new ReflectionTestType();

            Assert.AreEqual(extractor.Extract(o), o.field);

            extractor = new ReflectionExtractor("Property");
            Assert.AreEqual(extractor.Extract(o), o.Property);

            extractor = new ReflectionExtractor("GetMethod");
            Assert.AreEqual(extractor.Extract(o), o.GetMethod());
            Assert.IsNull(extractor.Extract(null));

            try
            {
                extractor = new ReflectionExtractor("InvalidMember");
                extractor.Extract(o);
            }
            catch (Exception e)
            {
                Assert.IsInstanceOf(typeof(ArgumentException), e.InnerException);
            }

            // testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Address a1 = new Address("street1", "city1", "state1", "zip1");
            Address a2 = new Address("street2", "city2", "state2", "zip2");
            Address a3 = new Address("street3", "city1", "state3", "zip3");

            Hashtable ht = new Hashtable();

            ht.Add("reflectionExtractorKey1", a1);
            ht.Add("reflectionExtractorKey2", a2);
            ht.Add("reflectionExtractorKey3", a3);
            cache.InsertAll(ht);

            extractor = new ReflectionExtractor("getCity");
            IFilter     filter = new EqualsFilter(extractor, "city1");
            ICollection keys   = cache.GetKeys(filter);

            Assert.Contains("reflectionExtractorKey1", (IList)keys);
            Assert.Contains("reflectionExtractorKey3", (IList)keys);
            Assert.AreEqual(keys.Count, 2);

            extractor = new ReflectionExtractor("Sum", new object[] { 10 });
            o         = new ReflectionTestType();
            o.field   = 10;
            Assert.AreEqual(extractor.Extract(o), 20);

            o.field = 4;
            Assert.AreEqual(extractor.Extract(o), 14);

            CacheFactory.Shutdown();
        }
コード例 #20
0
 public string VisitEqualsFilter(Hashtable p, EqualsFilter filter)
 {
     throw new NotImplementedException();
 }
コード例 #21
0
        public void TestChainedExtractor()
        {
            IValueExtractor extractor = new ChainedExtractor("InnerMember.field");

            IValueExtractor re1 = new ReflectionExtractor("InnerMember");
            IValueExtractor re2 = new ReflectionExtractor("field");

            IValueExtractor[] res = { re1, re2 };

            IValueExtractor extractor1 = new ChainedExtractor(re1, re2);
            IValueExtractor extractor2 = new ChainedExtractor(res);

            Assert.IsNotNull(extractor);
            Assert.IsNotNull(extractor1);
            Assert.IsNotNull(extractor2);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreEqual(extractor1, extractor2);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            IValueExtractor[] extractors = (extractor as ChainedExtractor).Extractors;
            Assert.IsNotNull(extractors);
            Assert.AreEqual(extractors.Length, 2);
            Assert.AreEqual(extractors[0], re1);
            Assert.AreEqual(extractors[1], re2);

            ReflectionTestType o = new ReflectionTestType();

            Assert.AreEqual(extractor.Extract(o), o.InnerMember.field);
            Assert.AreEqual(extractor.Extract(o), extractors[1].Extract(extractors[0].Extract(o)));
            Assert.IsNull(extractor.Extract(null));

            // testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Address a1 = new Address("street1", "city1", "state1", "zip1");
            Address a2 = new Address("street2", "city2", "state2", "zip2");
            Address a3 = new Address("street3", "city1", "state3", "zip3");

            Hashtable ht = new Hashtable();

            ht.Add(a1, "chainedExtractorValue1");
            ht.Add(a2, "chainedExtractorValue2");
            ht.Add(a3, "chainedExtractorValue3");
            cache.InsertAll(ht);

            extractor1 = new KeyExtractor(IdentityExtractor.Instance);
            extractor2 = new KeyExtractor(new ReflectionExtractor("getCity"));
            extractor  = new KeyExtractor(new ChainedExtractor(extractor1, extractor2));

            IFilter     filter = new EqualsFilter(extractor, "city1");
            ICollection keys   = cache.GetKeys(filter);
            ArrayList   list   = new ArrayList(keys);

            Assert.AreEqual(keys.Count, 2);
            Assert.AreEqual(((Address)list[0]).City, "city1");
            Assert.AreEqual(((Address)list[1]).City, "city1");

            CacheFactory.Shutdown();
        }