Example #1
0
        public JsonResult AudienceData(int id, AudienceFilter filter)
        {
            int membersCount = this.searchService.SearchAudience(id, filter);

            this.userService.SaveUserAudienceFilter(new JavaScriptSerializer().Serialize(filter));
            return(this.Json(new AudienceSearchResult {
                Count = membersCount, FilterCode = filter.Code
            }, JsonRequestBehavior.AllowGet));
        }
        public IList <MemberMainInfo> GetAudienceByFilter(int projectId, AudienceFilter filter)
        {
            var vkGroup = this.projectRepository.GetVkGroup(projectId);

            using (IDataGateway dataGateway = this.dataGatewayProvider.GetDataGateway())
            {
                return(dataGateway.Connection.Query <MemberMainInfo, BirthDate, MemberMainInfo>(
                           QueryMemberFilterBuilder.GetString(vkGroup.Id, filter),
                           (member, birthdate) => { member.BirthDate = birthdate; return member; },
                           new { vkgroupid = vkGroup.Id },
                           splitOn: "birthday").ToList());
            }
        }
Example #3
0
        public async Task <TaskSessionsInfo> BizActionAsync(MazeTask inputData)
        {
            var builder = new TaskSessionInfoBuilder(inputData.Id);

            builder.TaskSessionAdded   += BuilderOnTaskSessionAdded;
            builder.TaskExecutionAdded += BuilderOnTaskExecutionAdded;
            builder.TaskResultAdded    += BuilderOnTaskResultAdded;

            var storage = new MemoryTaskResultStorage();

            //trigger locally
            await _management.TriggerNow(inputData, SessionKey.Create("Execute"), storage);

            builder.Add(new TaskSessionsInfo
            {
                Sessions   = storage.Sessions,
                Executions = storage.Executions,
                Results    = storage.CommandResults
            }, TargetId.ServerId);

            //trigger on clients
            var audienceFilter = new AudienceFilter(inputData.Audience);
            var clients        = (await _dbContext.Clients.Select(x => x.ClientId).ToListAsync()).ToHashSet();

            var onlineClients = _connectionManager.ClientConnections.Where(x => clients.Contains(x.Key));

            var tasks = new Dictionary <Task <TaskSessionsInfo>, int>();

            foreach (var onlineClient in onlineClients)
            {
                if (audienceFilter.Invoke(onlineClient.Key))
                {
                    //add all at once because the tasks don't do anything except waiting for the completion source anyways
                    var task = TasksResource.ExecuteTask(inputData, _taskComponentResolver, _xmlSerializerCache, onlineClient.Value);
                    tasks.Add(task, onlineClient.Key);
                }
            }

            while (tasks.Any())
            {
                var task = await Task.WhenAny(tasks.Keys);

                builder.Add(task.Result, new TargetId(tasks[task]));

                tasks.Remove(task);
            }

            return(builder.Build());
        }
Example #4
0
        public int SearchAudience(int projectId, AudienceFilter filter)
        {
            using (this.unitOfWorkProvider.CreateUnitOfWork())
            {
                var vkGroup = this.projectRepository.GetVkGroup(projectId);
                var result  = this.GetFilteringResult(vkGroup, filter.Code, throwException: false);

                if (result != null)
                {
                    return(result.Members.Count);
                }

                result = new AudienceFilteringResult(filter.Code);

                if (filter.IsEmpty)
                {
                    result.IsAllMembers = true;
                }

                result.Members = this.searcher.GetAudienceByFilter(projectId, filter);
                this.cacher.SetToCache(vkGroup.Id, result);
                return(result.Members.Count);
            }
        }
        public static string GetString(int groupId, AudienceFilter filter)
        {
            StringBuilder str = new StringBuilder("SELECT vkmemberid, gender, countryid, cityid, education, birthday, birthmonth, birthyear FROM member WHERE vkgroupid = ");

            str.Append(groupId);

            if (filter.IsEmpty)
            {
                return(str.ToString());
            }

            DateTime now  = DateTime.Now;
            DateTime from = new DateTime(now.Year - filter.MinAge, now.Month, now.Day);
            DateTime to   = new DateTime(now.Year - filter.MaxAge, now.Month, now.Day);

            if (filter.MinAge != 0 || filter.MaxAge != 100)
            {
                if (filter.MaxAge != 100 && filter.MinAge != 0)
                {
                    str.Append(" AND birthyear <= ").Append(from.Year).Append(" AND birthyear >=").Append(to.Year);
                }
                else
                {
                    if (filter.MaxAge != 100)
                    {
                        str.Append(" AND birthyear >= ").Append(to.Year);
                    }
                    else
                    {
                        str.Append(" AND birthyear <= ").Append(from.Year).Append(" AND birthyear <> 0");
                    }
                }
            }

            str.Append(" AND education >= ")
            .Append(filter.MinEducation)
            .Append(" AND education <= ")
            .Append(filter.MaxEducation);

            if (filter.Female && filter.Male)
            {
                str.Append(" AND gender <> 0");
            }
            else
            {
                if (filter.Male)
                {
                    str.Append(" AND gender = ").Append(1);
                }

                if (filter.Female)
                {
                    str.Append(" AND gender = ").Append(2);
                }
            }

            if (filter.Cities != null)
            {
                str.Append(" AND cityid = ANY(array[").Append(filter.Cities).Append("])");
            }

            return(str.ToString());
        }