示例#1
0
        public async Task Test_Can_Combine_Indexes()
        {
            using (var db = await OpenTestPartitionAsync())
            {
                var location = await GetCleanDirectory(db, "Indexing");

                // clear previous values
                await DeleteSubspace(db, location);

                // summon our main cast
                var characters = new List <Character>()
                {
                    new Character {
                        Id = 1, Name = "Super Man", Brand = "DC", HasSuperPowers = true, IsVilain = false
                    },
                    new Character {
                        Id = 2, Name = "Batman", Brand = "DC", IsVilain = false
                    },
                    new Character {
                        Id = 3, Name = "Joker", Brand = "DC", IsVilain = true
                    },
                    new Character {
                        Id = 4, Name = "Iron Man", Brand = "Marvel", IsVilain = false
                    },
                    new Character {
                        Id = 5, Name = "Magneto", Brand = "Marvel", HasSuperPowers = true, IsVilain = true
                    },
                    new Character {
                        Id = 6, Name = "Catwoman", Brand = "DC", IsVilain = default(bool?)
                    },
                };

                var indexBrand     = new FdbIndex <long, string>("Heroes.ByBrand", location.Partition.ByKey("CharactersByBrand"));
                var indexSuperHero = new FdbIndex <long, bool>("Heroes.BySuper", location.Partition.ByKey("SuperHeros"));
                var indexAlignment = new FdbIndex <long, bool?>("Heros.ByAlignment", location.Partition.ByKey("FriendsOrFoe"));

                // index everything
                await db.WriteAsync((tr) =>
                {
                    foreach (var character in characters)
                    {
                        indexBrand.Add(tr, character.Id, character.Brand);
                        indexSuperHero.Add(tr, character.Id, character.HasSuperPowers);
                        indexAlignment.Add(tr, character.Id, character.IsVilain);
                    }
                }, this.Cancellation);

#if DEBUG
                await DumpSubspace(db, location);
#endif

                // super hereos only (sorry Batman!)
                using (var tr = db.BeginTransaction(this.Cancellation))
                {
                    var superHeroes = await indexSuperHero.LookupAsync(tr, value : true);

                    Log("SuperHeroes: " + string.Join(", ", superHeroes));
                    Assert.That(superHeroes, Is.EqualTo(characters.Where(c => c.HasSuperPowers).Select(c => c.Id).ToList()));
                }

                // Versus !
                using (var tr = db.BeginTransaction(this.Cancellation))
                {
                    var dc = await indexBrand.LookupAsync(tr, value : "DC");

                    Log("DC: " + string.Join(", ", dc));
                    Assert.That(dc, Is.EqualTo(characters.Where(c => c.Brand == "DC").Select(c => c.Id).ToList()));

                    var marvel = await indexBrand.LookupAsync(tr, value : "Marvel");

                    Log("Marvel: " + string.Join(", ", dc));
                    Assert.That(marvel, Is.EqualTo(characters.Where(c => c.Brand == "Marvel").Select(c => c.Id).ToList()));
                }

                // Vilains with superpowers are the worst
                using (var tr = db.BeginTransaction(this.Cancellation))
                {
                    var first  = indexAlignment.Lookup(tr, value: true);
                    var second = indexSuperHero.Lookup(tr, value: true);

                    var merged = await first
                                 .Intersect(second)
                                 .ToListAsync();

                    Assert.That(merged.Count, Is.EqualTo(1));
                    Assert.That(merged[0] == characters.Single(c => c.Name == "Magneto").Id);
                }
            }
        }
		public async Task Test_Can_Combine_Indexes()
		{

			using (var db = await OpenTestPartitionAsync())
			{

				var location = await GetCleanDirectory(db, "Indexing");

				// clear previous values
				await DeleteSubspace(db, location);

				// summon our main cast
				var characters = new List<Character>()
				{
					new Character { Id = 1, Name = "Super Man", Brand="DC", HasSuperPowers = true, IsVilain = false },
					new Character { Id = 2, Name = "Batman", Brand="DC", IsVilain = false },
					new Character { Id = 3, Name = "Joker", Brand="DC", IsVilain = true },
					new Character { Id = 4, Name = "Iron Man", Brand="Marvel", IsVilain = false },
					new Character { Id = 5, Name = "Magneto", Brand="Marvel", HasSuperPowers = true, IsVilain = true },
					new Character { Id = 6, Name = "Catwoman", Brand="DC", IsVilain = default(bool?) },
				};

				var indexBrand = new FdbIndex<long, string>("Heroes.ByBrand", location.Partition("CharactersByBrand"));
				var indexSuperHero = new FdbIndex<long, bool>("Heroes.BySuper", location.Partition("SuperHeros"));
				var indexAlignment = new FdbIndex<long, bool?>("Heros.ByAlignment", location.Partition("FriendsOrFoe"));

				// index everything
				await db.WriteAsync((tr) =>
				{
					foreach (var character in characters)
					{
						indexBrand.Add(tr, character.Id, character.Brand);
						indexSuperHero.Add(tr, character.Id, character.HasSuperPowers);
						indexAlignment.Add(tr, character.Id, character.IsVilain);
					}
				}, this.Cancellation);

#if DEBUG
				await DumpSubspace(db, location);
#endif

				// super hereos only (sorry Batman!)
				using (var tr = db.BeginTransaction(this.Cancellation))
				{
					var superHeroes = await indexSuperHero.LookupAsync(tr, value: true);
					Console.WriteLine("SuperHeroes: " + string.Join(", ", superHeroes));
					Assert.That(superHeroes, Is.EqualTo(characters.Where(c => c.HasSuperPowers).Select(c => c.Id).ToList()));
				}

				// Versus !
				using (var tr = db.BeginTransaction(this.Cancellation))
				{
					var dc = await indexBrand.LookupAsync(tr, value: "DC");
					Console.WriteLine("DC: " + string.Join(", ", dc));
					Assert.That(dc, Is.EqualTo(characters.Where(c => c.Brand == "DC").Select(c => c.Id).ToList()));

					var marvel = await indexBrand.LookupAsync(tr, value: "Marvel");
					Console.WriteLine("Marvel: " + string.Join(", ", dc));
					Assert.That(marvel, Is.EqualTo(characters.Where(c => c.Brand == "Marvel").Select(c => c.Id).ToList()));
				}

				// Vilains with superpowers are the worst
				using (var tr = db.BeginTransaction(this.Cancellation))
				{
					var first = indexAlignment.Lookup(tr, value: true);
					var second = indexSuperHero.Lookup(tr, value: true);

					var merged = await first
						.Intersect(second)
						.ToListAsync();

					Assert.That(merged.Count, Is.EqualTo(1));
					Assert.That(merged[0] == characters.Single(c => c.Name == "Magneto").Id);
				}
			}

		}
        public async Task Task_Can_Add_Update_Remove_From_Index()
        {
            using (var db = await OpenTestPartitionAsync())
            {
                var location = db.Root["Indexing"];

                // clear previous values
                await CleanLocation(db, location);

                var subspace = location.ByKey("FoosByColor");
                var index    = new FdbIndex <int, string>(subspace);

                // add items to the index
                await db.WriteAsync(async (tr) =>
                {
                    await index.AddAsync(tr, 1, "red");
                    await index.AddAsync(tr, 2, "green");
                    await index.AddAsync(tr, 3, "blue");
                    await index.AddAsync(tr, 4, "green");
                    await index.AddAsync(tr, 5, "yellow");
                }, this.Cancellation);

#if DEBUG
                await DumpSubspace(db, subspace);
#endif

                // lookup values

                using (var tr = await db.BeginReadOnlyTransactionAsync(this.Cancellation))
                {
                    var reds = await index.Lookup(tr, "red").ToListAsync();

                    Assert.That(reds, Is.EqualTo(new int[] { 1 }));

                    var greens = await index.Lookup(tr, "green").ToListAsync();

                    Assert.That(greens, Is.EqualTo(new int[] { 2, 4 }));

                    var blues = await index.Lookup(tr, "blue").ToListAsync();

                    Assert.That(blues, Is.EqualTo(new int[] { 3 }));

                    var yellows = await index.Lookup(tr, "yellow").ToListAsync();

                    Assert.That(yellows, Is.EqualTo(new int[] { 5 }));
                }

                // update

                await db.WriteAsync(async (tr) =>
                {
                    await index.UpdateAsync(tr, 3, "indigo", "blue");
                    await index.RemoveAsync(tr, 5, "yellow");
                }, this.Cancellation);

#if DEBUG
                await DumpSubspace(db, subspace);
#endif

                // check values

                using (var tr = await db.BeginTransactionAsync(this.Cancellation))
                {
                    var reds = await index.Lookup(tr, "red").ToListAsync();

                    Assert.That(reds, Is.EqualTo(new int[] { 1 }));

                    var greens = await index.Lookup(tr, "green").ToListAsync();

                    Assert.That(greens, Is.EqualTo(new int[] { 2, 4 }));

                    var blues = await index.Lookup(tr, "blue").ToListAsync();

                    Assert.That(blues.Count, Is.Zero);

                    var yellows = await index.Lookup(tr, "yellow").ToListAsync();

                    Assert.That(yellows.Count, Is.Zero);

                    var indigos = await index.Lookup(tr, "indigo").ToListAsync();

                    Assert.That(indigos, Is.EqualTo(new int[] { 3 }));
                }
            }
        }