Exemple #1
0
		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;
            }
        }