public override void Dispose() { var patcher = new ScriptedIndexResultsJsonPatcher(database, forEntityNames); if (string.IsNullOrEmpty(scriptedIndexResults.DeleteScript) == false) { foreach (var kvp in removed) { foreach (var entry in kvp.Value) { patcher.Apply(entry, new ScriptedPatchRequest { Script = scriptedIndexResults.DeleteScript, Values = { {"key", kvp.Key} } }); if (log.IsDebugEnabled && patcher.Debug.Count > 0) { log.Debug("Debug output for doc: {0} for index {1} (delete):\r\n.{2}", kvp.Key, scriptedIndexResults.Id, string.Join("\r\n", patcher.Debug)); patcher.Debug.Clear(); } } } } if (string.IsNullOrEmpty(scriptedIndexResults.IndexScript) == false) { foreach (var kvp in created) { try { foreach (var entry in kvp.Value) { patcher.Apply(entry, new ScriptedPatchRequest { Script = scriptedIndexResults.IndexScript, Values = { {"key", kvp.Key} } }); } } catch (Exception e) { log.Warn( "Could not apply index script " + scriptedIndexResults.Id + " to index result with key: " + kvp.Key, e); } finally { if (log.IsDebugEnabled && patcher.Debug.Count > 0) { log.Debug("Debug output for doc: {0} for index {1} (index):\r\n.{2}", kvp.Key, scriptedIndexResults.Id, string.Join("\r\n", patcher.Debug)); patcher.Debug.Clear(); } } } } database.TransactionalStorage.Batch(accessor => { foreach (var operation in patcher.GetOperations()) { switch (operation.Type) { case ScriptedJsonPatcher.OperationType.Put: database.Documents.Put(operation.Document.Key, operation.Document.Etag, operation.Document.DataAsJson, operation.Document.Metadata, null); break; case ScriptedJsonPatcher.OperationType.Delete: database.Documents.Delete(operation.DocumentKey, null, null); break; default: throw new ArgumentOutOfRangeException("operation.Type"); } } }); }