public void MergeSimilarTasks(Task task, out int taskCount) { taskCount = 1; if (task.SupportsMerging == false) return; Api.JetSetCurrentIndex(session, Tasks, "mergables_by_task_type"); Api.MakeKey(session, Tasks, true, MakeKeyGrbit.NewKey); Api.MakeKey(session, Tasks, task.Index, Encoding.Unicode, MakeKeyGrbit.None); Api.MakeKey(session, Tasks, task.Type, Encoding.Unicode, MakeKeyGrbit.None); // there are no tasks matching the current one, just return if (Api.TrySeek(session, Tasks, SeekGrbit.SeekEQ) == false) { return; } Api.MakeKey(session, Tasks, true, MakeKeyGrbit.NewKey); Api.MakeKey(session, Tasks, task.Index, Encoding.Unicode, MakeKeyGrbit.None); Api.MakeKey(session, Tasks, task.Type, Encoding.Unicode, MakeKeyGrbit.None); Api.JetSetIndexRange(session, Tasks, SetIndexRangeGrbit.RangeInclusive | SetIndexRangeGrbit.RangeUpperLimit); do { // esent index ranges are approximate, and we need to check them ourselves as well if (Api.RetrieveColumnAsBoolean(session, Tasks, tableColumnsCache.TasksColumns["supports_merging"]) == false) continue; if (Api.RetrieveColumnAsString(session, Tasks, tableColumnsCache.TasksColumns["for_index"]) != task.Index) continue; if (Api.RetrieveColumnAsString(session, Tasks, tableColumnsCache.TasksColumns["task_type"]) != task.Type) continue; try { var taskAsBytes = Api.RetrieveColumn(session, Tasks, tableColumnsCache.TasksColumns["task"]); var taskType = Api.RetrieveColumnAsString(session, Tasks, tableColumnsCache.TasksColumns["task_type"], Encoding.Unicode); Task existingTask; try { existingTask = Task.ToTask(taskType, taskAsBytes); } catch (Exception e) { logger.ErrorFormat(e, "Could not create instance of a task: {0}", taskAsBytes); Api.JetDelete(session, Tasks); continue; } if (task.TryMerge(existingTask) == false) continue; Api.JetDelete(session, Tasks); taskCount += 1; } catch (EsentErrorException e) { if (e.Error == JET_err.WriteConflict) continue; throw; } } while ( task.SupportsMerging && Api.TryMoveNext(session, Tasks) ); }
private void MergeSimilarTasks(Task task, byte [] taskId, out int taskCount) { taskCount = 1; if (task.SupportsMerging == false) return; var keyForTaskToTryMergings = storage.Tasks["ByIndexAndType"].SkipTo(new JObject { {"index", task.Index}, {"type", task.Type}, }) .Where(x => new Guid(x.Value<byte[]>("id")) != new Guid(taskId)) .TakeWhile(x => StringComparer.InvariantCultureIgnoreCase.Equals(x.Value<string>("index"), task.Index) && StringComparer.InvariantCultureIgnoreCase.Equals(x.Value<string>("type"), task.Type) ); foreach (var keyForTaskToTryMerging in keyForTaskToTryMergings) { var readResult = storage.Tasks.Read(keyForTaskToTryMerging); if(readResult == null) continue; Task existingTask; try { existingTask = Task.ToTask(readResult.Key.Value<string>("type"), readResult.Data()); } catch (Exception e) { logger.ErrorFormat(e, "Could not create instance of a task: {0}", readResult.Key); storage.Tasks.Remove(keyForTaskToTryMerging); continue; } if (task.TryMerge(existingTask) == false) continue; storage.Tasks.Remove(keyForTaskToTryMerging); taskCount += 1; if (task.SupportsMerging == false) return; } }