Пример #1
0
        public override void PropagateUpdate(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var joinedSets         = JoinedSets(context, facts);
            var aggregation        = new Aggregation();

            foreach (var set in joinedSets)
            {
                if (set.Facts.Count == 0)
                {
                    continue;
                }
                var matchingFacts = set.Facts;
                if (matchingFacts.Count > 0)
                {
                    IFactAggregator aggregator = GetFactAggregator(set.Tuple);
                    if (aggregator != null)
                    {
                        UpdateInAggregate(aggregationContext, aggregator, aggregation, set.Tuple, matchingFacts);
                    }
                    else
                    {
                        var fullSet          = JoinedSet(context, set.Tuple);
                        var allMatchingFacts = fullSet.Facts;
                        aggregator = CreateFactAggregator(fullSet.Tuple);
                        AddToAggregate(aggregationContext, aggregator, aggregation, fullSet.Tuple, allMatchingFacts);
                    }
                }
            }
            PropagateAggregation(context, aggregation);
        }
Пример #2
0
        public override void PropagateUpdate(IExecutionContext context, List <Tuple> tuples)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var joinedSets         = JoinedSets(context, tuples);
            var aggregation        = new Aggregation();

            foreach (var set in joinedSets)
            {
                IFactAggregator aggregator = GetFactAggregator(set.Tuple);
                if (aggregator != null)
                {
                    if (_isSubnetJoin && set.Facts.Count > 0)
                    {
                        //Update already propagated from the right
                        continue;
                    }
                    var matchingFacts = set.Facts;
                    UpdateInAggregate(aggregationContext, aggregator, aggregation, set.Tuple, matchingFacts);
                }
                else
                {
                    var matchingFacts = set.Facts;
                    aggregator = CreateFactAggregator(set.Tuple);
                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, matchingFacts);
                }
            }
            PropagateAggregation(context, aggregation);
        }
Пример #3
0
        public IEnumerable <AggregationResult> Modify(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var collection = (IEnumerable <TElement>)fact.Value;
                foreach (var value in collection)
                {
                    if (_firstElements.TryGetValue(fact, out var oldFirst))
                    {
                        if (Equals(oldFirst, value))
                        {
                            results.Add(AggregationResult.Modified(value, value, Enumerable.Repeat(fact, 1)));
                        }
                        else
                        {
                            results.Add(AggregationResult.Removed(oldFirst));
                            results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                        }
                    }
                    else
                    {
                        results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                    }
                    _firstElements[fact] = value;
                    break;
                }
            }
            return(results);
        }
Пример #4
0
        public override void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var joinedSets         = JoinedSets(context, facts);
            var aggregation        = new Aggregation();

            foreach (var set in joinedSets)
            {
                if (set.Facts.Count == 0)
                {
                    continue;
                }
                var matchingFacts = set.Facts;
                if (matchingFacts.Count > 0)
                {
                    IFactAggregator aggregator = GetFactAggregator(set.Tuple);
                    if (aggregator == null)
                    {
                        aggregator = CreateFactAggregator(set.Tuple);

                        var originalSet           = JoinedSet(context, set.Tuple);
                        var matchingOriginalFacts = originalSet.Facts;
                        AddToAggregate(aggregationContext, aggregator, aggregation, originalSet.Tuple, matchingOriginalFacts);
                    }

                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, matchingFacts);
                }
            }
            PropagateAggregation(context, aggregation);
        }
Пример #5
0
        public override void PropagateRetract(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var aggregation        = new Aggregation();

            using (var counter = PerfCounter.Retract(context, this))
            {
                var joinedSets = JoinedSets(context, facts);
                foreach (var set in joinedSets)
                {
                    if (set.Facts.Count == 0)
                    {
                        continue;
                    }

                    IFactAggregator aggregator = GetFactAggregator(context, set.Tuple);
                    if (aggregator != null)
                    {
                        RetractFromAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                    }
                }

                counter.AddInputs(facts.Count);
                counter.AddOutputs(aggregation.Count);
            }

            PropagateAggregation(context, aggregation);
        }
Пример #6
0
        public override void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var aggregation        = new Aggregation();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, facts);
                foreach (var set in joinedSets)
                {
                    if (set.Facts.Count == 0)
                    {
                        continue;
                    }

                    IFactAggregator aggregator = GetFactAggregator(context, set.Tuple);
                    if (aggregator == null)
                    {
                        aggregator = CreateFactAggregator(context, set.Tuple);

                        var originalSet           = JoinedSet(context, set.Tuple);
                        var matchingOriginalFacts = originalSet.Facts;
                        AddToAggregate(aggregationContext, aggregator, aggregation, originalSet.Tuple, matchingOriginalFacts);
                    }

                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                }

                counter.AddInputs(facts.Count);
                counter.AddOutputs(aggregation.Count);
            }

            PropagateAggregation(context, aggregation);
        }
Пример #7
0
        public IQueryable <Customer> Get()
        {
            ResetDataSource();
            var db = new AggregationContext();

            return(db.Customers);
        }
Пример #8
0
 public GuiHost(List<AControl> controls,
                AggregationContext aggregationContext,
                ITransition transition)
     : base()
 {
     this.controls = controls;
     this.aggregationContext = aggregationContext;
     this.Transition = transition;
     this.ScreenState = ScreenState.Exit;
 }
Пример #9
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])
            {
                CreateSubQuery = true
            });

            if (sequence.SelectQuery.Select.IsDistinct ||
                sequence.SelectQuery.Select.TakeValue != null ||
                sequence.SelectQuery.Select.SkipValue != null ||
                !sequence.SelectQuery.GroupBy.IsEmpty)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (sequence.SelectQuery.OrderBy.Items.Count > 0)
            {
                if (sequence.SelectQuery.Select.TakeValue == null && sequence.SelectQuery.Select.SkipValue == null)
                {
                    sequence.SelectQuery.OrderBy.Items.Clear();
                }
                else
                {
                    sequence = new SubQueryContext(sequence);
                }
            }

            var context = new AggregationContext(buildInfo.Parent, sequence, methodCall);

            var methodName = methodCall.Method.Name.Replace("Async", "");

            var sql = sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray();

            if (sql.Length == 1 && sql[0] is SelectQuery query)
            {
                if (query.Select.Columns.Count == 1)
                {
                    var join = query.OuterApply();
                    context.SelectQuery.From.Tables[0].Joins.Add(join.JoinedTable);
                    sql[0] = query.Select.Columns[0];
                }
            }

            ISqlExpression sqlExpression = new SqlFunction(methodCall.Type, methodName, true, sql);

            if (sqlExpression == null)
            {
                throw new LinqToDBException("Invalid Aggregate function implementation");
            }

            context.Sql        = context.SelectQuery;
            context.FieldIndex = context.SelectQuery.Select.Add(sqlExpression, methodName);

            return(context);
        }
Пример #10
0
        public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var oldValue = _sourceToValue[fact];
                _sourceToValue.Remove(fact);
                results.Add(AggregationResult.Removed(oldValue));
            }
            return(results);
        }
Пример #11
0
        public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var value = _selector.Invoke(context, tuple, fact);
                _sourceToValue[fact] = value;
                results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
            }
            return(results);
        }
Пример #12
0
        public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                if (_firstElements.TryGetValue(fact, out var oldFirst))
                {
                    results.Add(AggregationResult.Removed(oldFirst));
                    _firstElements.Remove(fact);
                }
            }
            return(results);
        }
Пример #13
0
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var joinedSets         = JoinedSets(context, tuples);
            var aggregation        = new Aggregation();

            foreach (var set in joinedSets)
            {
                var             matchingFacts = set.Facts;
                IFactAggregator aggregator    = CreateFactAggregator(set.Tuple);
                AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, matchingFacts);
            }
            PropagateAggregation(context, aggregation);
        }
Пример #14
0
        protected override IParseContext ParseMethodCall(ExpressionParser parser, IParseContext parent, MethodCallExpression methodCall, SqlQuery sqlQuery)
        {
            var sequence = parser.ParseSequence(parent, methodCall.Arguments[0], sqlQuery);

            if (sequence.SqlQuery.Select.IsDistinct || sequence.SqlQuery.Select.TakeValue != null || sequence.SqlQuery.Select.SkipValue != null)
            {
                //sequence.ConvertToIndex(null, 0, ConvertFlags.All);
                sequence = new SubQueryContext(sequence);
            }

            if (sequence.SqlQuery.OrderBy.Items.Count > 0)
            {
                if (sequence.SqlQuery.Select.TakeValue == null && sequence.SqlQuery.Select.SkipValue == null)
                {
                    sequence.SqlQuery.OrderBy.Items.Clear();
                }
                else
                {
                    sequence = new SubQueryContext(sequence);
                }
            }

            if (methodCall.Arguments.Count == 2)
            {
                var lambda  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
                var context = new AggregationContext(sequence, lambda, methodCall.Method.ReturnType);

                context.FieldIndex = context.SqlQuery.Select.Add(
                    new SqlFunction(
                        methodCall.Type,
                        methodCall.Method.Name,
                        parser.ParseExpression(context, context.Lambda.Body.Unwrap())));

                return(context);
            }
            else
            {
                var context = new AggregationContext(sequence, null, methodCall.Method.ReturnType);

                context.FieldIndex = context.SqlQuery.Select.Add(
                    new SqlFunction(
                        methodCall.Type,
                        methodCall.Method.Name,
                        sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray()));

                return(context);
            }
        }
Пример #15
0
 private void RetractFromAggregate(AggregationContext context, IFactAggregator aggregator, Aggregation aggregation, Tuple tuple, List <Fact> facts)
 {
     try
     {
         aggregator.Remove(context, aggregation, tuple, facts);
     }
     catch (ExpressionEvaluationException e)
     {
         if (!e.IsHandled)
         {
             throw new RuleLhsExpressionEvaluationException("Failed to evaluate aggregate expression",
                                                            e.Expression.ToString(), e.InnerException);
         }
         ResetAggregator(aggregation, tuple, aggregator);
     }
 }
Пример #16
0
        public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var collection = (IEnumerable <TElement>)fact.Value;
                foreach (var value in collection)
                {
                    _firstElements[fact] = value;
                    results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                    break;
                }
            }
            return(results);
        }
Пример #17
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall,
                                                         BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            if (sequence.Select.Select.IsDistinct ||
                sequence.Select.Select.TakeValue != null ||
                sequence.Select.Select.SkipValue != null ||
                !sequence.Select.GroupBy.IsEmpty)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (sequence.Select.OrderBy.Items.Count > 0)
            {
                if (sequence.Select.Select.TakeValue == null && sequence.Select.Select.SkipValue == null)
                {
                    sequence.Select.OrderBy.Items.Clear();
                }
                else
                {
                    sequence = new SubQueryContext(sequence);
                }
            }

            var context = new AggregationContext(buildInfo.Parent, sequence, methodCall);
            var sql     = sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray();

            if (sql.Length == 1 && sql[0] is ISelectQuery)
            {
                var query = (ISelectQuery)sql[0];

                if (query.Select.Columns.Count == 1)
                {
                    var join = SelectQuery.OuterApply(query);
                    context.Select.From.Tables.First.Value.Joins.AddLast(join.JoinedTable);
                    sql[0] = query.Select.Columns[0];
                }
            }

            context.Sql        = context.Select;
            context.FieldIndex = context.Select.Select.Add(
                new SqlFunction(methodCall.Type, methodCall.Method.Name, sql));

            return(context);
        }
Пример #18
0
        static async Task Main(string[] args)
        {
            var store = new InMemoryStorage();

            store.Add("123", new User {
                Name = "ABC", Email = "*****@*****.**", Id = "123"
            });
            Console.WriteLine(store.Get <User>("123"));

            var aggregationContext = new AggregationContext(Assembly.GetExecutingAssembly(), store);

            await aggregationContext.SendAsync <User, NameUpdate>(new NameUpdate { Name = "ABCD", Id = "123" });

            Console.WriteLine(store.Get <User>("123"));

            Console.ReadLine();
        }
Пример #19
0
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var aggregation        = new Aggregation();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, tuples);
                foreach (var set in joinedSets)
                {
                    IFactAggregator aggregator = CreateFactAggregator(context, set.Tuple);
                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                }

                counter.AddInputs(tuples.Count);
                counter.AddOutputs(aggregation.Count);
            }

            PropagateAggregation(context, aggregation);
        }
Пример #20
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            if (sequence.SqlQuery != buildInfo.SqlQuery)
            {
                throw new NotImplementedException();
            }

            if (sequence.SqlQuery.Select.IsDistinct ||
                sequence.SqlQuery.Select.TakeValue != null ||
                sequence.SqlQuery.Select.SkipValue != null ||
                !sequence.SqlQuery.GroupBy.IsEmpty)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (sequence.SqlQuery.OrderBy.Items.Count > 0)
            {
                if (sequence.SqlQuery.Select.TakeValue == null && sequence.SqlQuery.Select.SkipValue == null)
                {
                    sequence.SqlQuery.OrderBy.Items.Clear();
                }
                else
                {
                    sequence = new SubQueryContext(sequence);
                }
            }

            //var index = sequence.ConvertToIndex(null, 0, ConvertFlags.Field);

            var context = new AggregationContext(buildInfo.Parent, sequence, null, methodCall.Method.ReturnType);

            context.FieldIndex = context.SqlQuery.Select.Add(
                new SqlFunction(
                    methodCall.Type,
                    methodCall.Method.Name,
                    sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray()));

            return(context);
        }
Пример #21
0
        public override void PropagateRetract(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var joinedSets         = JoinedSets(context, facts);
            var aggregation        = new Aggregation();

            foreach (var set in joinedSets)
            {
                if (set.Facts.Count == 0)
                {
                    continue;
                }
                var matchingFacts = set.Facts;
                if (matchingFacts.Count > 0)
                {
                    IFactAggregator aggregator = GetFactAggregator(set.Tuple);
                    if (aggregator != null)
                    {
                        RetractFromAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                    }
                }
            }
            PropagateAggregation(context, aggregation);
        }
Пример #22
0
 public object Invoke(AggregationContext context, ITuple tuple, IFact fact)
 {
     return(_func((TFact)fact.Value));
 }
 public WebAnalyticsServiceAppWrapper(SPWebApplication webApp)
 {
     aggregationContext = AggregationContext.GetContext(webApp);
 }
 public WebAnalyticsServiceAppWrapper(SPSite site)
 {
     aggregationContext = AggregationContext.GetContext(site);
 }
Пример #25
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])
            {
                CreateSubQuery = true
            });

            if (sequence.SelectQuery.Select.IsDistinct ||
                sequence.SelectQuery.Select.TakeValue != null ||
                sequence.SelectQuery.Select.SkipValue != null ||
                !sequence.SelectQuery.GroupBy.IsEmpty)
            {
                sequence = new SubQueryContext(sequence);
            }

            if (sequence.SelectQuery.OrderBy.Items.Count > 0)
            {
                if (sequence.SelectQuery.Select.TakeValue == null && sequence.SelectQuery.Select.SkipValue == null)
                {
                    sequence.SelectQuery.OrderBy.Items.Clear();
                }
                else
                {
                    sequence = new SubQueryContext(sequence);
                }
            }

            var context = new AggregationContext(buildInfo.Parent, sequence, methodCall);
            var attr    = GetAggregateDefinition(methodCall, builder.MappingSchema);

            ISqlExpression sqlExpression = null;

            if (attr != null)
            {
                sqlExpression = attr.GetExpression(builder.MappingSchema, sequence.SelectQuery, methodCall, e =>
                {
                    var ex = e.Unwrap();

                    var l = ex as LambdaExpression;
                    if (l != null)
                    {
                        var p   = sequence.Parent;
                        var ctx = new ExpressionContext(buildInfo.Parent, sequence, l);

                        var res = builder.ConvertToSql(ctx, l.Body, true);

                        builder.ReplaceParent(ctx, p);
                        return(res);
                    }
                    return(builder.ConvertToSql(context, ex, true));
                });
            }

            if (sqlExpression == null)
            {
                var sql = sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray();

                if (sql.Length == 1 && sql[0] is SelectQuery)
                {
                    var query = (SelectQuery)sql[0];

                    if (query.Select.Columns.Count == 1)
                    {
                        var join = query.OuterApply();
                        context.SelectQuery.From.Tables[0].Joins.Add(join.JoinedTable);
                        sql[0] = query.Select.Columns[0];
                    }
                }

                if (attr != null)
                {
                    sqlExpression = attr.GetExpression(methodCall.Method, sql);
                }
                else
                {
                    sqlExpression = new SqlFunction(methodCall.Type, methodCall.Method.Name, true, sql);
                }
            }

            if (sqlExpression == null)
            {
                throw new LinqToDBException("Invalid Aggregate function implementation");
            }

            context.Sql        = context.SelectQuery;
            context.FieldIndex = context.SelectQuery.Select.Add(sqlExpression, methodCall.Method.Name);

            return(context);
        }
Пример #26
0
        public void Remove(AggregationContext context, Aggregation aggregation, Tuple tuple, IEnumerable <Fact> facts)
        {
            var results = _aggregator.Remove(context, tuple, facts);

            AddAggregationResult(aggregation, tuple, results);
        }