示例#1
0
        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));
                }
            }
        }