private string ToOrderHistoryColumn(OrderBlotterSortingColumn sortingColumn)
        {
            switch (sortingColumn)
            {
            case OrderBlotterSortingColumn.Price:
                return(nameof(IOrderHistoryForOrderBlotter.ExecutionPrice));

            case OrderBlotterSortingColumn.Quantity:
                return(nameof(IOrderHistoryForOrderBlotter.Volume));

            case OrderBlotterSortingColumn.Validity:
                return(nameof(IOrderHistoryForOrderBlotter.ValidityTime));

            case OrderBlotterSortingColumn.CreatedOn:
                return(nameof(IOrderHistoryForOrderBlotter.CreatedTimestamp));

            case OrderBlotterSortingColumn.ExchangeRate:
                return(nameof(IOrderHistoryForOrderBlotter.FxRate));

            case OrderBlotterSortingColumn.ModifiedOn:
                return(nameof(IOrderHistoryForOrderBlotter.ModifiedTimestamp));

            default: throw new NotImplementedException();
            }
        }
Ejemplo n.º 2
0
 public Task <PaginatedResponse <IOrderHistoryForOrderBlotterWithAdditionalData> > GetOrderBlotterAsync(DateTime relevanceTimestamp, string accountIdOrName, string assetName, string createdBy,
                                                                                                        List <OrderStatus> statuses, List <OrderType> orderTypes, List <OriginatorType> originatorTypes, DateTime?createdOnFrom, DateTime?createdOnTo,
                                                                                                        DateTime?modifiedOnFrom, DateTime?modifiedOnTo, int skip, int take, OrderBlotterSortingColumn sortingColumn, SortingOrder sortingOrder)
 {
     throw new NotImplementedException();
 }
        public async Task <PaginatedResponse <IOrderHistoryForOrderBlotterWithAdditionalData> > GetOrderBlotterAsync(
            DateTime relevanceTimestamp,
            string accountIdOrName,
            string assetName,
            string createdBy,
            List <OrderStatus> statuses,
            List <OrderType> orderTypes,
            List <OriginatorType> originatorTypes,
            DateTime?createdOnFrom,
            DateTime?createdOnTo,
            DateTime?modifiedOnFrom,
            DateTime?modifiedOnTo,
            int skip,
            int take,
            OrderBlotterSortingColumn sortingColumn,
            SortingOrder sortingOrder)
        {
            using (var conn = new SqlConnection(_connectionString))
            {
                var assetPairId = (string)null;
                if (!string.IsNullOrWhiteSpace(assetName))
                {
                    assetPairId = await conn.QueryFirstOrDefaultAsync <string>(_getAssetIdByNameScript, new { assetName });

                    if (assetPairId == null)
                    {
                        return(new PaginatedResponse <IOrderHistoryForOrderBlotterWithAdditionalData>(
                                   contents: new List <IOrderHistoryForOrderBlotterWithAdditionalData>(),
                                   start: skip,
                                   size: 0,
                                   totalSize: 0
                                   ));
                    }
                }

                var accountIds = new List <string>();
                if (!string.IsNullOrWhiteSpace(accountIdOrName))
                {
                    accountIds.Add(accountIdOrName);
                    var accountId = await conn.QueryFirstOrDefaultAsync <string>(_getAccountIdByNameScript, new
                    {
                        accountName = accountIdOrName
                    });

                    if (!string.IsNullOrWhiteSpace(accountId))
                    {
                        accountIds.Add(accountId);
                    }
                }

                var whereClause      = $@"WHERE oh.ModifiedTimestamp <= @relevanceTimestamp
                    {(!accountIds.Any() ? "" : " AND oh.AccountId IN @accountIds")}
                    {(string.IsNullOrEmpty(assetPairId) ? "" : " AND oh.AssetPairId = @assetPairId")}
                    {(string.IsNullOrEmpty(createdBy) ? "" : " AND oh.CreatedBy = @createdBy")}
                    {(!(statuses?.Any() ?? false) ? "" : " AND oh.Status IN @statuses")}
                    {(!(orderTypes?.Any() ?? false) ? "" : " AND oh.Type IN @orderTypes")}
                    {(!(originatorTypes?.Any() ?? false) ? "" : " AND oh.Originator IN @originatorTypes")}
                    {(!createdOnFrom.HasValue ? "" : " AND oh.CreatedTimestamp >= @createdOnFrom")}
                    {(!createdOnTo.HasValue ? "" : " AND oh.CreatedTimestamp < @createdOnTo")}
                    {(!modifiedOnFrom.HasValue ? "" : " AND oh.ModifiedTimestamp >= @modifiedOnFrom")}
                    {(!modifiedOnTo.HasValue ? "" : " AND oh.ModifiedTimestamp < @modifiedOnTo")}";
                var paginationClause = $"ORDER BY {ToOrderHistoryColumn(sortingColumn)} {(sortingOrder == SortingOrder.ASC ? "ASC" : "DESC")} OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY";

                var gridReader = await conn.QueryMultipleAsync(
                    GetOrderBlotterScript(whereClause, paginationClause),
                    new
                {
                    relevanceTimestamp,
                    accountIds,
                    assetPairId,
                    createdBy,
                    statuses        = statuses?.Select(x => x.ToString()).ToArray(),
                    orderTypes      = orderTypes?.Select(x => x.ToString()).ToArray(),
                    originatorTypes = originatorTypes?.Select(x => x.ToString()).ToArray(),
                    createdOnFrom,
                    createdOnTo,
                    modifiedOnFrom,
                    modifiedOnTo,
                    skip,
                    take
                },
                    commandTimeout : (int)_orderBlotterExecutionTimeout?.TotalSeconds);

                var orderHistoryEntities = (await gridReader.ReadAsync <OrderHistoryForOrderBlotterEntity>()).ToList();
                var totalCount           = await gridReader.ReadSingleAsync <int>();

                await PopulateAdditionalDataAsync(conn, orderHistoryEntities);

                return(new PaginatedResponse <IOrderHistoryForOrderBlotterWithAdditionalData>(
                           contents: orderHistoryEntities,
                           start: skip,
                           size: orderHistoryEntities.Count,
                           totalSize: totalCount
                           ));
            }
        }