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))); }
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 }); }
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); }
/// <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)); }
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"); }
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); } }