/// <summary> /// Initializes the partition resolver to be used with Item repository. /// </summary> /// <param name="resolverService"></param> public async void getResolver(int resolverService) { switch (resolverService) { case Hash: HashPartitionResolver hashResolver = await PartitionInitializers.InitializeHashResolver("tenantId", Client, Database, collections); break; case ManagedHash: ManagedHashPartitionResolver managedHashResolver = PartitionInitializers.InitializeManagedHashResolver(i => ((Item)i).tenantId, Client, Database, 3, null); break; case Spillover: SpilloverPartitionResolver spilloverResolver = new SpilloverPartitionResolver(Client, Database); Client.PartitionResolvers[Database.SelfLink] = spilloverResolver; break; case Range: RangePartitionResolver <string> rangeResolver = await PartitionInitializers.InitializeRangeResolver("tenantId", Client, Database, collections); break; case Lookup: LookupPartitionResolver <string> lookupResolver = await PartitionInitializers.InitializeLookupPartitionResolver("tenantId", Client, Database, collections); break; default: goto case Hash; } }
public async Task <IHttpActionResult> LookupPartitionResolver() { string[] collections = AppSettingsConfig.MainCollection.Split(','); var database = await DocumentClientHelper.GetNewDatabaseAsync(_client, AppSettingsConfig.Db); LookupPartitionResolver <string> lookupResolver = await PartitionInitializers.InitializeLookupPartitionResolver("UserId", _client, database, collections); return(Ok()); }
/// <summary> /// Initialize a LookupPartitionResolver. /// </summary> /// <param name="database">The database to run the samples on.</param> /// <returns>The created HashPartitionResolver.</returns> private async Task <LookupPartitionResolver <string> > InitializeLookupPartitionResolver(Database database) { DocumentCollection collectionUS = await DocumentClientHelper.GetCollectionAsync(this.client, database, "Collection.US"); DocumentCollection collectionEU = await DocumentClientHelper.GetCollectionAsync(this.client, database, "Collection.Europe"); DocumentCollection collectionOther = await DocumentClientHelper.GetCollectionAsync(this.client, database, "Collection.Other"); // This implementation takes strings as input. If you'd like to implement a strongly typed LookupPartitionResolver, // take a look at EnumLookupPartitionResolver for an example. var lookupResolver = new LookupPartitionResolver <string>( "PrimaryRegion", new Dictionary <string, string>() { { Region.UnitedStatesEast.ToString(), collectionUS.SelfLink }, { Region.UnitedStatesWest.ToString(), collectionUS.SelfLink }, { Region.Europe.ToString(), collectionEU.SelfLink }, { Region.AsiaPacific.ToString(), collectionOther.SelfLink }, { Region.Other.ToString(), collectionOther.SelfLink }, }); this.client.PartitionResolvers[database.SelfLink] = lookupResolver; return(lookupResolver); }
/// <summary> /// Initialize a LookupPartitionResolver. Default is for US East/West to go to first collection name, Europe to second, and AsiaPacific / Other to third. /// </summary> /// <param name="partitionKeyPropertyName">The property name to be used as the partition Key.</param> /// <param name="client">The DocumentDB client instance to use.</param> /// <param name="database">The database to run the samples on.</param> /// <param name="collectionNames">The names of collections used.</param> /// <returns>The created HashPartitionResolver.</returns> public static async Task <LookupPartitionResolver <string> > InitializeLookupPartitionResolver(string partitionKeyPropertyName, DocumentClient client, Database database, string[] collectionNames) { // Set local to input. string[] CollectionNames = collectionNames; int numCollectionNames = CollectionNames.Length; // Create array of DocumentCollections. DocumentCollection[] collections = new DocumentCollection[numCollectionNames]; // Create string array of Self Links to Collections. string[] selfLinks = new string[numCollectionNames]; //Create some collections to partition data. for (int i = 0; i < numCollectionNames; i++) { collections[i] = await DocumentClientHelper.GetCollectionAsync(client, database, CollectionNames[i]); selfLinks[i] = collections[i].SelfLink; } // This implementation takes strings as input. If you'd like to implement a strongly typed LookupPartitionResolver, // take a look at EnumLookupPartitionResolver for an example. var lookupResolver = new LookupPartitionResolver <string>( partitionKeyPropertyName, new Dictionary <string, string>() { { Region.UnitedStatesEast.ToString(), selfLinks[0] }, { Region.UnitedStatesWest.ToString(), selfLinks[0] }, { Region.Europe.ToString(), selfLinks[1] }, { Region.AsiaPacific.ToString(), selfLinks[2] }, { Region.Other.ToString(), selfLinks[2] }, }); client.PartitionResolvers[database.SelfLink] = lookupResolver; return(lookupResolver); }
/// <summary> /// Initialize a LookupPartitionResolver. /// </summary> /// <param name="database">The database to run the samples on.</param> /// <returns>The created HashPartitionResolver.</returns> private async Task<LookupPartitionResolver<string>> InitializeLookupPartitionResolver(Database database) { DocumentCollection collectionUS = await DocumentClientHelper.GetOrCreateCollectionAsync(this.client, database.Id, "Collection.US"); DocumentCollection collectionEU = await DocumentClientHelper.GetOrCreateCollectionAsync(this.client, database.Id, "Collection.Europe"); DocumentCollection collectionOther = await DocumentClientHelper.GetOrCreateCollectionAsync(this.client, database.Id, "Collection.Other"); // This implementation takes strings as input. If you'd like to implement a strongly typed LookupPartitionResolver, // take a look at EnumLookupPartitionResolver for an example. var lookupResolver = new LookupPartitionResolver<string>( "PrimaryRegion", new Dictionary<string, string>() { { Region.UnitedStatesEast.ToString(), collectionUS.SelfLink }, { Region.UnitedStatesWest.ToString(), collectionUS.SelfLink }, { Region.Europe.ToString(), collectionEU.SelfLink }, { Region.AsiaPacific.ToString(), collectionOther.SelfLink }, { Region.Other.ToString(), collectionOther.SelfLink }, }); this.client.PartitionResolvers[database.SelfLink] = lookupResolver; return lookupResolver; }
/// <summary> /// Run samples for Database create, read, update and delete. /// </summary> /// <returns>a Task object.</returns> private async Task RunAsync() { // Let's see how a to use a HashPartitionResolver. Console.WriteLine("Running samples with the default hash partition resolver ..."); Database database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); HashPartitionResolver hashResolver = await this.InitializeHashResolver(database); await this.RunCrudAndQuerySample(database, hashResolver); // Let's see how to use a RangePartitionResolver. Console.WriteLine("Running samples with the default range partition resolver ..."); database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); RangePartitionResolver <string> rangeResolver = await this.InitializeRangeResolver(database); await this.RunCrudAndQuerySample(database, rangeResolver); // Now let's take a look at an example of how to derive from one of the supported partition resolvers. // Here we implement a generic hash resolver that takes an arbirary lambda to extract partition keys. database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); HashPartitionResolver customHashResolver = await this.InitializeCustomHashResolver(database); await this.RunCrudAndQuerySample(database, customHashResolver); // Let's take a look at a example of a LookupPartitionResolver, i.e., use a simple lookup table. Console.WriteLine("Running samples with a lookup partition resolver ..."); database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); LookupPartitionResolver <string> lookupResolver = await this.InitializeLookupPartitionResolver(database); await this.RunCrudAndQuerySample(database, lookupResolver); // Now, a "managed" HashPartitionResolver that creates collections, while cloning their attributes like // IndexingPolicy and OfferType. Console.WriteLine("Running samples with a custom hash partition resolver that automates creating collections ..."); database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); ManagedHashPartitionResolver managedHashResolver = this.InitializeManagedHashResolver(database); await this.RunCrudAndQuerySample(database, managedHashResolver); // Now, a PartitionResolver that starts with one collection and spills over to new ones as the collections // get filled up. Console.WriteLine("Running samples with a custom \"spillover\" partition resolver"); database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); SpilloverPartitionResolver spilloverResolver = new SpilloverPartitionResolver(this.client, database); this.client.PartitionResolvers[database.SelfLink] = spilloverResolver; await this.RunCrudAndQuerySample(database, spilloverResolver); // Now let's see how to persist the settings for a PartitionResolver, and how to bootstrap from those settings. this.RunSerializeDeserializeSample(hashResolver); // Now let's take a look at how to add and remove partitions to a HashPartitionResolver. database = await DocumentClientHelper.GetNewDatabaseAsync(this.client, DatabaseId); await this.RepartitionDataSample(database); }
public ItemRepository(DocumentClient client, string databaseId) : base(client, databaseId) { this.partitionResolver = new LookupPartitionResolver(base.database.SelfLink); this.partitionResolver.Initialize(client); }
/// <summary> /// Initialize a LookupPartitionResolver. Default is for US East/West to go to first collection name, Europe to second, and AsiaPacific / Other to third. /// </summary> /// <param name="partitionKeyPropertyName">The property name to be used as the partition Key.</param> /// <param name="client">The DocumentDB client instance to use.</param> /// <param name="database">The database to run the samples on.</param> /// <param name="collectionNames">The names of collections used.</param> /// <returns>The created HashPartitionResolver.</returns> public static async Task<LookupPartitionResolver<string>> InitializeLookupPartitionResolver(string partitionKeyPropertyName, DocumentClient client, Database database, string[] collectionNames) { // Set local to input. string[] CollectionNames = collectionNames; int numCollectionNames = CollectionNames.Length; // Create array of DocumentCollections. DocumentCollection[] collections = new DocumentCollection[numCollectionNames]; // Create string array of Self Links to Collections. string[] selfLinks = new string[numCollectionNames]; //Create some collections to partition data. for (int i = 0; i < numCollectionNames; i++) { collections[i] = await DocumentClientHelper.GetCollectionAsync(client, database, CollectionNames[i]); selfLinks[i] = collections[i].SelfLink; } // This implementation takes strings as input. If you'd like to implement a strongly typed LookupPartitionResolver, // take a look at EnumLookupPartitionResolver for an example. var lookupResolver = new LookupPartitionResolver<string>( partitionKeyPropertyName, new Dictionary<string, string>() { { Region.UnitedStatesEast.ToString(), selfLinks[0] }, { Region.UnitedStatesWest.ToString(), selfLinks[0] }, { Region.Europe.ToString(), selfLinks[1] }, { Region.AsiaPacific.ToString(), selfLinks[2] }, { Region.Other.ToString(), selfLinks[2] }, }); client.PartitionResolvers[database.SelfLink] = lookupResolver; return lookupResolver; }