public async Task AddTimeSeriesPolicy() { await ServerStore.EnsureNotPassiveAsync(); var collection = GetStringQueryString("collection", required: true); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) using (var json = context.ReadForDisk(RequestBodyStream(), "time-series policy config")) { var policy = JsonDeserializationCluster.TimeSeriesPolicy(json); TimeSeriesConfiguration current; using (context.OpenReadTransaction()) { current = ServerStore.Cluster.ReadRawDatabaseRecord(context, Database.Name).TimeSeriesConfiguration ?? new TimeSeriesConfiguration(); } current.Collections ??= new Dictionary <string, TimeSeriesCollectionConfiguration>(StringComparer.OrdinalIgnoreCase); if (current.Collections.ContainsKey(collection) == false) { current.Collections[collection] = new TimeSeriesCollectionConfiguration(); } if (RawTimeSeriesPolicy.IsRaw(policy)) { current.Collections[collection].RawPolicy = new RawTimeSeriesPolicy(policy.RetentionTime); } else { current.Collections[collection].Policies ??= new List <TimeSeriesPolicy>(); var existing = current.Collections[collection].GetPolicyByName(policy.Name, out _); if (existing != null) { current.Collections[collection].Policies.Remove(existing); } current.Collections[collection].Policies.Add(policy); } current.InitializeRollupAndRetention(); ServerStore.LicenseManager.AssertCanAddTimeSeriesRollupsAndRetention(current); var editTimeSeries = new EditTimeSeriesConfigurationCommand(current, Database.Name, GetRaftRequestIdFromQuery()); var(index, _) = await ServerStore.SendToLeaderAsync(editTimeSeries); await WaitForIndexToBeApplied(context, index); SendConfigurationResponse(context, index); } }
public async Task ConfigTimeSeriesNames() { ServerStore.EnsureNotPassive(); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) using (var json = context.ReadForDisk(RequestBodyStream(), "time-series value names")) { var parameters = JsonDeserializationServer.Parameters.TimeSeriesValueNamesParameters(json); parameters.Validate(); TimeSeriesConfiguration current; using (context.OpenReadTransaction()) { current = ServerStore.Cluster.ReadRawDatabaseRecord(context, Database.Name).TimeSeriesConfiguration ?? new TimeSeriesConfiguration(); } if (current.NamedValues == null) { current.AddValueName(parameters.Collection, parameters.TimeSeries, parameters.ValueNames); } else { var currentNames = current.GetNames(parameters.Collection, parameters.TimeSeries); if (currentNames?.SequenceEqual(parameters.ValueNames, StringComparer.Ordinal) == true) { return; // no need to update, they identical } if (parameters.Update == false) { if (current.TryAddValueName(parameters.Collection, parameters.TimeSeries, parameters.ValueNames) == false) { throw new InvalidOperationException( $"Failed to update the names for time-series '{parameters.TimeSeries}' in collection '{parameters.Collection}', they already exists."); } } current.AddValueName(parameters.Collection, parameters.TimeSeries, parameters.ValueNames); } var editTimeSeries = new EditTimeSeriesConfigurationCommand(current, Database.Name, GetRaftRequestIdFromQuery()); var(index, _) = await ServerStore.SendToLeaderAsync(editTimeSeries); await WaitForIndexToBeApplied(context, index); SendConfigurationResponse(context, index); } }
public async Task RemoveTimeSeriesPolicy() { await ServerStore.EnsureNotPassiveAsync(); var collection = GetStringQueryString("collection", required: true); var name = GetStringQueryString("name", required: true); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) { TimeSeriesConfiguration current; using (context.OpenReadTransaction()) { current = ServerStore.Cluster.ReadRawDatabaseRecord(context, Database.Name).TimeSeriesConfiguration; } if (current?.Collections?.ContainsKey(collection) == true) { var p = current.Collections[collection].GetPolicyByName(name, out _); if (p == null) { return; } if (ReferenceEquals(p, current.Collections[collection].RawPolicy)) { current.Collections[collection].RawPolicy = RawTimeSeriesPolicy.Default; } else { current.Collections[collection].Policies.Remove(p); } current.InitializeRollupAndRetention(); ServerStore.LicenseManager.AssertCanAddTimeSeriesRollupsAndRetention(current); var editTimeSeries = new EditTimeSeriesConfigurationCommand(current, Database.Name, GetRaftRequestIdFromQuery()); var(index, _) = await ServerStore.SendToLeaderAsync(editTimeSeries); await WaitForIndexToBeApplied(context, index); SendConfigurationResponse(context, index); } } }
public async Task PostCreateSampleData() { using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context)) { using (context.OpenReadTransaction()) { foreach (var collection in Database.DocumentsStorage.GetCollections(context)) { if (collection.Count > 0) { throw new InvalidOperationException("You cannot create sample data in a database that already contains documents"); } } } var operateOnTypesAsString = GetStringValuesQueryString("operateOnTypes", required: false); var operateOnTypes = GetOperateOnTypes(operateOnTypesAsString); if (operateOnTypes.HasFlag(DatabaseItemType.RevisionDocuments)) { var editRevisions = new EditRevisionsConfigurationCommand(new RevisionsConfiguration { Collections = new Dictionary <string, RevisionsCollectionConfiguration> { ["Orders"] = new RevisionsCollectionConfiguration { Disabled = false } } }, Database.Name, GetRaftRequestIdFromQuery() + "/revisions"); var(index, _) = await ServerStore.SendToLeaderAsync(editRevisions); await Database.RachisLogIndexNotifications.WaitForIndexNotification(index, Database.ServerStore.Engine.OperationTimeout); } if (operateOnTypes.HasFlag(DatabaseItemType.TimeSeries)) { var tsConfig = new TimeSeriesConfiguration { NamedValues = new Dictionary <string, Dictionary <string, string[]> > { ["Companies"] = new Dictionary <string, string[]> { ["StockPrices"] = new[] { "Open", "Close", "High", "Low", "Volume" } }, ["Employees"] = new Dictionary <string, string[]> { ["HeartRates"] = new[] { "BPM" } } } }; var editTimeSeries = new EditTimeSeriesConfigurationCommand(tsConfig, Database.Name, GetRaftRequestIdFromQuery() + "/time-series"); var(index, _) = await ServerStore.SendToLeaderAsync(editTimeSeries); await Database.RachisLogIndexNotifications.WaitForIndexNotification(index, Database.ServerStore.Engine.OperationTimeout); } await using (var sampleData = typeof(SampleDataHandler).Assembly .GetManifestResourceStream("Raven.Server.Web.Studio.EmbeddedData.Northwind.ravendbdump")) { await using (var stream = new GZipStream(sampleData, CompressionMode.Decompress)) using (var source = new StreamSource(stream, context, Database)) { var destination = new DatabaseDestination(Database); var smuggler = new DatabaseSmuggler(Database, source, destination, Database.Time, options: new DatabaseSmugglerOptionsServerSide { OperateOnTypes = operateOnTypes, SkipRevisionCreation = true }); await smuggler.ExecuteAsync(); } } await NoContent(); }