private IEnumerable <DynamicPropertyResult> LastEventIdPropertyCalculator(IQueryContext context, Name type, Name subject, Name def, Name target) { ulong min = ulong.MinValue; var allEvents = m_registry.Values; foreach (var eve in allEvents) { if (eve.Timestamp >= min) { min = eve.Timestamp; } } var lastEvents = m_registry.Where(x => x.Value.Timestamp == min); var lastIndexes = new NameSearchTree <List <uint> >(); // Now we get a similar object as m_typeIndexes but only with the last events foreach (var ind in m_typeIndexes) { foreach (var eve in lastEvents) { if (ind.Key.ToString() == eve.Value.EventName.ToString() && !lastIndexes.Contains(ind)) { lastIndexes.Add(ind); } } } // Now that we have the events of the last tick we can now ask the context var key = Name.BuildName((Name)AMConsts.EVENT, type, subject, def, target); foreach (var c in context.Constraints) { var unifiedSet = lastIndexes.Unify(key, c); foreach (var pair in unifiedSet) { foreach (var id in pair.Item1) { yield return(new DynamicPropertyResult(new ComplexValue(Name.BuildName(id)), new SubstitutionSet(pair.Item2))); } } if (!unifiedSet.Any()) { yield return(new DynamicPropertyResult(new ComplexValue(Name.BuildName(-1)), c)); } } }