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()); } }
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()); }
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()); }