예제 #1
0
        private static TPayload SafeConvertBack <TPayload>(DynamicTableEntity dte)
        {
            var payloadType = typeof(TPayload);

            if (!_validPropertyNames.ContainsKey(payloadType))
            {
                lock (payloadType)
                {
                    if (!_validPropertyNames.ContainsKey(payloadType))
                    {
                        var properties = payloadType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
                        _validPropertyNames[payloadType] = properties.Select(p => p.Name).ToList();
                    }
                }
            }

            var propertyNames = _validPropertyNames[payloadType];

            var entityProperties = new Dictionary <string, EntityProperty>();

            foreach (var kv in dte.Properties.Where(p => propertyNames.Contains(p.Key)))
            {
                entityProperties[kv.Key] = kv.Value;
            }
            var payload = EntityPropertyConverter.ConvertBack <TPayload>(entityProperties, new OperationContext());

            return(payload);
        }
        /// <summary>
        /// Get the latest <see cref="Snapshot"/> from storage.
        /// </summary>
        /// <returns>The most recent <see cref="Snapshot"/> of</returns>
        protected override Snapshot Get(Type aggregateRootType, string streamName)
        {
            // Create the table query.
            var rangeQuery = new TableQuery <DynamicTableEntity>().Where
                             (
                TableQuery.CombineFilters
                (
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, StorageStore <object, object> .GetSafeStorageKey(streamName)),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("AggregateId", QueryComparisons.Equal, streamName)
                )
                             );

            var      operationContext = new OperationContext();
            Snapshot result           = TableStorageStore.ReadableSource.ExecuteQuery(rangeQuery)
#pragma warning disable 0436
                                        .Select(eventData => EntityPropertyConverter.ConvertBack <EventData>(eventData.Properties, operationContext))
#pragma warning restore 0436
                                        .Where(eventData => eventData.AggregateId == streamName)
                                        .OrderByDescending(eventData => eventData.Version)
                                        .Take(1)
                                        .Select(EventDeserialiser.Deserialise)
                                        .SingleOrDefault();

            return(result);
        }
예제 #3
0
        /// <summary>
        /// Gets a collection of <see cref="IEvent{TAuthenticationToken}"/> for the <see cref="IAggregateRoot{TAuthenticationToken}"/> of type <paramref name="aggregateRootType"/> with the ID matching the provided <paramref name="aggregateId"/>.
        /// </summary>
        /// <param name="aggregateRootType"> <see cref="Type"/> of the <see cref="IAggregateRoot{TAuthenticationToken}"/> the <see cref="IEvent{TAuthenticationToken}"/> was raised in.</param>
        /// <param name="aggregateId">The <see cref="IAggregateRoot{TAuthenticationToken}.Id"/> of the <see cref="IAggregateRoot{TAuthenticationToken}"/>.</param>
        /// <param name="useLastEventOnly">Loads only the last event<see cref="IEvent{TAuthenticationToken}"/>.</param>
        /// <param name="fromVersion">Load events starting from this version</param>
        public override IEnumerable <IEvent <TAuthenticationToken> > Get(Type aggregateRootType, Guid aggregateId, bool useLastEventOnly = false, int fromVersion = -1)
        {
            string streamName = GenerateStreamName(aggregateRootType, aggregateId);

            // Create the table query.
            var rangeQuery = new TableQuery <DynamicTableEntity>().Where
                             (
                TableQuery.CombineFilters
                (
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, StorageStore <object, object> .GetSafeStorageKey(streamName)),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("AggregateId", QueryComparisons.Equal, streamName)
                )
                             );

            var operationContext          = new OperationContext();
            IEnumerable <EventData> query = TableStorageStore.ReadableSource.ExecuteQuery(rangeQuery)
#pragma warning disable 0436
                                            .Select(eventData => EntityPropertyConverter.ConvertBack <EventData>(eventData.Properties, operationContext))
#pragma warning restore 0436
                                            .Where(eventData => eventData.AggregateId == streamName && eventData.Version > fromVersion)
                                            .OrderByDescending(eventData => eventData.Version);

            if (useLastEventOnly)
            {
                query = query.AsQueryable().Take(1);
            }

            return(query
                   .Select(eventData => EventDeserialiser.Deserialise(eventData))
                   .ToList());
        }
예제 #4
0
        public async Task <TModel> Get <TModel>(string tableName, string partitionKey, string rowKey)
        {
            var context = new OperationContext();
            var entity  = await GetSinglePointResult(tableName, partitionKey, rowKey);

            var model = EntityPropertyConverter.ConvertBack <TModel>(entity.Properties, context);

            return(model);
        }
예제 #5
0
        public async Task <IEnumerable <T> > QueryAsync <T>(IEnumerable <QueryParameter> queryParameters,
                                                            IGraphRequestContext graphRequestContext)
        {
            var info = Get <T>(graphRequestContext);

            var results = await info.Table.ExecuteQuerySegmentedAsync(GenerateTableQuery(queryParameters.ToList()), null);

            return(results.Results.Select(x => EntityPropertyConverter.ConvertBack <T>(x.Properties, new OperationContext())).ToList());
        }
예제 #6
0
        public async Task <Rating> GetRating(string coinId, string userId)
        {
            TableOperation getOperation = TableOperation.Retrieve <DynamicTableEntity>(coinId, userId);
            var            result       = await this.ratingsTable.ExecuteAsync(getOperation);

            var tableEntity = result.Result as DynamicTableEntity;

            return(tableEntity == null ? null : EntityPropertyConverter.ConvertBack <Rating>(tableEntity.Properties, new OperationContext()));
        }
예제 #7
0
        public async Task <MasternodeStats> GetMasternodeStats(string coinId)
        {
            TableOperation getOperation = TableOperation.Retrieve <DynamicTableEntity>("coin", coinId);
            var            result       = await this.masternodeStatsTable.ExecuteAsync(getOperation);

            var tableEntity = result.Result as DynamicTableEntity;

            return(EntityPropertyConverter.ConvertBack <MasternodeStats>(tableEntity.Properties, new OperationContext()));
        }
예제 #8
0
        public async Task <TEntity> GetByKeys(string partitionKey, string rowKey, CancellationToken cancellationToken)
        {
            var dynamicTableEntity = await Get(partitionKey, rowKey, cancellationToken);

            if (dynamicTableEntity == null)
            {
                return(null);
            }

            return(EntityPropertyConverter.ConvertBack <TEntity>(dynamicTableEntity.Properties, new OperationContext()));
        }
예제 #9
0
        public async Task <TEntity> GetByIds(Guid partitionId, Guid rowId, CancellationToken cancellationToken)
        {
            var dynamicTableEntity = await Get(partitionId.ToString(), rowId.ToString(), cancellationToken);

            if (dynamicTableEntity == null)
            {
                return(null);
            }

            return(EntityPropertyConverter.ConvertBack <TEntity>(dynamicTableEntity.Properties, new OperationContext()));
        }
예제 #10
0
        public override void Get(string id)
        {
            CloudTableClient tableClient = ProgramNew.storageAccount.CreateCloudTableClient();
            CloudTable       table       = tableClient.GetTableReference(this.GetType().Name);

            // Point Query
            TableOperation retrieveServiceOperation = TableOperation.Retrieve <ServiceDetail>("NLAG-CT-20190224", "SERVICEDETAILS");
            var            serviceDetails           = table.ExecuteAsync(retrieveServiceOperation).Result;

            TableOperation retrieveRehearsalOperation = TableOperation.Retrieve <RehearsalDetail>("NLAG-CT-20190224", "REHEARSALDETAILS");
            var            rehearsalDetails           = table.ExecuteAsync(retrieveRehearsalOperation).Result;

            //Range Query on Row Key
            TableQuery rangeQuery = new TableQuery().Where(
                TableQuery.CombineFilters(
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "NLAG-CT-20190224"),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan, "")));

            var worshipLeaders = table.ExecuteQuerySegmentedAsync(rangeQuery, null).Result;

            foreach (var item in worshipLeaders.Results)
            {
                if (item.RowKey == "REHEARSALDETAILS")
                {
                    var props = item.Properties;

                    RehearsalDetail rehearsal = EntityPropertyConverter.ConvertBack <RehearsalDetail>(item.Properties, null);
                }
            }
            ;

            //Range Query on Partition Key
            var rangeQueryPKey = new TableQuery().Where(
                TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThan, "NLAG-CT-20190210"));

            var pkeys = table.ExecuteQuerySegmentedAsync(rangeQueryPKey, null).Result;

            //Partition Scan
            TableQuery queryPScan = new TableQuery().Where(
                TableQuery.CombineFilters(
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "NLAG-CT-20190217"),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition("AG1", QueryComparisons.Equal, "Manjrekar")));

            var ag1Manjrekar = table.ExecuteQuerySegmentedAsync(queryPScan, null).Result;

            //Table Scan
            TableQuery queryTScan = new TableQuery().Where(
                TableQuery.GenerateFilterCondition("AG1", QueryComparisons.Equal, "Manjrekar"));

            var ag1ManjrekarTScan = table.ExecuteQuerySegmentedAsync(queryTScan, null).Result;
        }
예제 #11
0
        public override void Update(TData data)
        {
            DynamicTableEntity dynamicTableEntity = CreateTableEntity(data) as DynamicTableEntity;

            if (dynamicTableEntity == null)
            {
                base.Update(data);
                return;
            }
            //Convert the DynamicTableEntity back to original complex object.
            TData result = EntityPropertyConverter.ConvertBack <TData>(dynamicTableEntity.Properties, new OperationContext());

            Update(new EntityTableEntity <TData>(result));
        }
예제 #12
0
        public override IEnumerable <EventData> Get(Guid correlationId)
        {
            // Create the table query.
            var rangeQuery = new TableQuery <DynamicTableEntity>().Where
                             (
                TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, StorageStore <object, object> .GetSafeStorageKey(correlationId.ToString("N")))
                             );

            var operationContext          = new OperationContext();
            IEnumerable <EventData> query = CorrelationIdTableStorageStore.ReadableSource.ExecuteQuery(rangeQuery)
                                            .Select(eventData => EntityPropertyConverter.ConvertBack <EventData>(eventData.Properties, operationContext))
                                            .OrderBy(eventData => eventData.Timestamp);

            return(query.ToList());
        }
예제 #13
0
        public async Task <IEnumerable <Coin> > GetCoins()
        {
            TableContinuationToken token = null;
            var list = new List <Coin>();

            do
            {
                var queryResult = await this.coinsTable.ExecuteQuerySegmentedAsync(new TableQuery <DynamicTableEntity>(), token);

                list.AddRange(queryResult.Results.Select(x => EntityPropertyConverter.ConvertBack <Coin>(x.Properties, new OperationContext())));
                token = queryResult.ContinuationToken;
            } while (token != null);

            return(list);
        }
예제 #14
0
        public static async Task <TPayload> Unwrap <TPayload>
            (this DynamicTableEntity dte, string columnName = Columns.Json)
        {
            if (dte == null)
            {
                return(default(TPayload));
            }

            return(await Task.Factory.StartNew <TPayload>(() =>
            {
                var payload =
                    EntityPropertyConverter.ConvertBack <TPayload>
                        (dte.Properties, new OperationContext());
                return payload;
            }).ConfigureAwait(false));
        }
예제 #15
0
        public override EntityTableEntity <TData> GetByKeyAndRow(Guid rsn)
        {
            TableOperation searchQuery = TableOperation.Retrieve <DynamicTableEntity>(typeof(TData).FullName, rsn.ToString("N"));

            TableResult searchResult = ReadableSource.Execute(searchQuery);

            var dynamicTableEntity = searchResult.Result as DynamicTableEntity;

            if (dynamicTableEntity == null)
            {
                return(base.GetByKeyAndRow(rsn));
            }

            //Convert the DynamicTableEntity back to original complex object.
            TData result = EntityPropertyConverter.ConvertBack <TData>(dynamicTableEntity.Properties, new OperationContext());

            return(new EntityTableEntity <TData>(result));
        }
예제 #16
0
        public async Task <IEnumerable <Rating> > GetRatings(string coinId)
        {
            TableContinuationToken token = null;
            var list  = new List <Rating>();
            var query = new TableQuery <DynamicTableEntity>();

            query.FilterString = $"PartitionKey eq '{coinId}'";

            do
            {
                var queryResult = await this.ratingsTable.ExecuteQuerySegmentedAsync(query, token);

                list.AddRange(queryResult.Results.Select(x => EntityPropertyConverter.ConvertBack <Rating>(x.Properties, new OperationContext())));
                token = queryResult.ContinuationToken;
            } while (token != null);

            return(list);
        }
        public async Task <IEnumerable <T> > QueryAsync <T>(IEnumerable <QueryParameter> queryParameters,
                                                            IGraphRequestContext graphRequestContext)
        {
            var info = Get <T>(graphRequestContext);

            var list = new List <T>();

            var continuationToken = default(TableContinuationToken);

            do
            {
                var results = await info.Table.ExecuteQuerySegmentedAsync(GenerateTableQuery(queryParameters.ToList()), continuationToken);

                list.AddRange(results.Results.Select(x => EntityPropertyConverter.ConvertBack <T>(x.Properties, new OperationContext())).ToList());

                continuationToken = results.ContinuationToken;
            }while (continuationToken != null);

            return(list);
        }