public void AllKeysReturnsListOfKeys()
        {
            var bucket = Bucket + "_" + Guid.NewGuid().ToString();
            var originalKeys = new List<string>();

            for (var i = 0; i < 10; i++)
            {
                var o = new RiakObject(bucket, Guid.NewGuid().ToString(), "{ value: \"this is an object\" }");
                originalKeys.Add(o.Key);

                Client.Put(o);
            }

            var mr = new RiakMapReduceQuery()
                .Inputs(RiakIndex.AllKeys(bucket));

            var result = Client.MapReduce(mr);
            var keys = result.Value.PhaseResults.SelectMany(x => x.GetObjectIds()).ToList();

            result.IsSuccess.ShouldBeTrue(result.ErrorMessage);
            keys.Count.ShouldEqual(10);

            foreach (var key in keys)
            {
                key.Bucket.ShouldNotBeNullOrEmpty();
                key.Key.ShouldNotBeNullOrEmpty();
                originalKeys.Contains(key.Key).ShouldBeTrue();
            }
        }
示例#2
0
        private static void StoreData()
        {
            Console.WriteLine("[ChaosMonkeyApp] store thread starting");
            IRiakClient client = cluster.CreateClient();
            try
            {
                while (true)
                {
                    var id = new RiakObjectId("chaos-monkey", key.ToString());
                    var obj = new RiakObject(id, Guid.NewGuid().ToString());
                    obj.ContentEncoding = RiakConstants.CharSets.Utf8;
                    obj.ContentType = RiakConstants.ContentTypes.TextPlain;

                    var rslt = client.Put(obj);
                    if (rslt.IsSuccess)
                    {
                        Console.WriteLine("[ChaosMonkeyApp] stored key: {0}", key);
                    }
                    else
                    {
                        Console.WriteLine("[ChaosMonkeyApp] error storing key {0}, {1}", key, rslt.ErrorMessage);
                    }

                    ++key;
                    Thread.Sleep(storeDataInterval);
                    ct.ThrowIfCancellationRequested();
                }
            }
            finally
            {
                Console.WriteLine("[ChaosMonkeyApp] store thread stopping");
            }
        }
        protected void CreateLinkedObjects(string bucketName)
        {
            var oj = new RiakObject(bucketName, OJ, new Person() { Name = "oj" });
            var jeremiah = new RiakObject(bucketName, Jeremiah, new Person() { Name = "jeremiah" });
            var brent = new RiakObject(bucketName, Brent, new Person() { Name = "brent" });
            var rob = new RiakObject(bucketName, Rob, new Person() { Name = "rob" });

            oj.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            jeremiah.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            brent.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            rob.ContentType = RiakConstants.ContentTypes.ApplicationJson;

#pragma warning disable 618
            oj.LinkTo(jeremiah, "friends");
            oj.LinkTo(jeremiah, "coworkers");

            jeremiah.LinkTo(oj, "friends");
            jeremiah.LinkTo(oj, "coworkers");
            jeremiah.LinkTo(oj, "ozzies");
            jeremiah.LinkTo(brent, "friends");
            jeremiah.LinkTo(brent, "coworkers");
            jeremiah.LinkTo(rob, "ozzies");

            brent.LinkTo(jeremiah, "coworkers");
            brent.LinkTo(jeremiah, "friends");
#pragma warning restore 618
            Client.Put(new[] { oj, jeremiah, brent, rob });
        }
        public void AsyncDeleteMultipleIsSuccessful()
        {
            var one = new RiakObject(TestBucket, "one", TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var two = new RiakObject(TestBucket, "two", TestJson, RiakConstants.ContentTypes.ApplicationJson);

            Client.Put(one);
            Client.Put(two);

            var oneObjectId = one.ToRiakObjectId();
            var twoObjectId = two.ToRiakObjectId();

            var list = new List<RiakObjectId> { oneObjectId, twoObjectId };

            var results = Client.Async.Delete(list).Result;

            foreach (var riakResult in results)
            {
                riakResult.IsSuccess.ShouldBeTrue(riakResult.ErrorMessage);
            }

            var oneResult = Client.Get(oneObjectId);
            oneResult.IsSuccess.ShouldBeFalse();
            oneResult.ResultCode.ShouldEqual(ResultCode.NotFound);
            oneResult.Value.ShouldBeNull();

            var twoResult = Client.Get(twoObjectId);
            twoResult.IsSuccess.ShouldBeFalse();
            twoResult.ResultCode.ShouldEqual(ResultCode.NotFound);
            twoResult.Value.ShouldBeNull();
        }
        public async Task Save(String endpoint, long position)
        {
            var id = new RiakObjectId($"{Settings.Bucket}.system", endpoint);

            var options = new RiakGetOptions { };
            options.SetRw(Quorum.WellKnown.All);
            var exists = await _riak.Async.Get(id, options);
            if (exists.IsSuccess)
            {
                var checkpoint = exists.Value.GetObject<Checkpoint>();
                checkpoint.Position = position;

                exists.Value.SetObject(checkpoint);

                var putOpt = new RiakPutOptions { IfNotModified = true, IfNoneMatch = false };
                putOpt.SetW(Quorum.WellKnown.All);
                await _riak.Async.Put(exists.Value, putOpt);
            }
            else
            {
                var checkpoint = new Checkpoint
                {
                    Id = endpoint,
                    Position = position,
                };
                var putOpt = new RiakPutOptions { IfNotModified = false, IfNoneMatch = true };
                putOpt.SetW(Quorum.WellKnown.All);
                var o = new RiakObject(id, checkpoint);
                await _riak.Async.Put(o, putOpt);

            }
        }
        public void CustomSerializerWillSerializeJson()
        {
            var testPerson = new Person
            {
                DateOfBirth = new DateTime(1978, 12, 5, 0, 0, 0, DateTimeKind.Utc),
                Email = "*****@*****.**",
                Name = new Name
                {
                    FirstName = "OJ",
                    Surname = "Reeves"
                },
                PhoneNumbers = new List<PhoneNumber>
                {
                    new PhoneNumber
                    {
                        Number = "12345678",
                        NumberType = PhoneNumberType.Home
                    }
                }
            };

            var sots = new SerializeObjectToString<Person>(JsonConvert.SerializeObject);

            var obj = new RiakObject("bucket", "key");
            obj.SetObject(testPerson, RiakConstants.ContentTypes.ApplicationJson, sots);
            obj.Value.ShouldNotBeNull();
            obj.ContentType.ShouldEqual(RiakConstants.ContentTypes.ApplicationJson);

            var json = obj.Value.FromRiakString();
            json.ShouldEqual("{\"Name\":{\"FirstName\":\"OJ\",\"Surname\":\"Reeves\"},\"PhoneNumbers\":[{\"Number\":\"12345678\",\"NumberType\":1}],\"DateOfBirth\":\"\\/Date(281664000000)\\/\",\"Email\":\"[email protected]\"}");

            var deserialisedPerson = obj.GetObject<Person>();
            deserialisedPerson.ShouldEqual(testPerson);
        }
        public void ObjectsAreConvertedProperly()
        {
            var testPerson = new Person
            {
                DateOfBirth = new DateTime(1978, 12, 5, 0, 0, 0, DateTimeKind.Utc),
                Email = "*****@*****.**",
                Name = new Name
                {
                    FirstName = "OJ",
                    Surname = "Reeves"
                },
                PhoneNumbers = new List<PhoneNumber>
                {
                    new PhoneNumber
                    {
                        Number = "12345678",
                        NumberType = PhoneNumberType.Home
                    }
                }
            };
            var obj = new RiakObject("bucket", "key");
            obj.SetObject(testPerson);
            obj.Value.ShouldNotBeNull();
            obj.ContentType.ShouldEqual(RiakConstants.ContentTypes.ApplicationJson);

            var json = obj.Value.FromRiakString();
            json.ShouldEqual("{\"Name\":{\"FirstName\":\"OJ\",\"Surname\":\"Reeves\"},\"PhoneNumbers\":[{\"Number\":\"12345678\",\"NumberType\":1}],\"DateOfBirth\":\"1978-12-05T00:00:00Z\",\"Email\":\"[email protected]\"}");

            var deserialisedPerson = obj.GetObject<Person>();
            deserialisedPerson.ShouldEqual(testPerson);
        }
        public void RangeQuery()
        {
            var Cluster = RiakCluster.FromConfig("riakConfig");
            var Client = Cluster.CreateClient();

            var bucket = "rsds";

            Client.Batch(batch =>
            {
                for (var i = 1; i < 11; i++)
                {
                    var d = DateTime.Now.AddDays(0 - i);
                    var doc = new RiakObject(bucket, i.ToString(), new { value = i, created_date = d });

                    var position = 100 + i;

                    doc.BinIndex("position").Set(position.ToString());
                    
                    batch.Put(doc);
                }
            });

            var query = new RiakMapReduceQuery()
                    .Inputs(RiakIndex.Range("bucket", "position", 100, 200))
                    .MapJs(m => m.Name("Riak.mapValuesJson").Keep(true));

            var result = Client.MapReduce(query);
            //var items = result.Value.PhaseResults.SelectMany(x => x.GetObjects<dynamic>);
        }
 public void InvalidFieldNamesAndTypes()
 {
     id = new RiakObjectId("indexes", "mykey", "test value");
     var obj = new RiakObject("indexes", "mykey", "test value");
     var intIdx = obj.IntIndex("test-int-idx");
     Assert.Throws<FormatException>(() => intIdx.Add("invalid-value"));
 }
        public void SettingLegacySearchOnRiakBucketMakesBucketSearchable()
        {
            var bucket = Guid.NewGuid().ToString();
            var key = Guid.NewGuid().ToString();
            var props = Client.GetBucketProperties(bucket).Value;
            props.SetLegacySearch(true);

            var setResult = Client.SetBucketProperties(bucket, props);
            setResult.IsSuccess.ShouldBeTrue(setResult.ErrorMessage);

            var obj = new RiakObject(bucket, key, new { name = "OJ", age = 34 });
            var putResult = Client.Put(obj);
            putResult.IsSuccess.ShouldBeTrue(putResult.ErrorMessage);

            var q = new RiakFluentSearch(bucket, "name")
                .Search("OJ")
                .And("age", "34")
                .Build();

            var search = new RiakSearchRequest
            {
                Query = q
            };

            var searchResult = Client.Search(search);
            searchResult.IsSuccess.ShouldBeTrue(searchResult.ErrorMessage);
            searchResult.Value.NumFound.ShouldEqual(1u);
            searchResult.Value.Documents[0].Fields.Count.ShouldEqual(3);
            searchResult.Value.Documents[0].Fields.First(x => x.Key == "id").Value.ShouldEqual(key);
        }
        public void AsyncDeleteIsSuccessful()
        {
            var riakObject = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var riakObjectId = riakObject.ToRiakObjectId();

            var putResult = Client.Put(riakObject);
            putResult.IsSuccess.ShouldBeTrue();

            RiakResult theResult = null;
            var resetEvent = new AutoResetEvent(false);

            Client.Async.Delete(riakObjectId, result =>
                                            {
                                                theResult = result;
                                                resetEvent.Set();
                                            });
            resetEvent.WaitOne();

            theResult.IsSuccess.ShouldBeTrue();

            var getResult = Client.Get(riakObjectId);
            getResult.IsSuccess.ShouldBeFalse();
            getResult.ResultCode.ShouldEqual(ResultCode.NotFound);
            getResult.Value.ShouldBeNull();
        }
        public void TestKVOperations()
        {
            const string key = "bucket_type_test_key";
            var id = new RiakObjectId(TestBucketType, TestBucket, key);
            var obj = new RiakObject(id, Value);

            // put
            var putResult = Client.Put(obj, new RiakPutOptions().SetReturnBody(true).SetDw(3));
            putResult.IsSuccess.ShouldBeTrue();
            putResult.Value.BucketType.ShouldEqual(TestBucketType);

            // get
            var getResult = Client.Get(id);
            getResult.IsSuccess.ShouldBeTrue();
            getResult.Value.BucketType.ShouldEqual(TestBucketType);

            // delete
            var deleteResult = Client.Delete(id, new RiakDeleteOptions().SetDw(3));
            deleteResult.IsSuccess.ShouldBeTrue();

            // multiget
            var ids = new List<RiakObjectId>();
            for (int i = 0; i < 3; i++)
            {
                obj = new RiakObject(new RiakObjectId(TestBucketType, TestBucket, key + i), Value);
                Client.Put(obj, new RiakPutOptions().SetReturnBody(true).SetDw(3));
                ids.Add(obj.ToRiakObjectId());
            }

            var multiGetResult = Client.Get(ids).ToList();
            multiGetResult.All(r => r.IsSuccess).ShouldBeTrue();
            multiGetResult.All(r => r.Value.BucketType == TestBucketType).ShouldBeTrue();
        }
 public void CreatingBucketInSpecificBucketType()
 {
     id = new RiakObjectId("no_siblings", "sensitive_user_data", "user19735");
     var obj = new RiakObject(id, "{\"name\":\"Bob\"}");
     var rslt = client.Put(obj);
     CheckResult(rslt);
 }
        public void ToRiakObjectIdProducesAValidRiakObjectId()
        {
            var riakObject = new RiakObject(Bucket, Key, "value");
            var riakObjectId = riakObject.ToRiakObjectId();

            riakObjectId.Bucket.ShouldEqual(Bucket);
            riakObjectId.Key.ShouldEqual(Key);
        }
 public void CreatingBucketInSpecificBucketTypeExampleTwo()
 {
     id = new RiakObjectId("no_siblings", "old_memes", "all_your_base");
     var obj = new RiakObject(id, "all your base are belong to us",
         RiakConstants.ContentTypes.TextPlain);
     var rslt = client.Put(obj);
     CheckResult(rslt);
 }
        private RiakObjectId PutCoach(string team, string coach)
        {
            var id = new RiakObjectId("siblings", "coaches", team);
            var obj = new RiakObject(id, coach,
                RiakConstants.ContentTypes.TextPlain);
            var rslt = client.Put(obj);
            CheckResult(rslt);

            return id;
        }
 public void WritingLargeObjectIsSuccessful()
 {
     var text = Enumerable.Range(0, 2000000)
                          .Aggregate(new StringBuilder(),
                                     (sb, i) => sb.Append(i.ToString()))
                          .ToString();
     var riakObject = new RiakObject(TestBucket, "large", text, RiakConstants.ContentTypes.TextPlain);
     var result = Client.Put(riakObject);
     result.IsSuccess.ShouldBeTrue(result.ErrorMessage);
 }
        public void Putting_A_Value_To_A_Write_Once_Bucket_Works()
        {
            string key = Guid.NewGuid().ToString();
            string value = "test value";

            var id = new RiakObjectId(BucketType, Bucket, key);
            var obj = new RiakObject(id, value, RiakConstants.ContentTypes.TextPlain);

            RiakResult<RiakObject> rslt = client.Put(obj);
            Assert.True(rslt.IsSuccess, rslt.ErrorMessage);
        }
        public RiakSessionItem(RiakObject riakObject)
        {
            SessionStoreItems = riakObject.Value.FromRiakString();
            Created = DateTime.Parse(riakObject.UserMetaData["X-Riak-Meta-Created"]);
            Expires = DateTime.Parse(riakObject.UserMetaData["X-Riak-Meta-Expires"]);
            LockDate = DateTime.Parse(riakObject.UserMetaData["X-Riak-Meta-LockDate"]);
            LockId = int.Parse(riakObject.UserMetaData["X-Riak-Meta-LockId"]);
            Locked = bool.Parse(riakObject.UserMetaData["X-Riak-Meta-Locked"]);
            Flags = int.Parse(riakObject.UserMetaData["X-Riak-Meta-Flags"]);

            _timeout = (Expires - Created).Minutes;
        }
示例#20
0
        public void LotsOfConcurrentMapRedRequestsShouldWork()
        {
            var keys = new List<string>();

            for (var i = 1; i < 11; i++)
            {
                var key = "key" + i;
                var doc = new RiakObject(MapReduceBucket, key, new { value = i });
                keys.Add(key);

                var result = Client.Put(doc, new RiakPutOptions { ReturnBody = true });
                result.ShouldNotBeNull();
            }

            var input = new RiakBucketKeyInput();
            keys.ForEach(k => input.Add(MapReduceBucket, k));

            var query = new RiakMapReduceQuery()
                .Inputs(input)
                .MapJs(m => m.Source(@"function(o){return[1];}"))
                .ReduceJs(r => r.Name(@"Riak.reduceSum").Keep(true));
            query.Compile();

            var results = new List<RiakMapReduceResult>[ThreadCount];
            var watch = Stopwatch.StartNew();
            Parallel.For(0, ThreadCount, i =>
                {
                    results[i] = DoMapRed(query);
                });
            watch.Stop();
            var executionTime = watch.Elapsed;

            var failures = 0;
            foreach (var r in results.SelectMany(l => l))
            {
                if (r != null)
                {
                    var resultValue = JsonConvert.DeserializeObject<int[]>(r.PhaseResults.ElementAt(1).Values.First().FromRiakString())[0];
                    resultValue.ShouldEqual(10);
                    //r.Value.PhaseResults.ElementAt(1).GetObject<int[]>()[0].ShouldEqual(10);
                }
                else
                {
                    // the only acceptable result is that it ran out of retries when
                    // talking to the cluster (trying to get a connection)
                    //r.ResultCode.ShouldEqual(ResultCode.NoRetries);
                    ++failures;
                }
            }

            Console.WriteLine("Total of {0} out of {1} failed to execute due to connection contention. Execution time = {2} milliseconds, for an average of {3} milliseconds", failures, ThreadCount * ActionCount, executionTime.TotalMilliseconds, (executionTime.TotalMilliseconds/(ThreadCount * ActionCount)));
        }
        public void GetsWithBucketAndKeyReturnObjectsThatAreMarkedAsNotChanged()
        {
            var bucketName = "identity_configuration";
            var key = "RiakMembershipProviderTests";

            var doc = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var writeResult = Client.Put(doc);
            writeResult.ShouldNotBeNull();

            var readResult = Client.Get(bucketName, key);
            readResult.ShouldNotBeNull();
            readResult.HasChanged.ShouldBeFalse();
        }
示例#22
0
        public void AsyncDeleteIsSuccessful()
        {
            var riakObject = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var riakObjectId = riakObject.ToRiakObjectId();

            var putResult = Client.Put(riakObject);
            putResult.ShouldNotBeNull();

            var deletedObjectId = Client.Async.Delete(riakObjectId).ConfigureAwait(false).GetAwaiter().GetResult();

            var getResult = Client.Get(riakObjectId);
            getResult.ShouldBeNull();
        }
        public RiakObject ToRiakObject()
        {
            var o = new RiakObject(SessionContainer, SessionId, SessionStoreItems, RiakConstants.ContentTypes.ApplicationJson);

            o.UserMetaData["X-Riak-Meta-Created"] = Created.ToString("R");
            o.UserMetaData["X-Riak-Meta-Expires"] = Expires.ToString("R");
            o.UserMetaData["X-Riak-Meta-LockDate"] = LockDate.ToString("R");
            o.UserMetaData["X-Riak-Meta-LockId"] = LockId.ToString();
            o.UserMetaData["X-Riak-Meta-Locked"] = Locked.ToString();
            o.UserMetaData["X-Riak-Meta-Flags"] = Flags.ToString();

            return o;
        }
示例#24
0
        protected void CreateObjects(string bucketName)
        {
            var oj = new RiakObject(bucketName, OJ, new Person() { Name = "oj" });
            var jeremiah = new RiakObject(bucketName, Jeremiah, new Person() { Name = "jeremiah" });
            var brent = new RiakObject(bucketName, Brent, new Person() { Name = "brent" });
            var rob = new RiakObject(bucketName, Rob, new Person() { Name = "rob" });

            oj.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            jeremiah.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            brent.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            rob.ContentType = RiakConstants.ContentTypes.ApplicationJson;

            Client.Put(new[] { oj, jeremiah, brent, rob });
        }
        public void DefaultBucketCanBeSpecifiedAsType()
        {
            id = new RiakObjectId("default", "my_bucket", "my_key");
            var obj1 = new RiakObject(id, "value", RiakConstants.ContentTypes.TextPlain);
            var putRslt = client.Put(obj1);
            CheckResult(putRslt);

            var id2 = new RiakObjectId("my_bucket", "my_key");
            var getRslt = client.Get(id2);
            CheckResult(getRslt);

            RiakObject obj2 = getRslt.Value;
            Assert.AreEqual(obj1.Value, obj2.Value);
        }
        public void DeleteIsSuccessful()
        {
            var riakObject = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var riakObjectId = riakObject.ToRiakObjectId();

            var putResult = Client.Put(riakObject);
            putResult.IsSuccess.ShouldBeTrue(putResult.ErrorMessage);

            var delResult = Client.Delete(riakObjectId);
            delResult.IsSuccess.ShouldBeTrue(delResult.ErrorMessage);

            var getResult = Client.Get(riakObjectId);
            getResult.IsSuccess.ShouldBeFalse(getResult.ErrorMessage);
            getResult.ResultCode.ShouldEqual(ResultCode.NotFound);
            getResult.Value.ShouldBeNull();
        }
示例#27
0
        public void IndexesAreSavedWithAnObject()
        {
            var o = new RiakObject(Bucket, "the_object", "{ value: \"this is an object\" }");
            o.AddIndex("tacos", "are great!");
            o.AddIndex("age", 12);

            Client.Put(o);

            var result = Client.Get(o.ToRiakObjectId());

            result.IsSuccess.ShouldBeTrue(result.ErrorMessage);
            var ro = result.Value;

            ro.BinIndexes.Count.ShouldEqual(1);
            ro.IntIndexes.Count.ShouldEqual(1);
        }
        public void ContentTypes()
        {
            id = new RiakObjectId("animals", "dogs", "fido");
            var fido = new { breed = "dalmatian", size = "large" };
            var obj = new RiakObject(id, fido);
            var rslt = client.Put(obj);
            CheckResult(rslt);

            rslt = client.Get(id);
            CheckResult(rslt);
            Assert.NotNull(rslt.Value);
            Assert.AreEqual(RiakConstants.ContentTypes.ApplicationJson, rslt.Value.ContentType);

            string json = Encoding.UTF8.GetString(rslt.Value.Value);
            Assert.AreEqual(@"{""breed"":""dalmatian"",""size"":""large""}", json);
        }
        public bool CheckOrSave(string endpoint, Int32 bucket, long position)
        {
            var id = new RiakObjectId($"{Settings.Bucket}.system", $"{endpoint}:{bucket}");

            var options = new RiakGetOptions { };
            options.SetRw(Quorum.WellKnown.All);
            var exists = _riak.Get(id, options);

            if (exists.IsSuccess) return false;

            var competer = new Competer
            {
                Id = $"{endpoint}:{bucket}",
                Discriminator = Discriminator,
                Endpoint = endpoint,
                Bucket = bucket,
                Position = position,
                Heartbeat = DateTime.UtcNow
            };

            var putOpt = new RiakPutOptions { IfNotModified = false, IfNoneMatch = true };
            putOpt.SetW(Quorum.WellKnown.All);
            var o = new RiakObject(id, competer);
            var result = _riak.Put(o, putOpt);
            if (!result.IsSuccess)
            {
                Logger.Info("Endpoint {0} failed to claim bucket {1}.  Error: {2}", endpoint, bucket, result.ErrorMessage);
                return false;
            }

            Thread.Sleep(new Random().Next(100, 2000));

            do
            {
                exists = _riak.Get(id, options);
            } while (!exists.IsSuccess);

            competer = exists.Value.GetObject<Competer>();
            if (competer.Discriminator != Discriminator)
            {
                Logger.Info("Endpoint {0} failed to claim bucket {1}.  Error: {2}", endpoint, bucket, "Discriminator mismatch");
                return false;
            }
            Logger.Info("Endpoint {0} successfully claimed bucket {1}", endpoint, bucket);
            return true;

        }
        public void AsyncListKeysReturnsTheCorrectNumberOfResults()
        {
            var bucket = Guid.NewGuid().ToString();

            for (var i = 1; i < 11; i++)
            {
                var doc = new RiakObject(bucket, i.ToString(), new { value = i });

                var r = Client.Put(doc);
                r.IsSuccess.ShouldBeTrue();
            }

            var result = Client.Async.ListKeys(bucket).Result;

            result.IsSuccess.ShouldBeTrue();
            result.Value.ShouldNotBeNull();
            result.Value.Count().ShouldEqual(10);
        }
        public void MapReduceQueriesReturnData()
        {
            var bucket = Guid.NewGuid().ToString();

            for (var i = 1; i < 11; i++)
            {
                var doc = new RiakObject(bucket, i.ToString(), new { value = i });

                Client.Put(doc).IsSuccess.ShouldBeTrue();
            }

            var query = new RiakMapReduceQuery()
                        .Inputs(bucket)
                        .MapJs(m => m.Source(@"function(o) {return [ 1 ];}"))
                        .ReduceJs(r => r.Name(@"Riak.reduceSum").Keep(true));

            var result = Client.MapReduce(query);

            result.IsSuccess.ShouldBeTrue();

            var mrRes = result.Value;

            mrRes.PhaseResults.ShouldNotBeNull();
            mrRes.PhaseResults.Count().ShouldEqual(2);

            mrRes.PhaseResults.ElementAt(0).Phase.ShouldEqual(0u);
            mrRes.PhaseResults.ElementAt(1).Phase.ShouldEqual(1u);

            //mrRes.PhaseResults.ElementAt(0).Values.ShouldBeNull();
            foreach (var v in mrRes.PhaseResults.ElementAt(0).Values)
            {
                v.ShouldBeNull();
            }
            mrRes.PhaseResults.ElementAt(1).Values.ShouldNotBeNull();

            var values = result.Value.PhaseResults.ElementAt(1).GetObjects <int[]>().First();

            //var values = Newtonsoft.Json.JsonConvert.DeserializeObject<int[]>(result.Value.PhaseResults.ElementAt(1).Values.First().FromRiakString());
            values[0].ShouldEqual(10);
        }
        protected void CreateLinkedObjects(string bucketName)
        {
            var oj = new RiakObject(bucketName, OJ, new Person()
            {
                Name = "oj"
            });
            var jeremiah = new RiakObject(bucketName, Jeremiah, new Person()
            {
                Name = "jeremiah"
            });
            var brent = new RiakObject(bucketName, Brent, new Person()
            {
                Name = "brent"
            });
            var rob = new RiakObject(bucketName, Rob, new Person()
            {
                Name = "rob"
            });

            oj.ContentType       = RiakConstants.ContentTypes.ApplicationJson;
            jeremiah.ContentType = RiakConstants.ContentTypes.ApplicationJson;
            brent.ContentType    = RiakConstants.ContentTypes.ApplicationJson;
            rob.ContentType      = RiakConstants.ContentTypes.ApplicationJson;

#pragma warning disable 618
            oj.LinkTo(jeremiah, "friends");
            oj.LinkTo(jeremiah, "coworkers");

            jeremiah.LinkTo(oj, "friends");
            jeremiah.LinkTo(oj, "coworkers");
            jeremiah.LinkTo(oj, "ozzies");
            jeremiah.LinkTo(brent, "friends");
            jeremiah.LinkTo(brent, "coworkers");
            jeremiah.LinkTo(rob, "ozzies");

            brent.LinkTo(jeremiah, "coworkers");
            brent.LinkTo(jeremiah, "friends");
#pragma warning restore 618
            Client.Put(new[] { oj, jeremiah, brent, rob });
        }
        public void ResolvingSiblingsWithUpdateUsingFirstSibling()
        {
            id = PutNickolodeonCharacters();

            // First, fetch the object
            var getResult = client.Get(id);

            // Then, pick the first sibling
            RiakObject chosenSibling = getResult.Value.Siblings.First();

            // Then, store the chosen object
            var putRslt = client.Put(chosenSibling);

            CheckResult(putRslt);

            RiakObject updatedObject = putRslt.Value;

            // Voila, no more siblings!
            Debug.Assert(updatedObject.Siblings.Count == 0);
            Assert.AreEqual(0, updatedObject.Siblings.Count);
            Assert.AreEqual("Ren", Encoding.UTF8.GetString(updatedObject.Value));
        }
        public void MultiDeleteWithValidAndInvalidBucketsBehavesCorrectly()
        {
            var doc         = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var writeResult = Client.Put(doc);

            writeResult.IsSuccess.ShouldBeTrue();
            writeResult.Value.ShouldNotBeNull();

            var deleteResults = Client.Delete(new List <RiakObjectId>
            {
                new RiakObjectId(null, "key"),
                new RiakObjectId("", "key"),
                new RiakObjectId("  ", "key"),
                new RiakObjectId("foo/bar", "key"),
                new RiakObjectId(TestBucket, TestKey)
            }).ToList();

            deleteResults.Count(r => r.IsSuccess).ShouldEqual(1);
            var deletedItemGetResult = Client.Get(TestBucket, TestKey);

            deletedItemGetResult.ResultCode.ShouldEqual(ResultCode.NotFound);
        }
示例#35
0
        public void BinIndexGetReturnsListOfKeys()
        {
            for (var i = 0; i < 10; i++)
            {
                var o = new RiakObject(Bucket, i.ToString(), "{ value: \"this is an object\" }");
                o.BinIndex("age").Set("32");

                Client.Put(o);
            }

            var result = Client.IndexGet(Bucket, "age", "32");

            result.IsSuccess.ShouldBeTrue(result.ErrorMessage);
            result.Value.Count.ShouldEqual(10);

            foreach (var v in result.Value)
            {
                var key = int.Parse(v);
                key.ShouldBeLessThan(10);
                key.ShouldBeGreaterThan(-1);
            }
        }
示例#36
0
        private void button4_Click(object sender, EventArgs e)
        {
            var lionoId      = new RiakObjectId("cats", "liono");
            var lionoObj     = new { name_s = "Lion-o", age_i = 30, leader = true };
            var lionoRiakObj = new RiakObject(lionoId, lionoObj);

            var cheetaraId      = new RiakObjectId("cats", "cheetara");
            var cheetaraObj     = new { name_s = "Cheetara", age_i = 30, leader = false };
            var cheetaraRiakObj = new RiakObject(cheetaraId, cheetaraObj);

            var snarfId      = new RiakObjectId("cats", "snarf");
            var snarfObj     = new { name_s = "Snarf", age_i = 43, leader = false };
            var snarfRiakObj = new RiakObject(snarfId, snarfObj);

            var panthroId      = new RiakObjectId("cats", "panthro");
            var panthroObj     = new { name_s = "Panthro", age_i = 36, leader = false };
            var panthroRiakObj = new RiakObject(panthroId, panthroObj);

            var rslts = client.Put(new[] {
                lionoRiakObj, cheetaraRiakObj, snarfRiakObj, panthroRiakObj
            });
        }
示例#37
0
        public Task <RiakResult <RiakObject> > Put(RiakObject value, RiakPutOptions options = null)
        {
            if (!IsValidBucketOrKey(value.Bucket))
            {
                return(RiakResult <RiakObject> .ErrorTask(ResultCode.InvalidRequest, InvalidBucketErrorMessage, false));
            }

            if (!IsValidBucketOrKey(value.Key))
            {
                return(RiakResult <RiakObject> .ErrorTask(ResultCode.InvalidRequest, InvalidKeyErrorMessage, false));
            }

            var request = value.ToMessage();

            options = options ?? new RiakPutOptions();
            options.Populate(request);

            return(UseConnection(conn => conn.PbcWriteRead <RpbPutReq, RpbPutResp>(request))
                   .ContinueWith((Task <RiakResult <RpbPutResp> > finishedTask) => {
                var result = finishedTask.Result;

                if (!result.IsSuccess)
                {
                    return RiakResult <RiakObject> .Error(result.ResultCode, result.ErrorMessage, result.NodeOffline);
                }

                var finalResult = options.ReturnBody
                        ? new RiakObject(value.Bucket, value.Key, result.Value.content.First(), result.Value.vclock)
                            : value;

                if (options.ReturnBody && result.Value.content.Count > 1)
                {
                    finalResult.Siblings = result.Value.content.Select(
                        c => new RiakObject(value.Bucket, value.Key, c, result.Value.vclock)).ToList();
                }

                return RiakResult <RiakObject> .Success(finalResult);
            }));
        }
示例#38
0
        public void MultiPutWithValidAndInvalidBucketsBehavesCorrectly()
        {
            var doc         = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var writeResult = Client.Put(doc);

            writeResult.ShouldNotBeNull();

            var putResults = Client.Async.Put(new List <RiakObject>
            {
                new RiakObject(null, "key", TestJson, RiakConstants.ContentTypes.ApplicationJson),
                new RiakObject("", "key", TestJson, RiakConstants.ContentTypes.ApplicationJson),
                new RiakObject("  ", "key", TestJson, RiakConstants.ContentTypes.ApplicationJson),
                new RiakObject("foo/bar", "key", TestJson, RiakConstants.ContentTypes.ApplicationJson),
                new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson)
            })
                             .ToEnumerable()
                             .ToList();

            putResults
            .Count(r => !r.IsLeft)
            .ShouldEqual(1);
        }
示例#39
0
        public void IntRangeQueriesReturnMultipleKeys()
        {
            for (var i = 0; i < 10; i++)
            {
                var o = new RiakObject(Bucket, i.ToString(), "{ value: \"this is an object\" }");
                o.AddIntIndex("age_int", 25 + i);

                Client.Put(o);
            }

            var input = new RiakIntIndexRangeInput(Bucket, "age_int", 27, 30);

            var mr = new RiakMapReduceQuery()
                     .Inputs(input)
                     .ReduceErlang(r => r.ModFun("riak_kv_mapreduce", "reduce_identity").Keep(true));

            var result = Client.MapReduce(mr);

            result.IsSuccess.ShouldBeTrue();

            // TODO write tests verifying results
        }
示例#40
0
        public void GetsWithBucketAndKeyReturnObjects()
        {
            var doc         = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var writeResult = Client.Put(doc);

            writeResult.IsSuccess.ShouldBeTrue(writeResult.ErrorMessage);
            writeResult.Value.ShouldNotBeNull(writeResult.ErrorMessage);

            Func <RiakResult <RiakObject> > getObject = () => Client.Get(TestBucket, TestKey);

            var readResult = getObject.WaitUntil();

            readResult.IsSuccess.ShouldBeTrue(readResult.ErrorMessage);
            readResult.Value.ShouldNotBeNull(readResult.ErrorMessage);

            var otherDoc = readResult.Value;

            otherDoc.Bucket.ShouldEqual(TestBucket);
            otherDoc.Bucket.ShouldEqual(doc.Bucket);
            otherDoc.Key.ShouldEqual(TestKey);
            otherDoc.Key.ShouldEqual(doc.Key);
        }
        public void ResolvingSiblingsWithUpdate()
        {
            id = PutNickolodeonCharacters();

            // First, fetch the object
            var getResult = client.Get(id);

            // Then, modify the object's value
            RiakObject obj = getResult.Value;

            obj.SetObject <string>("Stimpy", RiakConstants.ContentTypes.TextPlain);

            // Then, store the object which has vector clock attached
            var putRslt = client.Put(obj);

            CheckResult(putRslt);

            obj = putRslt.Value;
            // Voila, no more siblings!
            Debug.Assert(obj.Siblings.Count == 0);
            Assert.AreEqual(0, obj.Siblings.Count);
        }
示例#42
0
        public async Task <Either <RiakException, RiakObject> > Get(string bucket, string key, RiakGetOptions options = null)
        {
            options = options ?? RiakClient.DefaultGetOptions();

            if (!IsValidBucketOrKey(bucket))
            {
                return(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.InvalidRequest, InvalidBucketErrorMessage, false)));
            }

            if (!IsValidBucketOrKey(key))
            {
                return(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.InvalidRequest, InvalidKeyErrorMessage, false)));
            }

            var request = new RpbGetReq {
                bucket = bucket.ToRiakString(), key = key.ToRiakString()
            };

            options = options ?? new RiakGetOptions();
            options.Populate(request);

            try
            {
                var result = await _connection.PbcWriteRead <RpbGetReq, RpbGetResp>(_endPoint, request).ConfigureAwait(false);

                if (result.vclock == null)
                {
                    return(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.NotFound, "Unable to find value in Riak", false)));
                }

                var riakObject = new RiakObject(bucket, key, result.content, result.vclock);

                return(new Either <RiakException, RiakObject>(riakObject));
            }
            catch (RiakException riakException)
            {
                return(new Either <RiakException, RiakObject>(riakException));
            }
        }
示例#43
0
        public async Task Save(String endpoint, long position)
        {
            var id = new RiakObjectId($"{Settings.Bucket}.system", endpoint);

            var options = new RiakGetOptions {
            };

            options.SetRw(Quorum.WellKnown.All);
            var exists = await _riak.Async.Get(id, options);

            if (exists.IsSuccess)
            {
                var checkpoint = exists.Value.GetObject <Checkpoint>();
                checkpoint.Position = position;

                exists.Value.SetObject(checkpoint);

                var putOpt = new RiakPutOptions {
                    IfNotModified = true, IfNoneMatch = false
                };
                putOpt.SetW(Quorum.WellKnown.All);
                await _riak.Async.Put(exists.Value, putOpt);
            }
            else
            {
                var checkpoint = new Checkpoint
                {
                    Id       = endpoint,
                    Position = position,
                };
                var putOpt = new RiakPutOptions {
                    IfNotModified = false, IfNoneMatch = true
                };
                putOpt.SetW(Quorum.WellKnown.All);
                var o = new RiakObject(id, checkpoint);
                await _riak.Async.Put(o, putOpt);
            }
        }
示例#44
0
        public void TestKVOperations()
        {
            const string key = "bucket_type_test_key";
            var          id  = new RiakObjectId(TestBucketType, TestBucket, key);
            var          obj = new RiakObject(id, Value);

            // put
            var putResult = Client.Put(obj, new RiakPutOptions().SetReturnBody(true).SetDw(3));

            putResult.IsSuccess.ShouldBeTrue();
            putResult.Value.BucketType.ShouldEqual(TestBucketType);

            // get
            var getResult = Client.Get(id);

            getResult.IsSuccess.ShouldBeTrue();
            getResult.Value.BucketType.ShouldEqual(TestBucketType);

            // delete
            var deleteResult = Client.Delete(id, new RiakDeleteOptions().SetDw(3));

            deleteResult.IsSuccess.ShouldBeTrue();

            // multiget
            var ids = new List <RiakObjectId>();

            for (int i = 0; i < 3; i++)
            {
                obj = new RiakObject(new RiakObjectId(TestBucketType, TestBucket, key + i), Value);
                Client.Put(obj, new RiakPutOptions().SetReturnBody(true).SetDw(3));
                ids.Add(obj.ToRiakObjectId());
            }

            var multiGetResult = Client.Get(ids).ToList();

            multiGetResult.All(r => r.IsSuccess).ShouldBeTrue();
            multiGetResult.All(r => r.Value.BucketType == TestBucketType).ShouldBeTrue();
        }
示例#45
0
        public void MapReduceQueriesReturnDataInBatch()
        {
            var bucket = string.Format("{0}_{1}", TestBucket, Guid.NewGuid());

            Client.Batch(batch =>
            {
                for (var i = 1; i < 11; i++)
                {
                    var doc = new RiakObject(bucket, i.ToString(), new { value = i });
                    batch.Put(doc).ShouldNotBeNull();
                }

                var query = new RiakMapReduceQuery()
                            .Inputs(bucket)
                            .MapJs(m => m.Source(@"function(o) {return [ 1 ];}"))
                            .ReduceJs(r => r.Name(@"Riak.reduceSum").Keep(true));

                var result = batch.MapReduce(query);
                result.ShouldNotBeNull();

                var mrRes = result;
                mrRes.PhaseResults.ShouldNotBeNull();
                mrRes.PhaseResults.Count().ShouldEqual(2);

                mrRes.PhaseResults.ElementAt(0).Phase.ShouldEqual(0u);
                mrRes.PhaseResults.ElementAt(1).Phase.ShouldEqual(1u);

                //mrRes.PhaseResults.ElementAt(0).Values.ShouldBeNull();
                foreach (var v in mrRes.PhaseResults.ElementAt(0).Values)
                {
                    v.ShouldBeNull();
                }
                mrRes.PhaseResults.ElementAt(1).Values.ShouldNotBeNull();

                var values = result.PhaseResults.ElementAt(1).GetObjects <int[]>().First();
                values[0].ShouldEqual(10);
            });
        }
示例#46
0
        /// <summary>
        /// Retrieve arbitrarily deep list of links for a <see cref="RiakObject"/>
        /// </summary>
        /// <returns>
        /// A list of <see cref="RiakObject"/> identified by the list of links.
        /// </returns>
        /// <param name='riakObject'>
        /// The initial object to use for the beginning of the link walking.
        /// </param>
        /// <param name='riakLinks'>
        /// A list of link definitions
        /// </param>
        /// <remarks>Refer to http://wiki.basho.com/Links-and-Link-Walking.html for more information.</remarks>
        public RiakResult <IList <RiakObject> > WalkLinks(RiakObject riakObject, IList <RiakLink> riakLinks)
        {
            var input = new RiakBucketKeyInput();

            input.AddBucketKey(riakObject.Bucket, riakObject.Key);

            var query = new RiakMapReduceQuery()
                        .Inputs(input);

            foreach (var riakLink in riakLinks)
            {
                var link = riakLink;
                var keep = link == riakLinks.Last();

                query.Link(l => l.FromRiakLink(link).Keep(keep));
            }

            var result = MapReduce(query);

            if (result.IsSuccess)
            {
                var linkResults       = result.Value.PhaseResults.GroupBy(r => r.Phase).Where(g => g.Key == riakLinks.Count - 1);
                var linkResultStrings = linkResults.SelectMany(lr => lr.ToList(), (lr, r) => new { lr, r })
                                        .SelectMany(@t => @t.r.Values, (@t, s) => s.FromRiakString());

                //var linkResultStrings = linkResults.SelectMany(g => g.Select(r => r.Values.Value.FromRiakString()));
                var rawLinks = linkResultStrings.SelectMany(RiakLink.ParseArrayFromJsonString).Distinct();
                var oids     = rawLinks.Select(l => new RiakObjectId(l.Bucket, l.Key)).ToList();

                var objects = Get(oids);

                // FIXME
                // we could be discarding results here. Not good?
                // This really should be a multi-phase map/reduce
                return(RiakResult <IList <RiakObject> > .Success(objects.Where(r => r.IsSuccess).Select(r => r.Value).ToList()));
            }
            return(RiakResult <IList <RiakObject> > .Error(result.ResultCode, result.ErrorMessage));
        }
        public void AsyncGetWithRiakObjectIdReturnsData()
        {
            var riakObject   = new RiakObject(TestBucket, TestKey, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var riakObjectId = riakObject.ToRiakObjectId();

            Client.Put(riakObject);

            RiakResult <RiakObject> theResult = null;
            var resetEvent = new AutoResetEvent(false);

            Client.Async.Get(riakObjectId, result =>
            {
                theResult = result;
                resetEvent.Set();
            });
            resetEvent.WaitOne();

            theResult.IsSuccess.ShouldBeTrue();
            theResult.Value.ShouldNotBeNull();
            theResult.Value.Bucket.ShouldEqual(TestBucket);
            theResult.Value.Key.ShouldEqual(TestKey);
            theResult.Value.Value.FromRiakString().ShouldEqual(TestJson);
        }
        public void AsyncPutMultipleIsSuccessful()
        {
            var one = new RiakObject(TestBucket, "one", TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var two = new RiakObject(TestBucket, "two", TestJson, RiakConstants.ContentTypes.ApplicationJson);

            IEnumerable <RiakResult <RiakObject> > theResults = null;
            var resetEvent = new AutoResetEvent(false);

            Client.Async.Put(new List <RiakObject> {
                one, two
            }, result =>
            {
                theResults = result;
                resetEvent.Set();
            });
            resetEvent.WaitOne();

            foreach (var riakResult in theResults)
            {
                riakResult.IsSuccess.ShouldBeTrue();
                riakResult.Value.ShouldNotBeNull();
            }
        }
示例#49
0
        public void UpdatingWithGeneratedKey_ReturnsCorrectKey()
        {
            var doc    = new RiakObject(TestBucket, null, TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var result = Client.Put(doc);

            result.IsSuccess.ShouldBeTrue();
            result.Value.ShouldNotBeNull();
            result.Value.Key.ShouldNotBeNullOrEmpty();

            string key          = result.Value.Key;
            string updatedValue = @"{'foo':'bar'}";
            var    update       = new RiakObject(TestBucket, key, updatedValue, RiakConstants.ContentTypes.ApplicationJson);

            result = Client.Put(update);
            result.IsSuccess.ShouldBeTrue();
            result.Value.ShouldNotBeNull();
            result.Value.Key.ShouldEqual(key);

            var del_result = Client.Delete(TestBucket, key);

            del_result.IsSuccess.ShouldBeTrue();
            Assert.True(del_result.ResultCode == ResultCode.Success);
        }
        public void AsyncGetMultipleReturnsAllObjects()
        {
            var one = new RiakObject(TestBucket, "one", TestJson, RiakConstants.ContentTypes.ApplicationJson);
            var two = new RiakObject(TestBucket, "two", TestJson, RiakConstants.ContentTypes.ApplicationJson);

            Client.Put(one);
            Client.Put(two);

            var oneObjectId = one.ToRiakObjectId();
            var twoObjectId = two.ToRiakObjectId();

            var list = new List <RiakObjectId> {
                oneObjectId, twoObjectId
            };

            var results = Client.Async.Get(list).Result;

            foreach (var result in results)
            {
                result.IsSuccess.ShouldBeTrue(result.ErrorMessage);
                result.Value.ShouldNotBeNull();
            }
        }
示例#51
0
        public void CustomSerializerWillSerializeJson()
        {
            var testPerson = new Person
            {
                DateOfBirth = new DateTime(1978, 12, 5, 0, 0, 0, DateTimeKind.Utc),
                Email       = "*****@*****.**",
                Name        = new Name
                {
                    FirstName = "OJ",
                    Surname   = "Reeves"
                },
                PhoneNumbers = new List <PhoneNumber>
                {
                    new PhoneNumber
                    {
                        Number     = "12345678",
                        NumberType = PhoneNumberType.Home
                    }
                }
            };

            var sots = new SerializeObjectToString <Person>(JsonConvert.SerializeObject);

            var obj = new RiakObject("bucket", "key");

            obj.SetObject(testPerson, RiakConstants.ContentTypes.ApplicationJson, sots);
            obj.Value.ShouldNotBeNull();
            obj.ContentType.ShouldEqual(RiakConstants.ContentTypes.ApplicationJson);

            var json = obj.Value.FromRiakString();

            json.ShouldEqual("{\"Name\":{\"FirstName\":\"OJ\",\"Surname\":\"Reeves\"},\"PhoneNumbers\":[{\"Number\":\"12345678\",\"NumberType\":1}],\"DateOfBirth\":\"\\/Date(281664000000)\\/\",\"Email\":\"[email protected]\"}");

            var deserialisedPerson = obj.GetObject <Person>();

            deserialisedPerson.ShouldEqual(testPerson);
        }
示例#52
0
        /// <summary>
        /// Retrieve multiple objects from Riak.
        /// </summary>
        /// <param name='bucketKeyPairs'>
        /// An <see href="System.Collections.Generic.IEnumerable&lt;T&gt;"/> of <see cref="CorrugatedIron.Models.RiakObjectId"/> to be retrieved
        /// </param>
        /// <param name='rVal'>
        /// The number of nodes required to successfully respond to the read before the read is considered a success.
        /// </param>
        public IEnumerable <RiakResult <RiakObject> > Get(IEnumerable <RiakObjectId> bucketKeyPairs,
                                                          uint rVal = RiakConstants.Defaults.RVal)
        {
            bucketKeyPairs = bucketKeyPairs.ToList();

            var requests = bucketKeyPairs.Select(bk => new RpbGetReq {
                Bucket = bk.Bucket.ToRiakString(), Key = bk.Key.ToRiakString(), R = rVal
            }).ToList();
            var results = UseConnection(conn =>
            {
                var responses = requests.Select(conn.PbcWriteRead <RpbGetReq, RpbGetResp>).ToList();
                return(RiakResult <IEnumerable <RiakResult <RpbGetResp> > > .Success(responses));
            });

            return(results.Value.Zip(bucketKeyPairs, Tuple.Create).Select(result =>
            {
                if (!result.Item1.IsSuccess)
                {
                    return RiakResult <RiakObject> .Error(result.Item1.ResultCode, result.Item1.ErrorMessage);
                }

                if (result.Item1.Value.VectorClock == null)
                {
                    return RiakResult <RiakObject> .Error(ResultCode.NotFound);
                }

                var o = new RiakObject(result.Item2.Bucket, result.Item2.Key, result.Item1.Value.Content.First(), result.Item1.Value.VectorClock);

                if (result.Item1.Value.Content.Count > 1)
                {
                    o.Siblings = result.Item1.Value.Content.Select(c =>
                                                                   new RiakObject(result.Item2.Bucket, result.Item2.Key, c, result.Item1.Value.VectorClock)).ToList();
                }

                return RiakResult <RiakObject> .Success(o);
            }));
        }
示例#53
0
        public void ListKeysFromIndexReturnsAllKeys()
        {
            var bucket          = string.Format("{0}_{1}", TestBucket, Guid.NewGuid());
            var originalKeyList = new List <string>();

            for (var i = 0; i < 10; i++)
            {
                var o = new RiakObject(bucket, i.ToString(), "{ value: \"this is an object\" }");
                originalKeyList.Add(i.ToString());

                Client.Put(o);
            }

            var keys = ((RiakClient)Client).ListKeysFromIndex(bucket).ToList();

            keys.Count().ShouldEqual(10);

            foreach (var key in keys)
            {
                originalKeyList.ShouldContain(key);
            }

            Client.DeleteBucket(bucket);
        }
示例#54
0
        public new void SetUp()
        {
            base.SetUp();

            var oj       = new RiakObject(TestBucket, OJ, new { name = "oj" });
            var jeremiah = new RiakObject(TestBucket, Jeremiah, new { name = "jeremiah" });
            var brent    = new RiakObject(TestBucket, Brent, new { name = "brent" });
            var rob      = new RiakObject(TestBucket, Rob, new { name = "rob" });

            oj.LinkTo(jeremiah, "friends");
            oj.LinkTo(jeremiah, "coworkers");

            jeremiah.LinkTo(oj, "friends");
            jeremiah.LinkTo(oj, "coworkers");
            jeremiah.LinkTo(oj, "ozzies");
            jeremiah.LinkTo(brent, "friends");
            jeremiah.LinkTo(brent, "coworkers");
            jeremiah.LinkTo(rob, "ozzies");

            brent.LinkTo(jeremiah, "coworkers");
            brent.LinkTo(jeremiah, "friends");

            Client.Put(new[] { oj, jeremiah, brent, rob });
        }
示例#55
0
        public void GettingKeysWithReturnTermsDoesAThing()
        {
            var bucket       = Bucket;
            var keysAndTerms = new Dictionary <string, int>();

            for (var i = 0; i < 10; i++)
            {
                var o = new RiakObject(bucket, Guid.NewGuid().ToString(), "{ value: \"this is an object\" }");
                o.IntIndex("sandwiches").Set(i);
                keysAndTerms.Add(o.Key, i);

                Client.Put(o);
            }

            var results = Client.IndexGet(bucket, "sandwiches", 2, 5, new RiakIndexGetOptions().SetReturnTerms(true).SetMaxResults(100).SetStream(false));

            results.IndexKeyTerms.Count().ShouldEqual(4);

            foreach (var indexResult in results.IndexKeyTerms)
            {
                keysAndTerms.Keys.ShouldContain(indexResult.Key);
                keysAndTerms[indexResult.Key].ShouldEqual(int.Parse(indexResult.Term));
            }
        }
示例#56
0
        public Task <RiakResult <RiakObject> > Get(string bucket, string key, RiakGetOptions options = null)
        {
            if (!IsValidBucketOrKey(bucket))
            {
                return(RiakResult <RiakObject> .ErrorTask(ResultCode.InvalidRequest, InvalidBucketErrorMessage, false));
            }

            if (!IsValidBucketOrKey(key))
            {
                return(RiakResult <RiakObject> .ErrorTask(ResultCode.InvalidRequest, InvalidKeyErrorMessage, false));
            }

            var request = new RpbGetReq {
                bucket = bucket.ToRiakString(), key = key.ToRiakString()
            };

            options = options ?? new RiakGetOptions();
            options.Populate(request);

            return(UseConnection(conn => conn.PbcWriteRead <RpbGetReq, RpbGetResp>(request))
                   .ContinueWith((Task <RiakResult <RpbGetResp> > finishedTask) => {
                var result = finishedTask.Result;
                if (!result.IsSuccess)
                {
                    return RiakResult <RiakObject> .Error(result.ResultCode, result.ErrorMessage, result.NodeOffline);
                }

                if (result.Value.vclock == null)
                {
                    return RiakResult <RiakObject> .Error(ResultCode.NotFound, "Unable to find value in Riak", false);
                }

                var o = new RiakObject(bucket, key, result.Value.content, result.Value.vclock);
                return RiakResult <RiakObject> .Success(o);
            }));
        }
示例#57
0
 internal BinIndex(RiakObject container, string name)
     : base(container, name)
 {
 }
示例#58
0
        public void Parallel_ForEach_Can_Be_Used_To_Put_And_Get_Objects()
        {
            const int    numNodes             = 4;
            const int    poolSize             = 8;
            const int    totalConnectionCount = poolSize * numNodes;
            const ushort portInterval         = 10;
            const ushort startingPort         = 10017;
            const ushort endingPort           = startingPort + ((numNodes - 1) * portInterval);
            const int    totalObjects         = 65536;

            byte[] data = new byte[65536];
            Random.NextBytes(data);

            int batchSize    = totalConnectionCount;
            int totalBatches = totalObjects / batchSize;

            Assert.AreEqual(0, totalObjects % batchSize);
            Debug.WriteLine("batchSize: {0}, totalBatches: {1}", batchSize, totalBatches);

            string riakHost = Environment.GetEnvironmentVariable("RIAK_HOST");

            if (String.IsNullOrWhiteSpace(riakHost))
            {
                riakHost = "riak-test";
            }

            Debug.WriteLine("Riak host: {0}", riakHost);

            Assert.AreEqual(10047, endingPort);

            var objs = new List <RiakObject>();

            for (int i = 0; i < totalObjects; i++)
            {
                var key = String.Format("{0}_{1}", TestKey, i);
                var id  = new RiakObjectId(TestBucket, key);
                var obj = new RiakObject(id, data, RiakConstants.ContentTypes.ApplicationOctetStream, null);
                objs.Add(obj);
            }

            IRiakClusterConfiguration clusterConfig = new RiakClusterConfiguration();

            for (ushort port = startingPort; port <= endingPort; port += portInterval)
            {
                IRiakNodeConfiguration nc = new RiakNodeConfiguration();
                nc.PoolSize    = poolSize;
                nc.HostAddress = riakHost;
                nc.PbcPort     = port;
                nc.Name        = String.Format("dev_{0}", port);
                clusterConfig.AddNode(nc);
            }

            var batchObjs = new RiakObject[batchSize];
            var p         = new int[] { 1, batchSize };

            foreach (int parallelism in p)
            {
                var parallelOptions = new ParallelOptions();
                parallelOptions.MaxDegreeOfParallelism = parallelism;

                using (var cluster = new RiakCluster(clusterConfig))
                {
                    var client = cluster.CreateClient();

                    var sw = new Stopwatch();
                    sw.Start();

                    for (int i = 0; i < totalObjects; i += batchSize)
                    {
                        objs.CopyTo(i, batchObjs, 0, batchSize);
                        Parallel.ForEach(batchObjs, parallelOptions, (obj) =>
                        {
                            try
                            {
                                client.Put(obj);
                            }
                            catch (Exception e)
                            {
                                Debug.WriteLine("[ERROR] put exception: {0}", e.ToString());
                            }
                        });
                    }

                    sw.Stop();
                    Debug.WriteLine("parallelism: {0} - put {1} objects in {2}", parallelism, totalObjects, sw.Elapsed);

                    sw.Reset();

                    sw.Start();
                    for (int i = 0; i < totalObjects; i += batchSize)
                    {
                        objs.CopyTo(i, batchObjs, 0, batchSize);
                        Parallel.ForEach(batchObjs, parallelOptions, (obj) =>
                        {
                            try
                            {
                                var id = new RiakObjectId(obj.Bucket, obj.Key);
                                client.Get(id);
                            }
                            catch (Exception e)
                            {
                                Debug.WriteLine("[ERROR] put exception: {0}", e.ToString());
                            }
                        });
                    }

                    sw.Stop();
                    Debug.WriteLine("parallelism: {0} - fetched {1} objects in {2}", parallelism, totalObjects, sw.Elapsed);
                }
            }
        }
示例#59
0
 public Task <Either <RiakException, RiakObjectId> > Delete(RiakObject riakObject, RiakDeleteOptions options = null)
 {
     return(Delete(riakObject.Bucket, riakObject.Key, options));
 }
示例#60
0
        public IObservable <Either <RiakException, RiakObject> > Get(IEnumerable <RiakObjectId> bucketKeyPairs, RiakGetOptions options = null)
        {
            var observable = Observable.Create <Either <RiakException, RiakObject> >(async obs =>
            {
                try
                {
                    bucketKeyPairs = bucketKeyPairs.ToList();
                    options        = options ?? new RiakGetOptions();

                    foreach (var bucketKeyPair in bucketKeyPairs)
                    {
                        // modified closure FTW
                        var bk = bucketKeyPair;
                        if (!IsValidBucketOrKey(bk.Bucket))
                        {
                            obs.OnNext(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.InvalidRequest, InvalidBucketErrorMessage, false)));
                            continue;
                        }

                        if (!IsValidBucketOrKey(bk.Key))
                        {
                            obs.OnNext(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.InvalidRequest, InvalidKeyErrorMessage, false)));
                            continue;
                        }

                        var req = new RpbGetReq
                        {
                            bucket = bk.Bucket.ToRiakString(),
                            key    = bk.Key.ToRiakString()
                        };
                        options.Populate(req);

                        try
                        {
                            var result = await _connection.PbcWriteRead <RpbGetReq, RpbGetResp>(_endPoint, req)
                                         .ConfigureAwait(false);

                            if (result.vclock == null)
                            {
                                obs.OnNext(new Either <RiakException, RiakObject>(new RiakException((uint)ResultCode.NotFound, "Unable to find value in Riak", false)));
                                continue;
                            }

                            var riakObject = new RiakObject(bk.Bucket, bk.Key, result.content.First(), result.vclock);

                            if (result.content.Count > 1)
                            {
                                riakObject.Siblings = result.content
                                                      .Select(c => new RiakObject(bk.Bucket, bk.Key, c, result.vclock))
                                                      .ToList();
                            }

                            obs.OnNext(new Either <RiakException, RiakObject>(riakObject));
                        }
                        catch (RiakException riakException)
                        {
                            obs.OnNext(new Either <RiakException, RiakObject>(riakException));
                        }
                    }

                    obs.OnCompleted();
                }
                catch (Exception exception)
                {
                    obs.OnError(exception);
                }
                return(Disposable.Empty);
            });

            return(observable);
        }