/// <summary>
        /// Query items based on query expression. Consistent read is by default set to false to ensure performance
        /// </summary>
        public async Task <IEnumerable <SdbItem> > QueryItemsAsync(string query, bool consistentRead = false)
        {
            try
            {
                var selectRequest = new SelectRequest()
                {
                    SelectExpression = query,
                    ConsistentRead   = consistentRead
                };

                var response = await _client.SelectAsync(selectRequest);

                if (response.HttpStatusCode != HttpStatusCode.OK)
                {
                    return(new List <SdbItem>());
                }

                return(!response.Items.Any() ? new List <SdbItem>() : SimpleDbHelper.ConvertSimpleDbItemsToMetaStoreItems(response.Items));
            }
            catch (AmazonSimpleDBException e)
            {
                Console.WriteLine(e.StackTrace);
                throw;
            }
        }
        /// <summary>
        /// Creates single item
        /// </summary>
        public async Task <HttpStatusCode> CreateItemAsync(SdbItem item)
        {
            try
            {
                //Add additional attribute for the Exists flag on the newly created item
                item.Attributes = item.Attributes.Concat(new[] { new SdbItemAttribute(ExistsAttributeName, "1"), });

                var convertedAttributes = SimpleDbHelper.ConvertItemAttributesToReplaceableAttributes(item.Attributes);
                var putRequest          = new PutAttributesRequest(_simpleDbDomain, item.ItemName, convertedAttributes.ToList());
                var putResponse         = await _client.PutAttributesAsync(putRequest);

                return(putResponse.HttpStatusCode);
            }
            catch (AmazonSimpleDBException e)
            {
                Console.WriteLine(e.StackTrace);
                throw;
            }
        }
        /// <summary>
        /// Returns single item based on the id
        /// </summary>
        public async Task <SdbItem> GetItemAsync(string itemId, bool consistentRead = false)
        {
            try
            {
                var attributes = await RetrieveItemAttributesFromDb(itemId, consistentRead);

                if (!attributes.Any())
                {
                    return(null);
                }

                var item = new SdbItem(itemId, SimpleDbHelper.ConvertAttributesToItemAttributes(attributes));
                return(item);
            }
            catch (AmazonSimpleDBException e)
            {
                Console.WriteLine(e.StackTrace);
                throw;
            }
        }
        /// <summary>
        /// Creates multiple items simultaneously
        /// </summary>
        public async Task BatchCreateItemsAsync(IEnumerable <SdbItem> items)
        {
            var replaceableItems = new List <ReplaceableItem>();

            foreach (var item in items)
            {
                //Add additional attribute for the Exists flag on the newly created item
                item.Attributes = item.Attributes.Concat(new[] { new SdbItemAttribute(ExistsAttributeName, "1"), });
                var convertedAttributes = SimpleDbHelper.ConvertItemAttributesToReplaceableAttributes(item.Attributes);
                replaceableItems.Add(new ReplaceableItem(item.ItemName, convertedAttributes.ToList()));
            }

            try
            {
                var batchPutRequest = new BatchPutAttributesRequest(_simpleDbDomain, replaceableItems);
                await _client.BatchPutAttributesAsync(batchPutRequest);
            }
            catch (AmazonSimpleDBException e)
            {
                Console.WriteLine(e.StackTrace);
                throw;
            }
        }
        /// <summary>
        /// Returns all items
        /// </summary>
        public async Task <IEnumerable <SdbItem> > GetAllItems()
        {
            try
            {
                var selectRequest = new SelectRequest()
                {
                    SelectExpression = "select * from `" + _simpleDbDomain + "`"
                };

                var response = await _client.SelectAsync(selectRequest);

                if (response.HttpStatusCode != HttpStatusCode.OK)
                {
                    return(new List <SdbItem>());
                }

                return(!response.Items.Any() ? new List <SdbItem>() : SimpleDbHelper.ConvertSimpleDbItemsToMetaStoreItems(response.Items));
            }
            catch (AmazonSimpleDBException e)
            {
                Console.WriteLine(e.StackTrace);
                throw;
            }
        }