示例#1
0
        /// <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;
            }
        }
示例#3
0
 /// <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;
 }