protected override void SetCounter(string key, long amount, TimeSpan?expireIn) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument(nameof(CounterDto.Key), key); BsonValue bsonDate = BsonNull.Value; if (expireIn != null) { bsonDate = BsonValue.Create(DateTime.UtcNow.Add(expireIn.Value)); } var update = new BsonDocument { ["$inc"] = new BsonDocument(nameof(CounterDto.Value), amount), ["$set"] = new BsonDocument(nameof(KeyJobDto.ExpireAt), bsonDate), ["$setOnInsert"] = new BsonDocument { ["_t"] = new BsonArray { nameof(BaseJobDto), nameof(ExpiringJobDto), nameof(KeyJobDto), nameof(CounterDto) }, } }; JobGraph.UpdateOne(SessionHandle, filter, update, new UpdateOptions { IsUpsert = true }); }
public override void PersistJob(string jobId) { var filter = CreateJobIdFilter(jobId); var update = new BsonDocument("$set", new BsonDocument(nameof(KeyJobDto.ExpireAt), BsonNull.Value)); JobGraph.UpdateOne(SessionHandle, filter, update); }
public override void SetJobParameter(string id, string name, string value) { if (id == null) { throw new ArgumentNullException(nameof(id)); } if (name == null) { throw new ArgumentNullException(nameof(name)); } var filter = new BsonDocument("_id", ObjectId.Parse(id)); BsonValue bsonValue; if (value == null) { bsonValue = BsonNull.Value; } else { bsonValue = value; } var update = new BsonDocument("$set", new BsonDocument($"{nameof(JobDto.Parameters)}.{name}", bsonValue)); JobGraph.UpdateOne(SessionHandle, filter, update); }
public static List <int> getOrderedJobs(JobGraph graph) { List <int> orderedJobs = new List <int>(); List <JobNode> nodesWithNoPrereqs = new List <JobNode>(); foreach (JobNode node in graph.nodes) { if (node.numOfPrereqs == 0) { nodesWithNoPrereqs.Add(node); } } while (nodesWithNoPrereqs.Count > 0) { JobNode node = nodesWithNoPrereqs[nodesWithNoPrereqs.Count - 1]; nodesWithNoPrereqs.RemoveAt(nodesWithNoPrereqs.Count - 1); orderedJobs.Add(node.job); removeDeps(node, nodesWithNoPrereqs); } bool graphHasEdges = false; foreach (JobNode node in graph.nodes) { if (node.numOfPrereqs > 0) { graphHasEdges = true; } } return(graphHasEdges ? new List <int>() : orderedJobs); }
public override string CreateExpiredJob(Job job, IDictionary <string, string> parameters, DateTime createdAt, TimeSpan expireIn) { if (job == null) { throw new ArgumentNullException(nameof(job)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } var invocationData = InvocationData.Serialize(job); var jobDto = new JobDto { Id = ObjectId.GenerateNewId(), InvocationData = JobHelper.ToJson(invocationData), Arguments = invocationData.Arguments, Parameters = parameters.ToDictionary(kv => kv.Key, kv => kv.Value), CreatedAt = createdAt, ExpireAt = createdAt.Add(expireIn) }; JobGraph.InsertOne(SessionHandle, jobDto.ToBsonDocument()); var jobId = jobDto.Id.ToString(); return(jobId); }
public override void ExpireJob(string jobId, TimeSpan expireIn) { var filter = CreateJobIdFilter(jobId); var update = new BsonDocument("$set", new BsonDocument(nameof(KeyJobDto.ExpireAt), DateTime.UtcNow.Add(expireIn))); JobGraph.UpdateOne(SessionHandle, filter, update); }
public static JobGraph createJobGraph(List <int> jobs, List <int[]> deps) { JobGraph graph = new JobGraph(jobs); foreach (int[] dep in deps) { graph.addPrereq(dep[1], dep[0]); } return(graph); }
public override void RemoveHash(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument(nameof(HashDto.Key), key); JobGraph.DeleteOne(SessionHandle, filter); }
public override void RemoveSet(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = CreateSetFilter(key); JobGraph.DeleteMany(SessionHandle, filter); }
public override void AddToQueue(string queue, string jobId) { var jobQueueDto = new JobQueueDto { JobId = ObjectId.Parse(jobId), Queue = queue, Id = ObjectId.GenerateNewId(), FetchedAt = null }.ToBsonDocument(); JobGraph.InsertOne(SessionHandle, jobQueueDto); JobsAddedToQueue.Add(queue); }
public override void PersistSet(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = CreateSetFilter(key); var update = new BsonDocument("$set", new BsonDocument(nameof(SetDto.ExpireAt), BsonNull.Value)); JobGraph.UpdateMany(filter, update); }
public override void ExpireSet(string key, TimeSpan expireIn) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = CreateSetFilter(key); var update = new BsonDocument("$set", new BsonDocument(nameof(SetDto.ExpireAt), DateTime.UtcNow.Add(expireIn))); JobGraph.UpdateMany(SessionHandle, filter, update); }
public override void PersistHash(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument(nameof(KeyJobDto.Key), key); var update = new BsonDocument("$set", new BsonDocument(nameof(HashDto.ExpireAt), BsonNull.Value)); JobGraph.UpdateOne(SessionHandle, filter, update); }
public override void ExpireHash(string key, TimeSpan expireIn) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument(nameof(KeyJobDto.Key), key); var update = new BsonDocument("$set", new BsonDocument(nameof(HashDto.ExpireAt), DateTime.UtcNow.Add(expireIn))); JobGraph.UpdateOne(SessionHandle, filter, update); }
public override void AddJobState(string jobId, IState state) { var filter = CreateJobIdFilter(jobId); var stateDto = new StateDto { Name = state.Name, Reason = state.Reason, CreatedAt = DateTime.UtcNow, Data = state.SerializeData() }.ToBsonDocument(); var update = new BsonDocument("$push", new BsonDocument(nameof(JobDto.StateHistory), stateDto)); JobGraph.UpdateOne(SessionHandle, filter, update); }
public override void RemoveFromList(string key, string value) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument("$and", new BsonArray { new BsonDocument(nameof(ListDto.Item), key), new BsonDocument(nameof(ListDto.Value), value), new BsonDocument("_t", nameof(ListDto)) }); JobGraph.DeleteMany(SessionHandle, filter); }
public static List <int> getOrderedJobs(JobGraph graph) { List <int> orderedJobs = new List <int>(); List <JobNode> nodes = new List <JobNode>(graph.nodes); while (nodes.Count > 0) { JobNode node = nodes[nodes.Count - 1]; nodes.RemoveAt(nodes.Count - 1); bool ContainsCycle = depthFirstTraverse(node, orderedJobs); if (ContainsCycle) { return(new List <int>()); } } return(orderedJobs); }
public override void InsertToList(string key, string value) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var listDto = new ListDto { Id = ObjectId.GenerateNewId(), Item = key, Value = value }; JobGraph.InsertOne(SessionHandle, listDto.ToBsonDocument()); _insertedLists.Add(listDto); }
public override void PersistList(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument("$and", new BsonArray { new BsonDocument(nameof(ListDto.Item), key), new BsonDocument("_t", nameof(ListDto)) }); var update = new BsonDocument("$set", new BsonDocument(nameof(ListDto.ExpireAt), BsonNull.Value)); JobGraph.UpdateMany(SessionHandle, filter, update); }
public override void ExpireList(string key, TimeSpan expireIn) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var filter = new BsonDocument("$and", new BsonArray { new BsonDocument(nameof(ListDto.Item), key), new BsonDocument("_t", nameof(ListDto)) }); var update = new BsonDocument("$set", new BsonDocument(nameof(ListDto.ExpireAt), DateTime.UtcNow.Add(expireIn))); JobGraph.UpdateMany(SessionHandle, filter, update); }
public void TopologicalSort_Graph() { //Arrange TopologicalSortAlgorithm <int> tsa = new TopologicalSortAlgorithm <int>(); List <int> jobs = new List <int> { 1, 2, 3, 4 }; List <(int, int)> deps = new List <(int, int)> { (1, 2), (1, 3), (3, 2), (4, 2), (4, 3) }; //Act JobGraph <int> jobsGraph = tsa.CreateJobGraph(jobs, deps); List <int> orders = tsa.GetOrderedJobs(jobsGraph); //Assert Assert.That(orders, Is.EqualTo(new List <int> { 1, 4, 3, 2 })); }
protected override void AddRangeToSet(string key, IList <string> items, double score) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (items == null) { throw new ArgumentNullException(nameof(items)); } foreach (var item in items) { var filter = CreateSetFilter(key, item); var update = CreateSetUpdate(key, item, score); JobGraph.UpdateOne(SessionHandle, filter, update, new UpdateOptions { IsUpsert = true }); } }
public override void SetRangeInHash(string key, IEnumerable <KeyValuePair <string, string> > keyValuePairs) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (keyValuePairs == null) { throw new ArgumentNullException(nameof(keyValuePairs)); } var fields = new BsonDocument(); foreach (var pair in keyValuePairs) { var field = pair.Key; var value = pair.Value; fields[$"{nameof(HashDto.Fields)}.{field}"] = value; } var update = new BsonDocument { ["$set"] = fields, ["$setOnInsert"] = new BsonDocument { ["_t"] = new BsonArray { nameof(BaseJobDto), nameof(ExpiringJobDto), nameof(KeyJobDto), nameof(HashDto) }, [nameof(HashDto.ExpireAt)] = BsonNull.Value } }; var filter = new BsonDocument(nameof(HashDto.Key), key); JobGraph.UpdateOne(SessionHandle, filter, update, new UpdateOptions { IsUpsert = true }); }
public override void TrimList(string key, int keepStartingFrom, int keepEndingAt) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var start = keepStartingFrom + 1; var end = keepEndingAt + 1; // get all ids var allIds = DbContext.JobGraph.OfType <ListDto>() .Find(new BsonDocument()) .Project(doc => doc.Id) .ToList(); // Add LisDto's scheduled for insertion writemodels collection, add it here. allIds .AddRange(_insertedLists .Where(l => l.Item == key) .Select(l => l.Id)); var toTrim = allIds .OrderByDescending(id => id.Timestamp) .Select((id, i) => new { Index = i + 1, Id = id }) .Where(_ => (_.Index >= start && (_.Index <= end)) == false) .Select(_ => _.Id) .ToList(); var filter = new BsonDocument { ["_id"] = new BsonDocument("$in", new BsonArray(toTrim)), [nameof(ListDto.Item)] = key }; JobGraph.DeleteMany(SessionHandle, filter); }
public static List <int> TopologicalSortSolution1(List <int> jobs, List <int[]> deps) { JobGraph jobGraph = createJobGraph(jobs, deps); return(getOrderedJobs(jobGraph)); }