Пример #1
0
        public static IList <IBrowseFilterValue> GetValues(this IBrowseFilter filter)
        {
            IBrowseFilterValue[] result = null;

            var attributeFilter  = filter as AttributeFilter;
            var rangeFilter      = filter as RangeFilter;
            var priceRangeFilter = filter as PriceRangeFilter;
            var categoryFilter   = filter as CategoryFilter;

            if (attributeFilter != null)
            {
                result = attributeFilter.Values?.OfType <IBrowseFilterValue>().ToArray();
            }
            else if (rangeFilter != null)
            {
                result = rangeFilter.Values?.OfType <IBrowseFilterValue>().ToArray();
            }
            else if (priceRangeFilter != null)
            {
                result = priceRangeFilter.Values?.OfType <IBrowseFilterValue>().ToArray();
            }
            else if (categoryFilter != null)
            {
                result = categoryFilter.Values?.OfType <IBrowseFilterValue>().ToArray();
            }

            return(result);
        }
Пример #2
0
        protected virtual IFilter ConvertBrowseFilter(IBrowseFilter filter, IList <string> valueIds, ProductIndexedSearchCriteria criteria)
        {
            IFilter result = null;

            if (filter != null && valueIds != null)
            {
                var attributeFilter  = filter as AttributeFilter;
                var rangeFilter      = filter as BrowseFilters.RangeFilter;
                var priceRangeFilter = filter as PriceRangeFilter;

                if (attributeFilter != null)
                {
                    result = ConvertAttributeFilter(attributeFilter, valueIds);
                }
                else if (rangeFilter != null)
                {
                    result = ConvertRangeFilter(rangeFilter, valueIds);
                }
                else if (priceRangeFilter != null)
                {
                    result = ConvertPriceRangeFilter(priceRangeFilter, valueIds, criteria);
                }
            }

            return(result);
        }
Пример #3
0
        public static IBrowseFilter Copy(this IBrowseFilter filter, IList <string> keys)
        {
            IBrowseFilter result = null;

            if (filter != null && keys != null)
            {
                // get values that we have filters set for
                var values = filter.GetValues().Where(v => keys.Contains(v.Id, StringComparer.OrdinalIgnoreCase));

                var attributeFilter  = filter as AttributeFilter;
                var rangeFilter      = filter as RangeFilter;
                var priceRangeFilter = filter as PriceRangeFilter;
                var categoryFilter   = filter as CategoryFilter;

                if (attributeFilter != null)
                {
                    var newFilter = new AttributeFilter();
                    newFilter.InjectFrom(filter);
                    newFilter.Values = values.OfType <AttributeFilterValue>().ToArray();
                    result           = newFilter;
                }
                else if (rangeFilter != null)
                {
                    var newFilter = new RangeFilter();
                    newFilter.InjectFrom(filter);

                    newFilter.Values = values.OfType <RangeFilterValue>().ToArray();
                    result           = newFilter;
                }
                else if (priceRangeFilter != null)
                {
                    var newFilter = new PriceRangeFilter();
                    newFilter.InjectFrom(filter);

                    newFilter.Values = values.OfType <RangeFilterValue>().ToArray();
                    result           = newFilter;
                }
                else if (categoryFilter != null)
                {
                    var newFilter = new CategoryFilter();
                    newFilter.InjectFrom(filter);
                    newFilter.Values = values.OfType <CategoryFilterValue>().ToArray();
                    result           = newFilter;
                }
            }

            return(result);
        }
Пример #4
0
        private void BrowseMessagesWorker(BlockingCollection <WsMessage> output, IBrowseFilter filter, CancellationToken ct, MQQueue queue, byte[] startingPointMessageId)
        {
            var browseOption = MQC.MQGMO_BROWSE_FIRST;

            if (startingPointMessageId != null)
            {
                if (SetBrowseCursorAtMessageId(queue, startingPointMessageId))
                {
                    browseOption = MQC.MQGMO_BROWSE_NEXT;
                }
            }

            var getMsgOpts = new MQGetMessageOptions()
            {
                Options = MQC.MQGMO_FAIL_IF_QUIESCING | browseOption
            };

            try
            {
                while (!ct.IsCancellationRequested)
                {
                    var msg = new MQMessage();
                    queue.Get(msg, getMsgOpts);

                    var localMsg = new WsMessage(msg, this);
                    if (filter == null || filter.IsMatch(localMsg))
                    {
                        output.Add(localMsg, ct);
                    }
                    else
                    {
                        output.Add(null, ct);
                    }

                    getMsgOpts.Options = MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_BROWSE_NEXT;
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (MQException ex)
            {
                if (ex.ReasonCode != MQC.MQRC_NO_MSG_AVAILABLE)
                {
                    throw;
                }
            }
        }
        private static IBrowseFilter ConvertToFilter(AggregationProperty property, int order)
        {
            IBrowseFilter result = null;

            switch (property.Type)
            {
            case _attributeType:
                result = new AttributeFilter
                {
                    Order     = order,
                    Key       = property.Name,
                    FacetSize = property.Size,
                    Values    = property.Values?.OrderBy(v => v, StringComparer.OrdinalIgnoreCase).Select(v => new AttributeFilterValue {
                        Id = v
                    }).ToArray(),
                };
                break;

            case _rangeType:
                result = new RangeFilter
                {
                    Order  = order,
                    Key    = property.Name,
                    Values = GetRangeFilterValues(property.Values),
                };
                break;

            case _priceRangeType:
                result = new PriceRangeFilter
                {
                    Order    = order,
                    Currency = property.Currency,
                    Values   = GetRangeFilterValues(property.Values),
                };
                break;
            }

            return(result);
        }
Пример #6
0
        public IEnumerable <IMessage> BrowseMessages(int numberOfMessages, CancellationToken ct, byte[] startingPointMessageId = null, IBrowseFilter filter = null, IProgress <int> progress = null)
        {
            MQQueue ibmQueue;

            var browseOption = MQC.MQGMO_BROWSE_FIRST;

            try
            {
                ibmQueue = OpenQueueCore(OpenQueueMode.ForBrowse);

                if (startingPointMessageId != null)
                {
                    if (SetBrowseCursorAtMessageId(ibmQueue, startingPointMessageId))
                    {
                        browseOption = MQC.MQGMO_BROWSE_NEXT;
                    }
                }
            }
            catch (MQException ibmEx)
            {
                throw ibmEx.ToMqException(AddExtraInfoToError);
            }

            int count = 0;

            var getMsgOpts = new MQGetMessageOptions()
            {
                Options = MQC.MQGMO_FAIL_IF_QUIESCING | browseOption
            };

            try
            {
                while (!ct.IsCancellationRequested)
                {
                    var msg = new MQMessage();
                    try
                    {
                        ibmQueue.Get(msg, getMsgOpts);
                    }
                    catch (MQException ibmEx)
                    {
                        if (ibmEx.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE)
                        {
                            break;
                        }

                        throw ibmEx.ToMqException(AddExtraInfoToError);
                    }
                    count++;
                    var localMsg = new WsMessage(msg, this);
                    if (filter == null || filter.IsMatch(localMsg))
                    {
                        progress?.Report(count);

                        localMsg.Index = count;
                        yield return(localMsg);
                    }

                    numberOfMessages--;
                    if (numberOfMessages == 0)
                    {
                        break;
                    }

                    getMsgOpts.Options = MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_BROWSE_NEXT;
                }
            }
            finally
            {
                ibmQueue?.Close();
            }
        }
Пример #7
0
        public IEnumerable <IMessage> BrowseMessages(int numberOfMessages, CancellationToken ct, byte[] startingPointMessageId = null, IBrowseFilter filter = null, IProgress <int> progress = null)
        {
            SetupBrowseConnectionPool();

            var workers = new List <Task>();

            var pipeline = new BlockingCollection <WsMessage>();
            var cts      = new CancellationTokenSource();


            Exception workerException = null;


            var     qm = _browseConnectionPool[0];
            MQQueue q  = qm.OpenQueueCore(this.Name, OpenQueueMode.ForBrowse);

            workers.Add(Task.Run(() => BrowseMessagesWorker(pipeline, filter, cts.Token, q, startingPointMessageId)));


            Task.WhenAll(workers)
            .ContinueWith((t) =>
            {
                pipeline.CompleteAdding();     // Inform that there are no more messages to read from the queue

                if (t.IsFaulted)
                {
                    workerException = t.Exception.InnerException;
                }
            });

            List <WsMessage> yieldBuffer = new List <WsMessage>();
            int count = 0;

            while (!pipeline.IsCompleted)
            {
                if (ct != CancellationToken.None && ct.IsCancellationRequested)
                {
                    cts.Cancel();
                    break;
                }
                ;


                WsMessage msg;
                if (pipeline.TryTake(out msg, 100))
                {
                    count++;
                    if (msg != null)
                    {
                        yieldBuffer.Add(msg);

                        msg.Index = count;
                        yield return(msg);

                        numberOfMessages--;
                        if (numberOfMessages == 0)
                        {
                            cts.Cancel();
                            break;
                        }
                    }

                    progress.Report(count);
                }
            }

            q?.Close();

            if (workerException != null)
            {
                MQException ibmEx = workerException as MQException;
                if (ibmEx != null)
                {
                    throw ibmEx.ToMqException(AddExtraInfoToError);
                }
                else
                {
                    throw workerException;
                }
            }
        }