示例#1
0
        public BloombergAdHocRequestData GetMatchingRemoteMessage(BloombergAdHocRequestData localMessage, IEnumerable <BloombergAdHocRequestData> remoteMessages)
        {
            var matches = remoteMessages.Where(remote => remote.SecurityIdentifier == localMessage.MappedFriendlyTicker() && remote.FieldsToPull == string.Format("{0},DL_ASSET_CLASS", localMessage.OriginalRequestItem.BBFieldList));

            if (matches.Count() == 0)
            {
                return(null);
            }
            return(matches.First(x => x.bloombergAdHocId == matches.Max(y => y.bloombergAdHocId)));
        }
示例#2
0
        private void BloombergAdHocRequestDataReadyHandler(BloombergAdHocRequestData returnedReq)
        {
            NLogger.Instance.Info("{0} Ad hoc data received for request ID {1} for {2} at {3}.", Process.GetCurrentProcess().Id,
                                  returnedReq.OriginalRequestItem.ID,
                                  returnedReq.OriginalRequestItem.BBTicker,
                                  DateTime.Now.ToString("HH:mm"));

            //call db.savevalues with the original Request Item
            var valueArray = returnedReq.ReturnData.EndsWith("|") ?
                             returnedReq.ReturnData.Substring(0, returnedReq.ReturnData.Length - 1).Split('|') :
                             returnedReq.ReturnData.Split('|');

            //fill asset class to last value;
            returnedReq.OriginalRequestItem.TickerDownloadAssetClass = valueArray[valueArray.Length - 1];

            //fill errors
            if (valueArray[0].StartsWith("Problem with Request format", StringComparison.OrdinalIgnoreCase)
                ||
                valueArray[0].StartsWith("Error_Code", StringComparison.OrdinalIgnoreCase)
                )
            {
                returnedReq.OriginalRequestItem.Errors += string.Format("Toronto AdHoc Service/Bloomberg AdHoc Data License Webservice error: {0}", valueArray[0]);
            }
            else
            {
                //error log NA NS or blanks.
                var fieldList = returnedReq.OriginalRequestItem.BBFieldList.Split(',');
                for (int i = 0; i < fieldList.Length; i++)
                {
                    var returnedValue = valueArray[i];
                    var key           = fieldList[i];

                    //Clean values
                    valueArray[i] = Static.CleanValueReturnedFromBloomberg(returnedReq.OriginalRequestItem.BBTicker, key, valueArray[i]);

                    //dont write N.A.
                    if (returnedValue.Equals("N.A.") || returnedValue.Equals("N.S.") || returnedValue.Trim().Equals(string.Empty))
                    {
                        returnedReq.OriginalRequestItem.Errors += string.Format("[{0}|returned {1}]", key, returnedValue.Trim().Equals(string.Empty) ? "blank string" : returnedValue);
                        valueArray[i] = null;
                    }
                }
                returnedReq.OriginalRequestItem.Data.Add(DateTime.Now, valueArray);
            }
            Db.SaveValues(new List <RequestItem> {
                returnedReq.OriginalRequestItem
            });

            CostReportUserAttribution(new List <RequestItem> {
                returnedReq.OriginalRequestItem
            });
        }
示例#3
0
        public virtual int SubmitDataRequestsAsync(IEnumerable <RequestItem> adHocRequests)
        {
            //get remote queue ID marker.
            var idMarker = Utils.DbController.GetScalar <int>("select max(bloombergadhocid) from HELIUM.[BloombergDataLicense].[dbo].BloombergAdHoc;") + 1;

            Parallel.ForEach(adHocRequests, new ParallelOptions {
                MaxDegreeOfParallelism = 10
            }, x =>
            {
                var newRemoteRequest = new BloombergAdHocRequestData(x)
                {
                    bloombergAdHocId = idMarker
                };
                var sql = String.Format("INSERT INTO [HELIUM].[BloombergDataLicense].[dbo].[BloombergAdHoc] ([FieldsToPull], [SecurityIdentifier],lastupdatedatetime,lastupdateuser)VALUES ( '{0}', '{1}',getdate(),'Berg: {2}' );", newRemoteRequest.OriginalRequestItem.BBFieldList + ",DL_ASSET_CLASS", newRemoteRequest.MappedFriendlyTicker(), newRemoteRequest.OriginalRequestItem.UserId);
                Utils.DbController.ExecuteNonQuery(sql);
                GlobalListOfOutstandingAdHocRequests.TryAdd(newRemoteRequest.OriginalRequestItem.ID, newRemoteRequest);
                //log
                NLogger.Instance.Info("{0} Ad hoc data request sent for request ID {1} for {2}", Process.GetCurrentProcess().Id, x.ID, x.BBTicker);
            });

            return(idMarker);
        }
示例#4
0
        /// <summary>
        /// Check for return data.
        /// </summary>
        /// <returns></returns>
        protected virtual string GetReturnData(BloombergAdHocRequestData adHocRequestData)
        {
            var sql = string.Format("select top 1 returndata from [HELIUM].[BloombergDataLicense].[dbo].[BloombergAdHoc] where returndata is not null and bloombergadhocid >= {0} and fieldstopull='{1},DL_ASSET_CLASS' and securityidentifier='{2}' order by bloombergAdHocId desc", adHocRequestData.bloombergAdHocId, adHocRequestData.OriginalRequestItem.BBFieldList, adHocRequestData.MappedFriendlyTicker());

            return(Utils.DbController.GetScalar <string>(sql));
        }
示例#5
0
 protected override string GetReturnData(BloombergAdHocRequestData adHocRequestData)
 {
     return("GBp||London|LN|LN||GB00B1S49Q91|B1S49Q9||Domino''s Pizza Group PLC|DOMINO''S PIZZA GROUP PLC||DOM LN||17");
 }
示例#6
0
        private void ProcessDataRequests(IEnumerable <RequestItem> requestItemsAll, bool tryReuseMessagesOnRemoteQueue)
        {
            if (!requestItemsAll.Any())
            {
                return;
            }

            foreach (var item in requestItemsAll)
            {
                NLogger.Instance.Info("Dequeued message - ID: {0} bbticker: {1} fields: {2}", item.ID, item.BBTicker, item.BBFieldList);
            }

            //refresh routing table.
            var oldRules = _routingRules;

            _routingRules = Db.GetRoutingRules();
            if (!oldRules.SequenceEqual(_routingRules))
            {
                NLogger.Instance.Info("Routing rule table has changed...changes picked up ...");
            }

            //split into separate lists - one for datawarehouse, one for legacy api, one for bloomberg ad hoc
            var requestItemsForBloombergApi   = new List <RequestItem>();
            var requestItemsForBloombergAdHoc = new List <RequestItem>();
            var requestItemsForDatawarehouse  = new List <RequestItem>();

            foreach (var item in requestItemsAll)
            {
                var ds = GetFirstMatchingDataSource(item);
                if (ds == "Warehouse")
                {
                    requestItemsForDatawarehouse.Add(item);
                }
                else if (ds == "BLAPI")
                {
                    requestItemsForBloombergApi.Add(item);
                }
                else if (ds == "AdHoc")
                {
                    requestItemsForBloombergAdHoc.Add(item);
                }
                else
                {
                    NLogger.Instance.Info("No matching rule found in routing table for userid {0}", item.UserId);
                }
            }

            //process api
            if (requestItemsForBloombergApi.Count != 0)
            {
                var tickers = string.Join(",", requestItemsForBloombergApi.Select(x => x.BBTicker).ToArray());
                RaiseMessageEvent(string.Format("Calling Bloomberg API for {0} tickers ({1})", requestItemsForBloombergApi.Count, tickers));
                ApiController.ProcessDataRequests(requestItemsForBloombergApi);
            }

            //process warehouse
            if (requestItemsForDatawarehouse.Count != 0)
            {
                var tickers = string.Join(",", requestItemsForDatawarehouse.Select(x => x.BBTicker).ToArray());
                RaiseMessageEvent(string.Format("Calling Warehouse for {0} tickers ({1})", requestItemsForDatawarehouse.Count, tickers));
                _datawarehouseController.ProcessDataRequests(requestItemsForDatawarehouse);
            }

            //check for returned errors
            var apiSecondChance = requestItemsForDatawarehouse.FindAll(x => x.Errors.StartsWith("Ticker not found"));

            if (apiSecondChance.Count > 0)
            {
                var tickers = string.Join(",", apiSecondChance.Select(x => x.OriginalInputTicker).ToArray());
                RaiseMessageEvent(string.Format("Trying Bloomberg API for tickers which could not be found in warehouse... {0} tickers ({1})", apiSecondChance.Count, tickers));
                ApiController.ProcessDataRequests(apiSecondChance);
            }

            //go to bloomberg adhoc controller - async
            if (requestItemsForBloombergAdHoc.Count > 0)
            {
                if (tryReuseMessagesOnRemoteQueue)
                {
                    IEnumerable <BloombergAdHocRequestData> remoteMessages = _adHocQueueController.GetMessagesOnRemoteQueueSinceThisTime(requestItemsForBloombergAdHoc.Min(x => x.InsertedWhen));
                    List <int> dsToDelete = new List <int>();
                    foreach (var staleLocal in requestItemsForBloombergAdHoc)
                    {
                        var newAdHocRequest = new BloombergAdHocRequestData(staleLocal);

                        var matchedRemoteMessage = _adHocQueueController.GetMatchingRemoteMessage(newAdHocRequest, remoteMessages);

                        //cant find it in the list of remote messages.

                        if (matchedRemoteMessage == null)
                        {
                            NLogger.Instance.Info("No match for stale: {0} / {1}  - will resubmit to remote queue.", staleLocal.BBTicker, staleLocal.BBFieldList);
                        }
                        else
                        //found. add it to the list of bloombergAdHocRequests for monitoring
                        {
                            newAdHocRequest.bloombergAdHocId = matchedRemoteMessage.bloombergAdHocId;
                            _adHocQueueController.GlobalListOfOutstandingAdHocRequests.TryAdd(newAdHocRequest.OriginalRequestItem.ID, newAdHocRequest);
                            dsToDelete.Add(newAdHocRequest.OriginalRequestItem.ID);
                            NLogger.Instance.Info("Match found for stale: {0} / {1} -> ID>{2}", staleLocal.BBTicker, staleLocal.BBFieldList, newAdHocRequest.bloombergAdHocId);
                        }
                    }

                    foreach (var id in dsToDelete)
                    {
                        requestItemsForBloombergAdHoc.RemoveAll(x => x.ID == id);
                    }
                }
                //console logging only
                var tickers = string.Join(",", requestItemsForBloombergAdHoc.Select(x => x.BBTicker).ToArray()); RaiseMessageEvent(string.Format("Calling Ad Hoc for {0} tickers ({1})", requestItemsForBloombergAdHoc.Count, tickers));

                _adHocQueueController.SubmitDataRequestsAsync(requestItemsForBloombergAdHoc);
            }
        }