/// <summary> /// Tests the specified filter. /// </summary> private void TestFilter <T>(ICacheEntryEventFilter <int, T> pred, bool local, T validVal, T invalidVal) { var cache = _ignite.GetOrCreateCache <int, T>("qry"); cache.Clear(); var qry = new ContinuousQuery <int, T>(new QueryListener <T>(), pred, local); var aff = _ignite.GetAffinity("qry"); var localNode = _ignite.GetCluster().GetLocalNode(); // Get one key per node var keyMap = aff.MapKeysToNodes(Enumerable.Range(1, 100)); Assert.AreEqual(3, keyMap.Count); var keys = local ? keyMap[localNode].Take(1) : keyMap.Select(x => x.Value.First()); using (cache.QueryContinuous(qry)) { // Run on many keys to test all nodes foreach (var key in keys) { _lastEvent = null; cache[key] = validVal; TestUtils.WaitForCondition(() => _lastEvent != null, 2000); Assert.IsNotNull(_lastEvent); Assert.AreEqual(cache[key], _lastEvent.Item2); _lastEvent = null; cache[key] = invalidVal; Thread.Sleep(2000); Assert.IsNull(_lastEvent); } } }
/// <summary> /// Constructor. /// </summary> /// <param name="qry">Query.</param> /// <param name="marsh">Marshaller.</param> /// <param name="keepBinary">Keep binary flag.</param> /// <param name="createTargetCb">The initialization callback.</param> /// <param name="initialQry">The initial query.</param> public ContinuousQueryHandleImpl(ContinuousQuery <TK, TV> qry, Marshaller marsh, bool keepBinary, Func <Action <BinaryWriter>, IPlatformTargetInternal> createTargetCb, IQueryBaseInternal initialQry) { _marsh = marsh; _keepBinary = keepBinary; _lsnr = qry.Listener; _filter = qry.Filter; // 1. Inject resources. ResourceProcessor.Inject(_lsnr, _marsh.Ignite); ResourceProcessor.Inject(_filter, _marsh.Ignite); try { // 2. Allocate handle. _hnd = _marsh.Ignite.HandleRegistry.Allocate(this); // 3. Call Java. _nativeQry = createTargetCb(writer => { writer.WriteLong(_hnd); writer.WriteBoolean(qry.Local); writer.WriteBoolean(qry.IncludeExpired); writer.WriteBoolean(_filter != null); var javaFilter = _filter as PlatformJavaObjectFactoryProxy; if (javaFilter != null) { writer.WriteObject(javaFilter.GetRawProxy()); } else { var filterHolder = _filter == null || qry.Local ? null : new ContinuousQueryFilterHolder(_filter, _keepBinary); writer.WriteObject(filterHolder); } writer.WriteInt(qry.BufferSize); writer.WriteLong((long)qry.TimeInterval.TotalMilliseconds); writer.WriteBoolean(qry.AutoUnsubscribe); if (initialQry != null) { writer.WriteInt((int)initialQry.OpId); initialQry.Write(writer, _keepBinary); } else { writer.WriteInt(-1); // no initial query } }); // 4. Initial query. _nativeInitialQueryCursor = _nativeQry.OutObjectInternal(0); _initialQueryIsFields = initialQry is SqlFieldsQuery; } catch (Exception) { if (_hnd > 0) { _marsh.Ignite.HandleRegistry.Release(_hnd); } if (_nativeQry != null) { _nativeQry.Dispose(); } if (_nativeInitialQueryCursor != null) { _nativeInitialQueryCursor.Dispose(); } throw; } }
/// <summary> /// Constructor. /// </summary> /// <param name="lsnr">Listener.</param> /// <param name="filter">Filter.</param> public ContinuousQuery(ICacheEntryEventListener <TK, TV> lsnr, ICacheEntryEventFilter <TK, TV> filter) : this(lsnr, filter, false) { // No-op. }
/// <summary> /// Constructor. /// </summary> /// <param name="filter">Actual filter.</param> /// <param name="keepBinary">Keep binary flag.</param> public ContinuousQueryFilter(ICacheEntryEventFilter <TK, TV> filter, bool keepBinary) { _filter = filter; _keepBinary = keepBinary; }
/// <summary> /// Constructor. /// </summary> /// <param name="filter">Actual filter.</param> /// <param name="keepPortable">Keep portable flag.</param> public ContinuousQueryFilter(ICacheEntryEventFilter <TK, TV> filter, bool keepPortable) { _filter = filter; _keepPortable = keepPortable; }