public VEVENT RandomlyAttend(VEVENT @event, IEnumerable<ATTENDEE> attendees) { var max = attendees.Count(); var atts = attendees as IList<ATTENDEE> ?? attendees.ToList(); @event.Attendees.AddRange(Pick<ATTENDEE> .UniqueRandomList(With.Between(1, max)).From(atts)); return @event; }
public void Post(PatchEvents request) { try { var source = new VEVENT { Start = request.Start, Classification = request.Classification, Description = request.Description, GeoPosition = request.Position, Location = request.Location, Organizer = request.Organizer, Priority = request.Priority, Sequence = request.Sequence, Status = request.Status, Summary = request.Summary, Transparency = request.Transparency, Url = request.Url, RecurrenceRule = request.RecurrenceRule, End = request.End, Duration = request.Duration, Attachments = request.Attachments, Attendees = request.Attendees, Categories = request.Categories, Comments = request.Comments, Contacts = request.Contacts, ExceptionDates = request.ExceptionDates, RequestStatuses = request.RequestStatuses, Resources = request.Resources, RelatedTos = request.RelatedTos, Alarms = request.Alarms, }; var fields = new List<string>(); if (source.Start != default(DATE_TIME)) fields.Add("Start"); if (source.Classification != default(CLASS)) fields.Add("Classification"); if (source.Description != null) fields.Add("Description"); if (source.GeoPosition != default(GEO)) fields.Add("Position"); if (source.Location != null) fields.Add("Location"); if (source.Organizer != null) fields.Add("Organizer"); if (source.Priority != default(PRIORITY)) fields.Add("Priority"); if (source.Sequence != default(int)) fields.Add("Sequence"); if (source.Status != default(STATUS)) fields.Add("Status"); if (source.Summary != null) fields.Add("Summary"); if (source.Transparency != default(TRANSP)) fields.Add("Transparency"); if (source.Url != default(URL)) fields.Add("Url"); if (source.RecurrenceRule != null) fields.Add("RecurrenceRule"); if (source.End != default(DATE_TIME)) fields.Add("End"); if (source.Duration != default(DURATION)) fields.Add("Duration"); if (source.Categories != null) fields.Add("Categories"); if (source.Attachments != null) fields.Add("Attachments"); if (source.Attendees != null) fields.Add("Attendees"); if (source.Comments != null) fields.Add("Comments"); if (source.Contacts != null) fields.Add("Contacts"); if (source.ExceptionDates != null) fields.Add("ExceptionDates"); if (source.RequestStatuses != null) fields.Add("RequestStatuses"); if (source.Resources != null) fields.Add("Resources"); if (source.RelatedTos != null) fields.Add("RelatedTos"); if (source.Alarms != null) fields.Add("Alarms"); eventRepository.Patch(source, fields, request.EventIds); var cacheKey = keyBuilder.Build(request, x => x.EventIds).ToString(); RequestContext.RemoveFromCache(Cache, cacheKey); } catch (InvalidOperationException ex) { logger.Error(ex.ToString()); throw; } catch (ApplicationException ex) { logger.Error(ex.ToString()); throw; } catch (Exception ex) { logger.Error(ex.ToString()); throw; } }
public VEVENT Hydrate(VEVENT dry) { using (var db = factory.OpenDbConnection()) { var organizers = db.Select<ORGANIZER, VEVENT, REL_EVENTS_ORGANIZERS>( r => r.OrganizerId, r => r.EventId, e => e.Id == dry.Id); if (!organizers.NullOrEmpty()) dry.Organizer = organizers.First(); var recurs = db.Select<RECUR, VEVENT, REL_EVENTS_RECURS>( r => r.RecurId, r => r.EventId, e => e.Id == dry.Id); if (!recurs.NullOrEmpty()) dry.RecurrenceRule = recurs.First(); var attachbins = db.Select<ATTACH_BINARY, VEVENT, REL_EVENTS_ATTACHBINS>( r => r.AttachmentId, r => r.EventId, e => e.Id == dry.Id); if (!attachbins.NullOrEmpty()) dry.Attachments.MergeRange(attachbins); var attachuris = db.Select<ATTACH_URI, VEVENT, REL_EVENTS_ATTACHURIS>( r => r.AttachmentId, r => r.EventId, e => e.Id == dry.Id); if (!attachuris.NullOrEmpty()) dry.Attachments.MergeRange(attachuris); var attendees = db.Select<ATTENDEE, VEVENT, REL_EVENTS_ATTENDEES>( r => r.AttendeeId, r => r.EventId, e => e.Id == dry.Id); if (!attendees.NullOrEmpty()) dry.Attendees.MergeRange(attendees); var comments = db.Select<COMMENT, VEVENT, REL_EVENTS_COMMENTS>( r => r.CommentId, r => r.EventId, e => e.Id == dry.Id); if (!comments.NullOrEmpty()) dry.Comments.MergeRange(comments); var contacts = db.Select<CONTACT, VEVENT, REL_EVENTS_CONTACTS>( r => r.ContactId, r => r.EventId, e => e.Id == dry.Id); if (!contacts.NullOrEmpty()) dry.Contacts.MergeRange(contacts); var rdates = db.Select<RDATE, VEVENT, REL_EVENTS_RDATES>( r => r.RecurrenceDateId, r => r.EventId, e => e.Id == dry.Id); if (!rdates.NullOrEmpty()) dry.RecurrenceDates.MergeRange(rdates); var exdates = db.Select<EXDATE, VEVENT, REL_EVENTS_EXDATES>( r => r.ExceptionDateId, r => r.EventId, e => e.Id == dry.Id); if (!exdates.NullOrEmpty()) dry.ExceptionDates.MergeRange(exdates); var relatedtos = db.Select<RELATEDTO, VEVENT, REL_EVENTS_RELATEDTOS>( r => r.RelatedToId, r => r.EventId, e => e.Id == dry.Id); dry.RelatedTos.MergeRange(relatedtos); var reqstats = db.Select<REQUEST_STATUS, VEVENT, REL_EVENTS_REQSTATS>( r => r.ReqStatsId, r => r.EventId, e => e.Id == dry.Id); dry.RequestStatuses.MergeRange(reqstats); var resources = db.Select<RESOURCES, VEVENT, REL_EVENTS_RESOURCES>( r => r.ResourcesId, r => r.EventId, e => e.Id == dry.Id); if (!resources.NullOrEmpty()) dry.Resources.MergeRange(resources); var raalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => q.EventId == dry.Id); if (!raalarms.NullOrEmpty()) { dry.Alarms.MergeRange(aalarmrepository.FindAll(raalarms.Select(x => x.AlarmId).ToList())); } var rdalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => q.EventId == dry.Id); if (!rdalarms.NullOrEmpty()) { dry.Alarms.MergeRange(dalarmrepository.FindAll(rdalarms.Select(x => x.AlarmId).ToList())); } var realarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => q.EventId == dry.Id); if (!realarms.NullOrEmpty()) { dry.Alarms.MergeRange(ealarmrepository.FindAll(realarms.Select(x => x.AlarmId).ToList())); } } return dry; }
public void Save(VEVENT entity) { #region retrieve attributes of entity var organizer = entity.Organizer; var recur = entity.RecurrenceRule; var attendees = entity.Attendees; var attachbins = entity.Attachments.OfType<ATTACH_BINARY>().ToList(); var attachuris = entity.Attachments.OfType<ATTACH_URI>().ToList(); var contacts = entity.Contacts; var comments = entity.Comments; var rdates = entity.RecurrenceDates; var exdates = entity.ExceptionDates; var relateds = entity.RelatedTos; var resources = entity.Resources; var reqstats = entity.RequestStatuses; var aalarms = entity.Alarms.OfType<AUDIO_ALARM>().ToList(); var dalarms = entity.Alarms.OfType<DISPLAY_ALARM>().ToList(); var ealarms = entity.Alarms.OfType<EMAIL_ALARM>().ToList(); #endregion retrieve attributes of entity #region save event and its attributes using (var db = factory.OpenDbConnection()) { db.Save(entity); var ororgs = db.Select<REL_EVENTS_ORGANIZERS>(q => q.EventId == entity.Id); var orrecurs = db.Select<REL_EVENTS_RECURS>(q => q.EventId == entity.Id); var orattendees = db.Select<REL_EVENTS_ATTENDEES>(q => q.EventId == entity.Id); var orattachbins = db.Select<REL_EVENTS_ATTACHBINS>(q => q.EventId == entity.Id); var orattachuris = db.Select<REL_EVENTS_ATTACHURIS>(q => q.EventId == entity.Id); var orcontacts = db.Select<REL_EVENTS_CONTACTS>(q => q.EventId == entity.Id); var orcomments = db.Select<REL_EVENTS_COMMENTS>(q => q.EventId == entity.Id); var orrdates = db.Select<REL_EVENTS_RDATES>(q => q.EventId == entity.Id); var orexdates = db.Select<REL_EVENTS_EXDATES>(q => q.EventId == entity.Id); var orrelateds = db.Select<REL_EVENTS_RELATEDTOS>(q => q.EventId == entity.Id); var orresources = db.Select<REL_EVENTS_RESOURCES>(q => q.EventId == entity.Id); var orreqstats = db.Select<REL_EVENTS_REQSTATS>(q => q.EventId == entity.Id); var oraalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => q.EventId == entity.Id); var ordalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => q.EventId == entity.Id); var orealarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => q.EventId == entity.Id); if (organizer != null) { db.Save(organizer); var rorg = new REL_EVENTS_ORGANIZERS { Id = keygenerator.GetNext(), EventId = entity.Id, OrganizerId = organizer.Id }; db.MergeAll<REL_EVENTS_ORGANIZERS, Guid>(rorg.ToSingleton(), ororgs); } else db.RemoveAll<REL_EVENTS_ORGANIZERS, Guid>(ororgs); if (recur != null) { db.Save(recur); var rrecur = new REL_EVENTS_RECURS { Id = keygenerator.GetNext(), EventId = entity.Id, RecurId = recur.Id }; db.MergeAll<REL_EVENTS_RECURS, Guid>(rrecur.ToSingleton(), orrecurs); } else db.RemoveAll<REL_EVENTS_RECURS, Guid>(orrecurs); if (!attendees.NullOrEmpty()) { db.SaveAll(attendees.Distinct()); var rattendees = attendees.Select(x => new REL_EVENTS_ATTENDEES { Id = keygenerator.GetNext(), EventId = entity.Id, AttendeeId = x.Id }); db.MergeAll<REL_EVENTS_ATTENDEES, Guid>(rattendees, orattendees); } else db.RemoveAll<REL_EVENTS_ATTENDEES, Guid>(orattendees); if (!attachbins.NullOrEmpty()) { db.SaveAll(attachbins.Distinct()); var rattachbins = attachbins.Select(x => new REL_EVENTS_ATTACHBINS { Id = keygenerator.GetNext(), EventId = entity.Id, AttachmentId = x.Id }); db.MergeAll<REL_EVENTS_ATTACHBINS, Guid>(rattachbins, orattachbins); } else db.RemoveAll<REL_EVENTS_ATTACHBINS, Guid>(orattachbins); if (!attachuris.NullOrEmpty()) { db.SaveAll(attachuris.Distinct()); var rattachuris = attachuris.Select(x => new REL_EVENTS_ATTACHURIS { Id = keygenerator.GetNext(), EventId = entity.Id, AttachmentId = x.Id }); db.MergeAll(rattachuris, orattachuris); } else db.RemoveAll(orattachuris); if (!contacts.NullOrEmpty()) { db.SaveAll(contacts.Distinct()); var rcontacts = contacts.Select(x => new REL_EVENTS_CONTACTS { Id = keygenerator.GetNext(), EventId = entity.Id, ContactId = x.Id }); db.MergeAll(rcontacts, orcontacts); } else db.RemoveAll(orcontacts); if (!comments.NullOrEmpty()) { db.SaveAll(comments.Distinct()); var rcomments = comments.Select(x => new REL_EVENTS_COMMENTS { Id = keygenerator.GetNext(), EventId = entity.Id, CommentId = x.Id }); db.MergeAll(rcomments, orcomments); } else db.RemoveAll(orcomments); if (!rdates.NullOrEmpty()) { db.SaveAll(rdates.Distinct()); var rrdates = rdates.Select(x => new REL_EVENTS_RDATES { Id = keygenerator.GetNext(), EventId = entity.Id, RecurrenceDateId = x.Id }); db.MergeAll(rrdates, orrdates); } else db.RemoveAll(orrdates); if (!exdates.NullOrEmpty()) { db.SaveAll(exdates.Distinct()); var rexdates = exdates.Select(x => new REL_EVENTS_EXDATES { Id = keygenerator.GetNext(), EventId = entity.Id, ExceptionDateId = x.Id }); db.MergeAll(rexdates, orexdates); } else db.RemoveAll(orexdates); if (!relateds.NullOrEmpty()) { db.SaveAll(relateds.Distinct()); var rrelateds = relateds.Select(x => new REL_EVENTS_RELATEDTOS { Id = keygenerator.GetNext(), EventId = entity.Id, RelatedToId = x.Id }); db.MergeAll(rrelateds, orrelateds); } else db.RemoveAll(orrelateds); if (!resources.NullOrEmpty()) { db.SaveAll(resources.Distinct()); var rresources = resources.Select(x => new REL_EVENTS_RESOURCES { Id = keygenerator.GetNext(), EventId = entity.Id, ResourcesId = x.Id }); db.MergeAll(rresources, orresources); } else db.RemoveAll(orresources); if (!reqstats.NullOrEmpty()) { db.SaveAll(reqstats.Distinct()); var rreqstats = reqstats.Select(x => new REL_EVENTS_REQSTATS { Id = keygenerator.GetNext(), EventId = entity.Id, ReqStatsId = x.Id }); db.MergeAll(rreqstats, orreqstats); } else db.RemoveAll(orreqstats); if (!aalarms.NullOrEmpty()) { aalarmrepository.SaveAll(aalarms.Distinct()); var raalarms = aalarms.Select(x => new REL_EVENTS_AUDIO_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); db.MergeAll(raalarms, oraalarms); } else db.RemoveAll(orealarms); if (!dalarms.NullOrEmpty()) { dalarmrepository.SaveAll(dalarms.Distinct()); var rdalarms = dalarms.Select(x => new REL_EVENTS_DISPLAY_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); db.MergeAll(rdalarms, ordalarms); } else db.RemoveAll(ordalarms); if (!ealarms.NullOrEmpty()) { ealarmrepository.SaveAll(ealarms.Distinct()); var realarms = ealarms.Select(x => new REL_EVENTS_EMAIL_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); db.MergeAll(realarms, orealarms); } else db.RemoveAll(orealarms); } #endregion save event and its attributes }
public void Patch(VEVENT source, IEnumerable<string> fields, IEnumerable<Guid> keys = null) { #region construct anonymous fields using expression lambdas Expression<Func<VEVENT, object>> primitives = x => new { x.Uid, x.Start, x.Created, x.Description, x.Classification, Position = x.GeoPosition, x.LastModified, x.Location, x.Priority, x.Sequence, x.Status, x.Summary, x.Transparency, x.Url, x.End, x.Categories, x.Duration, x.RecurrenceRule }; Expression<Func<VEVENT, object>> relations = x => new { x.Attendees, x.Attachments, x.Contacts, x.Comments, x.RecurrenceDates, x.ExceptionDates, x.RelatedTos, x.Resources, x.RequestStatuses, x.Alarms, x.Organizer, x.RecurrenceId, }; //4. Get list of selected relationals var selection = fields as IList<string> ?? fields.ToList(); var srelation = relations.GetMemberNames().Intersect(selection, StringComparer.OrdinalIgnoreCase); //5. Get list of selected primitives var sprimitives = primitives.GetMemberNames().Intersect(selection, StringComparer.OrdinalIgnoreCase); #endregion construct anonymous fields using expression lambdas using (var db = factory.OpenDbConnection()) { var okeys = (keys != null) ? db.SelectParam<VEVENT, Guid>(q => q.Id, p => Sql.In(p.Id, keys.ToArray())).ToArray() : db.SelectParam<VEVENT, Guid>(q => q.Id).ToArray(); if (!srelation.NullOrEmpty()) { Expression<Func<VEVENT, object>> orgexpr = y => y.Organizer; Expression<Func<VEVENT, object>> recurexpr = y => y.RecurrenceRule; Expression<Func<VEVENT, object>> attendsexpr = y => y.Attendees; Expression<Func<VEVENT, object>> attachsexpr = y => y.Attachments; Expression<Func<VEVENT, object>> contactsexpr = y => y.Contacts; Expression<Func<VEVENT, object>> commentsexpr = y => y.Comments; Expression<Func<VEVENT, object>> rdatesexpr = y => y.RecurrenceDates; Expression<Func<VEVENT, object>> exdatesexpr = y => y.ExceptionDates; Expression<Func<VEVENT, object>> relatedtosexpr = y => y.RelatedTos; Expression<Func<VEVENT, object>> resourcesexpr = y => y.Resources; Expression<Func<VEVENT, object>> reqstatsexpr = y => y.RequestStatuses; Expression<Func<VEVENT, object>> alarmsexpr = y => y.Alarms; #region save relational attributes of entities if (selection.Contains(orgexpr.GetMemberName())) { var ororgs = db.Select<REL_EVENTS_ORGANIZERS>(q => Sql.In(q.EventId, okeys)); if (source.Organizer != null) { db.Save(source.Organizer); var rorgs = okeys.Select(x => new REL_EVENTS_ORGANIZERS { Id = keygenerator.GetNext(), EventId = x, OrganizerId = source.Organizer.Id }); db.RemoveAll(ororgs); db.SaveAll(rorgs); } else db.RemoveAll(ororgs); } if (selection.Contains(recurexpr.GetMemberName())) { var orrecurs = db.Select<REL_EVENTS_RECURS>(q => Sql.In(q.EventId, okeys)); if (source.RecurrenceRule != null) { db.Save(source.RecurrenceRule); var rrecurs = okeys.Select(x => new REL_EVENTS_RECURS { Id = keygenerator.GetNext(), EventId = x, RecurId = source.RecurrenceRule.Id }); db.RemoveAll(orrecurs); db.SaveAll(rrecurs); } else db.RemoveAll(orrecurs); } if (selection.Contains(attendsexpr.GetMemberName())) { var orattendees = db.Select<REL_EVENTS_ATTENDEES>(q => Sql.In(q.EventId, okeys)); if (!source.Attendees.NullOrEmpty()) { db.SaveAll(source.Attendees.Distinct()); var rattendees = okeys.SelectMany(x => source.Attendees.Select(y => new REL_EVENTS_ATTENDEES { Id = keygenerator.GetNext(), EventId = x, AttendeeId = y.Id })); db.RemoveAll(orattendees); db.SaveAll(rattendees); } db.RemoveAll(orattendees); } if (selection.Contains(attachsexpr.GetMemberName())) { var attachbins = source.Attachments.OfType<ATTACH_BINARY>(); var attachuris = source.Attachments.OfType<ATTACH_URI>(); var orattachbins = db.Select<REL_EVENTS_ATTACHBINS>(q => Sql.In(q.EventId, okeys)); if (attachbins.Any()) { db.SaveAll(attachbins); var rattachbins = okeys.SelectMany(x => attachbins.Select(y => new REL_EVENTS_ATTACHBINS { Id = keygenerator.GetNext(), EventId = x, AttachmentId = y.Id })); db.RemoveAll(orattachbins); db.SaveAll(rattachbins); } else db.RemoveAll(orattachbins); var orattachuris = db.Select<REL_EVENTS_ATTACHURIS>(q => Sql.In(q.EventId, okeys)); if (attachuris.Any()) { db.SaveAll(attachuris); var rattachuris = okeys.SelectMany(x => attachuris.Select(y => new REL_EVENTS_ATTACHURIS { Id = keygenerator.GetNext(), EventId = x, AttachmentId = y.Id })); db.RemoveAll(orattachuris); db.SaveAll(rattachuris); } else db.RemoveAll(orattachuris); } if (selection.Contains(contactsexpr.GetMemberName())) { var orcontacts = db.Select<REL_EVENTS_CONTACTS>(q => Sql.In(q.EventId, okeys)); if (!source.Contacts.NullOrEmpty()) { db.SaveAll(source.Contacts.Distinct()); var rcontacts = okeys.SelectMany(x => source.Contacts.Select(y => new REL_EVENTS_CONTACTS { Id = keygenerator.GetNext(), EventId = x, ContactId = y.Id })); db.RemoveAll(orcontacts); db.SaveAll(rcontacts); } else db.RemoveAll(orcontacts); } if (selection.Contains(commentsexpr.GetMemberName())) { var orcomments = db.Select<REL_EVENTS_COMMENTS>(q => Sql.In(q.EventId, okeys)); if (!source.Comments.NullOrEmpty()) { db.SaveAll(source.Comments.Distinct()); var rcomments = okeys.SelectMany(x => source.Comments.Select(y => new REL_EVENTS_COMMENTS { Id = keygenerator.GetNext(), EventId = x, CommentId = y.Id })); db.RemoveAll(orcomments); db.SaveAll(rcomments); } else db.RemoveAll(orcomments); } if (selection.Contains(rdatesexpr.GetMemberName())) { var orrdates = db.Select<REL_EVENTS_RDATES>(q => Sql.In(q.EventId, okeys)); if (!source.RecurrenceDates.NullOrEmpty()) { db.SaveAll(source.RecurrenceDates.Distinct()); var rrdates = okeys.SelectMany(x => source.RecurrenceDates.Select(y => new REL_EVENTS_RDATES { Id = keygenerator.GetNext(), EventId = x, RecurrenceDateId = y.Id })); db.RemoveAll(orrdates); db.SaveAll(rrdates); } else db.RemoveAll(orrdates); } if (selection.Contains(exdatesexpr.GetMemberName())) { var orexdates = db.Select<REL_EVENTS_EXDATES>(q => Sql.In(q.EventId, okeys)); if (!source.ExceptionDates.NullOrEmpty()) { db.SaveAll(source.ExceptionDates.Distinct()); var rexdates = okeys.SelectMany(x => source.ExceptionDates.Select(y => new REL_EVENTS_EXDATES { Id = keygenerator.GetNext(), EventId = x, ExceptionDateId = y.Id })); db.RemoveAll(orexdates); db.SaveAll(rexdates); } else db.RemoveAll(orexdates); } if (selection.Contains(relatedtosexpr.GetMemberName())) { var orrelatedtos = db.Select<REL_EVENTS_RELATEDTOS>(q => Sql.In(q.EventId, okeys)); if (!source.RelatedTos.NullOrEmpty()) { db.SaveAll(source.RelatedTos.Distinct()); var rrelatedtos = okeys.SelectMany(x => source.RelatedTos.Select(y => new REL_EVENTS_RELATEDTOS { Id = keygenerator.GetNext(), EventId = x, RelatedToId = y.Id })); db.RemoveAll(orrelatedtos); db.SaveAll(rrelatedtos); } else db.RemoveAll(orrelatedtos); } if (selection.Contains(resourcesexpr.GetMemberName())) { var orresources = db.Select<REL_EVENTS_RESOURCES>(q => Sql.In(q.EventId, okeys)); if (!source.Resources.NullOrEmpty()) { db.SaveAll(source.Resources.Distinct()); var rresources = okeys.SelectMany(x => source.Resources.Select(y => new REL_EVENTS_RESOURCES { Id = keygenerator.GetNext(), EventId = x, ResourcesId = y.Id })); db.RemoveAll(orresources); db.SaveAll(rresources); } else db.RemoveAll(orresources); } if (selection.Contains(reqstatsexpr.GetMemberName())) { var orreqstats = db.Select<REL_EVENTS_REQSTATS>(q => Sql.In(q.EventId, okeys)); if (!source.RequestStatuses.NullOrEmpty()) { db.SaveAll(source.RequestStatuses.Distinct()); var rreqstats = okeys.SelectMany(x => source.RequestStatuses.Select(y => new REL_EVENTS_REQSTATS { Id = keygenerator.GetNext(), EventId = x, ReqStatsId = y.Id })); db.RemoveAll(orreqstats); db.SaveAll(rreqstats); } else db.RemoveAll(orreqstats); } if (selection.Contains(alarmsexpr.GetMemberName())) { var aalarms = source.Alarms.OfType<AUDIO_ALARM>(); var ealarms = source.Alarms.OfType<EMAIL_ALARM>(); var dalarms = source.Alarms.OfType<DISPLAY_ALARM>(); var oraalarms = db.Select<REL_EVENTS_AUDIO_ALARMS>(q => Sql.In(q.EventId, okeys)); if (aalarms.Any()) { aalarmrepository.SaveAll(aalarms); var raalarms = okeys.SelectMany(x => source.Alarms.Select(y => new REL_EVENTS_AUDIO_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); db.RemoveAll(oraalarms); db.SaveAll(raalarms); } else db.RemoveAll(oraalarms); var ordalarms = db.Select<REL_EVENTS_DISPLAY_ALARMS>(q => Sql.In(q.EventId, okeys)); if (dalarms.Any()) { dalarmrepository.SaveAll(dalarms); var rdalarms = okeys.SelectMany(x => dalarms.Select(y => new REL_EVENTS_DISPLAY_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); db.RemoveAll(ordalarms); db.SaveAll(rdalarms); } else db.RemoveAll(ordalarms); var orealarms = db.Select<REL_EVENTS_EMAIL_ALARMS>(q => Sql.In(q.EventId, okeys)); if (ealarms.Any()) { ealarmrepository.SaveAll(ealarms); var realarms = okeys.SelectMany(x => ealarms.Select(y => new REL_EVENTS_EMAIL_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); db.RemoveAll(orealarms); db.SaveAll(realarms); } else db.RemoveAll(orealarms); } #endregion save relational attributes of entities } var sprimitivelist = sprimitives as IList<string> ?? sprimitives.ToList(); if (!sprimitivelist.NullOrEmpty()) { var patchstr = $"f => new {{ {string.Join(", ", sprimitivelist.Select(x => $"f.{x}"))} }}"; var patchexpr = patchstr.CompileToExpressionFunc<VEVENT, object>( CodeDomLanguage.csharp, "System.dll", "System.Core.dll", typeof(CalendarWriter).Assembly.Location, typeof(VEVENT).Assembly.Location, typeof(IContainsKey<Guid>).Assembly.Location); if (!okeys.NullOrEmpty()) db.UpdateOnly(source, patchexpr, q => Sql.In(q.Id, okeys.ToArray())); else db.UpdateOnly(source, patchexpr); } } }
public VEVENT Dehydrate(VEVENT @event) { if (@event.Organizer != null) @event.Organizer = null; if (@event.RecurrenceRule != null) @event.RecurrenceRule = null; if (@event.Attendees.Any()) @event.Attendees.Clear(); if (@event.Attachments.Any()) @event.Attachments.Clear(); if (@event.Contacts.Any()) @event.Contacts.Clear(); if (@event.Comments.Any()) @event.Comments.Clear(); if (@event.RecurrenceDates.Any()) @event.RecurrenceDates.Clear(); if (@event.ExceptionDates.Any()) @event.ExceptionDates.Clear(); if (@event.RelatedTos.Any()) @event.RelatedTos.Clear(); if (@event.RequestStatuses.Any()) @event.RequestStatuses.Clear(); if (@event.Resources.Any()) @event.Resources.Clear(); if (@event.Alarms.Any()) @event.Alarms.Clear(); return @event; }
public VEVENT Hydrate(VEVENT dry) { if (dry != null) { var rrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => x.EventId == dry.Id).ToList(); if (!rrecurs.NullOrEmpty()) { dry.RecurrenceRule = redis.As<RECUR>().GetById(rrecurs.FirstOrDefault().RecurId); } var rorgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => x.EventId == dry.Id); if (!rorgs.NullOrEmpty()) { dry.Organizer = redis.As<ORGANIZER>().GetById(rorgs.FirstOrDefault().OrganizerId); } var rattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => x.EventId == dry.Id); if (!rattachbins.NullOrEmpty()) { dry.Attachments.MergeRange(redis.As<ATTACH_BINARY>().GetByIds(rattachbins.Select(x => x.AttachmentId).ToList())); } var rattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => x.EventId == dry.Id); if (!rattachuris.NullOrEmpty()) { dry.Attachments.MergeRange(redis.As<ATTACH_URI>().GetByIds(rattachuris.Select(x => x.AttachmentId).ToList())); } var rattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => x.EventId == dry.Id); if (!rattendees.NullOrEmpty()) { dry.Attendees.MergeRange(redis.As<ATTENDEE>().GetByIds(rattendees.Select(x => x.AttendeeId).ToList())); } var rcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => x.EventId == dry.Id); if (!rcomments.NullOrEmpty()) { dry.Comments.MergeRange(redis.As<COMMENT>().GetByIds(rcomments.Select(x => x.CommentId).ToList())); } var rcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => x.EventId == dry.Id); if (!rcontacts.NullOrEmpty()) { dry.Contacts.MergeRange(redis.As<CONTACT>().GetByIds(rcontacts.Select(x => x.ContactId).ToList())); } var rrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => x.EventId == dry.Id); if (!rrdates.NullOrEmpty()) { dry.RecurrenceDates.MergeRange(redis.As<RDATE>().GetByIds(rrdates.Select(x => x.RecurrenceDateId).ToList())); } var rexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => x.EventId == dry.Id); if (!rexdates.NullOrEmpty()) { dry.ExceptionDates.MergeRange(redis.As<EXDATE>().GetByIds(rexdates.Select(x => x.ExceptionDateId).ToList())); } var rrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => x.EventId == dry.Id); if (!rrelatedtos.NullOrEmpty()) { dry.RelatedTos.MergeRange(redis.As<RELATEDTO>().GetByIds(rrelatedtos.Select(x => x.RelatedToId).ToList())); } var rreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => x.EventId == dry.Id); if (!rreqstats.NullOrEmpty()) { dry.RequestStatuses.MergeRange(redis.As<REQUEST_STATUS>().GetByIds(rreqstats.Select(x => x.ReqStatsId).ToList())); } var rresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => x.EventId == dry.Id); if (!rresources.NullOrEmpty()) { dry.Resources.MergeRange(redis.As<RESOURCES>().GetByIds(rresources.Select(x => x.ResourcesId).ToList())); } var raalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => x.EventId == dry.Id); if (!raalarms.NullOrEmpty()) { dry.Alarms.MergeRange(aalarmrepository.FindAll(raalarms.Select(x => x.AlarmId).ToList())); } var rdalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => x.EventId == dry.Id); if (!rdalarms.NullOrEmpty()) { dry.Alarms.MergeRange(dalarmrepository.FindAll(rdalarms.Select(x => x.AlarmId).ToList())); } var realarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => x.EventId == dry.Id); if (!realarms.NullOrEmpty()) { dry.Alarms.MergeRange(ealarmrepository .HydrateAll(ealarmrepository.FindAll(realarms.Select(x => x.AlarmId).ToList()))); } //TODO: retrieve IANA and x- properties of events during hydration } return dry ?? dry; }
public void Save(VEVENT entity) { var keys = redis.As<VEVENT>().GetAllKeys().ToArray(); var guids = keys.Select(x => new Guid(x)); if (!keys.NullOrEmpty()) { redis.Watch(keys); } #region retrieve attributes of event var recur = entity.RecurrenceRule; var organizer = entity.Organizer; var attendees = entity.Attendees; var attachbins = entity.Attachments.OfType<ATTACH_BINARY>(); var attachuris = entity.Attachments.OfType<ATTACH_URI>(); var contacts = entity.Contacts; var comments = entity.Comments; var rdates = entity.RecurrenceDates; var exdates = entity.ExceptionDates; var relatedtos = entity.RelatedTos; var resources = entity.Resources; var reqstats = entity.RequestStatuses; var aalarms = entity.Alarms.OfType<AUDIO_ALARM>(); var dalarms = entity.Alarms.OfType<DISPLAY_ALARM>(); var ealarms = entity.Alarms.OfType<EMAIL_ALARM>(); #endregion retrieve attributes of event manager.ExecTrans(transaction => { var orrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => x.EventId == entity.Id); var ororgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => x.EventId == entity.Id); var orattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => x.EventId == entity.Id); var orattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => x.EventId == entity.Id); var orattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => x.EventId == entity.Id); var orcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => x.EventId == entity.Id); var orcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => x.EventId == entity.Id); var orrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => x.EventId == entity.Id); var orexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => x.EventId == entity.Id); var orrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => x.EventId == entity.Id); var orresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => x.EventId == entity.Id); var orreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => x.EventId == entity.Id); var oraalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => x.EventId == entity.Id); var ordalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => x.EventId == entity.Id); var orealarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => x.EventId == entity.Id); if (organizer != null) { transaction.QueueCommand(x => x.Store(organizer)); var rorganizer = new REL_EVENTS_ORGANIZERS { Id = keygenerator.GetNext(), EventId = entity.Id, OrganizerId = organizer.Id, }; redis.MergeAll(rorganizer.ToSingleton(), ororgs, transaction); } else redis.RemoveAll(ororgs, transaction); if (recur != null) { transaction.QueueCommand(x => x.Store(recur)); var rrecur = new REL_EVENTS_RECURS { Id = keygenerator.GetNext(), EventId = entity.Id, RecurId = recur.Id, }; redis.MergeAll(rrecur.ToSingleton(), orrecurs, transaction); } else redis.RemoveAll(orrecurs, transaction); if (!attendees.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(attendees)); var rattendees = attendees.Select(x => new REL_EVENTS_ATTENDEES { Id = keygenerator.GetNext(), EventId = entity.Id, AttendeeId = x.Id, }); redis.MergeAll(rattendees, orattendees, transaction); } else redis.RemoveAll(orattendees, transaction); if (!attachbins.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(attachbins.Distinct())); var rattachbins = attachbins.Select(x => new REL_EVENTS_ATTACHBINS { Id = keygenerator.GetNext(), EventId = entity.Id, AttachmentId = x.Id, }); redis.MergeAll(rattachbins, orattachbins, transaction); } else redis.RemoveAll(orattachbins, transaction); if (!attachuris.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(attachuris.Distinct())); var rattachuris = attachuris.Select(x => new REL_EVENTS_ATTACHURIS { Id = keygenerator.GetNext(), EventId = entity.Id, AttachmentId = x.Id, }); redis.MergeAll(rattachuris, orattachuris, transaction); } else redis.RemoveAll(orattachuris, transaction); if (!contacts.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(contacts.Distinct())); var rcontacts = contacts.Select(x => new REL_EVENTS_CONTACTS { Id = keygenerator.GetNext(), EventId = entity.Id, ContactId = x.Id, }); redis.MergeAll(rcontacts, orcontacts, transaction); } else redis.RemoveAll(orcontacts, transaction); if (!comments.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(comments.Distinct())); var rcomments = comments.Select(x => new REL_EVENTS_COMMENTS { Id = keygenerator.GetNext(), EventId = entity.Id, CommentId = x.Id, }); redis.MergeAll(rcomments, orcomments, transaction); } else redis.RemoveAll(orcomments, transaction); if (!rdates.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(rdates.Distinct())); var rrdates = rdates.Select(x => new REL_EVENTS_RDATES { Id = keygenerator.GetNext(), EventId = entity.Id, RecurrenceDateId = x.Id, }); redis.MergeAll(rrdates, orrdates, transaction); } else redis.RemoveAll(orrdates, transaction); if (!exdates.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(exdates.Distinct())); var rexdates = exdates.Select(x => new REL_EVENTS_EXDATES { Id = keygenerator.GetNext(), EventId = entity.Id, ExceptionDateId = x.Id, }); redis.MergeAll(rexdates, orexdates, transaction); } else redis.RemoveAll(oraalarms, transaction); if (!relatedtos.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(relatedtos.Distinct())); var rrelatedtos = relatedtos.Select(x => new REL_EVENTS_RELATEDTOS { Id = keygenerator.GetNext(), EventId = entity.Id, RelatedToId = x.Id, }); redis.MergeAll(rrelatedtos, orrelatedtos, transaction); } else redis.RemoveAll(oraalarms, transaction); if (!resources.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(resources.Distinct())); var rresources = resources.Select(x => new REL_EVENTS_RESOURCES { Id = keygenerator.GetNext(), EventId = entity.Id, ResourcesId = x.Id, }); redis.MergeAll(rresources, orresources, transaction); } else redis.RemoveAll(oraalarms, transaction); if (!reqstats.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(reqstats.Distinct())); var rreqstats = reqstats.Select(x => new REL_EVENTS_REQSTATS { Id = keygenerator.GetNext(), EventId = entity.Id, ReqStatsId = x.Id, }); redis.MergeAll(rreqstats, orreqstats, transaction); } else redis.RemoveAll(orreqstats, transaction); if (!aalarms.NullOrEmpty()) { aalarmrepository.SaveAll(aalarms.Distinct()); var raalarms = aalarms.Select(x => new REL_EVENTS_AUDIO_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); redis.MergeAll(raalarms, oraalarms, transaction); } else redis.RemoveAll(oraalarms, transaction); if (!dalarms.NullOrEmpty()) { dalarmrepository.SaveAll(dalarms.Distinct()); var rdalarms = dalarms.Select(x => new REL_EVENTS_DISPLAY_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); redis.MergeAll(rdalarms, ordalarms, transaction); } else redis.RemoveAll(ordalarms, transaction); if (!ealarms.NullOrEmpty()) { ealarmrepository.SaveAll(ealarms.Distinct()); var realarms = ealarms.Select(x => new REL_EVENTS_EMAIL_ALARMS { Id = keygenerator.GetNext(), EventId = entity.Id, AlarmId = x.Id }); redis.MergeAll(realarms, orealarms, transaction); } else redis.RemoveAll(orealarms, transaction); transaction.QueueCommand(x => x.Store(Dehydrate(entity))); }); }
public void Patch(VEVENT source, IEnumerable<string> fields, IEnumerable<Guid> keys = null) { #region construct anonymous fields using expression lambdas var selection = fields as IList<string> ?? fields.ToList(); Expression<Func<VEVENT, object>> primitives = x => new { x.Uid, x.Start, x.Created, x.Description, Position = x.GeoPosition, x.LastModified, x.Location, x.Priority, x.Sequence, x.Status, x.Summary, x.Transparency, x.Url, x.End, x.Duration, x.Categories, x.RecurrenceId, }; Expression<Func<VEVENT, object>> relations = x => new { x.Organizer, x.RecurrenceRule, x.Attendees, x.Attachments, x.Contacts, x.Comments, x.RecurrenceDates, x.ExceptionDates, x.RelatedTos, x.Resources, x.RequestStatuses, x.Alarms }; //4. Get list of selected relationals var srelation = relations.GetMemberNames().Intersect(selection); //5. Get list of selected primitives var sprimitives = primitives.GetMemberNames().Intersect(selection); #endregion construct anonymous fields using expression lambdas var eclient = redis.As<VEVENT>(); if (!keys.NullOrEmpty()) redis.Watch(keys.Select(x => x.ToString()).ToArray()); var entities = !keys.NullOrEmpty() ? eclient.GetByIds(keys).ToList() : eclient.GetAll().ToList(); if (entities.NullOrEmpty()) return; var okeys = entities.Select(x => x.Id).ToArray(); if (!srelation.NullOrEmpty()) { Expression<Func<VEVENT, object>> orgexpr = x => x.Organizer; Expression<Func<VEVENT, object>> recurexpr = x => x.RecurrenceRule; Expression<Func<VEVENT, object>> attendsexpr = y => y.Attendees; Expression<Func<VEVENT, object>> attachsexpr = y => y.Attachments; Expression<Func<VEVENT, object>> contactsexpr = y => y.Contacts; Expression<Func<VEVENT, object>> commentsexpr = y => y.Comments; Expression<Func<VEVENT, object>> rdatesexpr = y => y.RecurrenceDates; Expression<Func<VEVENT, object>> exdatesexpr = y => y.ExceptionDates; Expression<Func<VEVENT, object>> relatedtosexpr = y => y.RelatedTos; Expression<Func<VEVENT, object>> resourcesexpr = y => y.Resources; Expression<Func<VEVENT, object>> reqstatsexpr = y => y.RequestStatuses; Expression<Func<VEVENT, object>> alarmexpr = y => y.Alarms; manager.ExecTrans(transaction => { #region save relational aggregate attributes of entities var ororgs = redis.As<REL_EVENTS_ORGANIZERS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orrecurs = redis.As<REL_EVENTS_RECURS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orattendees = redis.As<REL_EVENTS_ATTENDEES>().GetAll().Where(x => okeys.Contains(x.EventId)); var orattachbins = redis.As<REL_EVENTS_ATTACHBINS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orattachuris = redis.As<REL_EVENTS_ATTACHURIS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orcontacts = redis.As<REL_EVENTS_CONTACTS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orcomments = redis.As<REL_EVENTS_COMMENTS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orrdates = redis.As<REL_EVENTS_RDATES>().GetAll().Where(x => okeys.Contains(x.EventId)); var orexdates = redis.As<REL_EVENTS_EXDATES>().GetAll().Where(x => okeys.Contains(x.EventId)); var orrelatedtos = redis.As<REL_EVENTS_RELATEDTOS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orresources = redis.As<REL_EVENTS_RESOURCES>().GetAll().Where(x => okeys.Contains(x.EventId)); var orreqstats = redis.As<REL_EVENTS_REQSTATS>().GetAll().Where(x => okeys.Contains(x.EventId)); var oraalarms = redis.As<REL_EVENTS_AUDIO_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId)); var ordalarms = redis.As<REL_EVENTS_DISPLAY_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId)); var orealarms = redis.As<REL_EVENTS_EMAIL_ALARMS>().GetAll().Where(x => okeys.Contains(x.EventId)); if (selection.Contains(orgexpr.GetMemberName())) { if (source.Organizer != null) { var rorgs = okeys.Select(x => new REL_EVENTS_ORGANIZERS { Id = keygenerator.GetNext(), EventId = x, OrganizerId = source.Organizer.Id }); redis.MergeAll(rorgs, ororgs, transaction); transaction.QueueCommand(x => x.Store(source.Organizer)); } else redis.RemoveAll(ororgs, transaction); } if (selection.Contains(recurexpr.GetMemberName())) { if (source.RecurrenceRule != null) { var rrecurs = okeys.Select(x => new REL_EVENTS_RECURS { Id = keygenerator.GetNext(), EventId = x, RecurId = source.RecurrenceRule.Id }); redis.MergeAll(rrecurs, orrecurs, transaction); transaction.QueueCommand(x => x.Store(source.RecurrenceRule)); } else redis.RemoveAll(orrecurs, transaction); } if (selection.Contains(attendsexpr.GetMemberName())) { var attendees = source.Attendees; if (!attendees.NullOrEmpty()) { var rattendees = okeys.SelectMany(x => attendees.Select(y => new REL_EVENTS_ATTENDEES { Id = keygenerator.GetNext(), EventId = x, AttendeeId = y.Id })); redis.MergeAll(rattendees, orattendees, transaction); transaction.QueueCommand(x => x.StoreAll(attendees.Distinct())); } else redis.RemoveAll(orattendees, transaction); } if (selection.Contains(attachsexpr.GetMemberName())) { var attachbins = source.Attachments.OfType<ATTACH_BINARY>(); if (attachbins.Any()) { transaction.QueueCommand(x => x.StoreAll(attachbins)); var rattachbins = okeys.SelectMany(x => attachbins.Select(y => new REL_EVENTS_ATTACHBINS { Id = keygenerator.GetNext(), EventId = x, AttachmentId = y.Id })); redis.MergeAll(rattachbins, orattachbins, transaction); } else redis.RemoveAll(orattachbins, transaction); var attachuris = source.Attachments.OfType<ATTACH_URI>(); if (!attachuris.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(attachuris)); var rattachuris = okeys.SelectMany(x => attachuris.Select(y => new REL_EVENTS_ATTACHURIS { Id = keygenerator.GetNext(), EventId = x, AttachmentId = y.Id })); redis.MergeAll(rattachuris, orattachuris, transaction); } else redis.RemoveAll(orattachuris, transaction); } if (selection.Contains(contactsexpr.GetMemberName())) { var contacts = source.Contacts; if (!contacts.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(contacts.Distinct())); var rcontacts = okeys.SelectMany(x => contacts.Select(y => new REL_EVENTS_CONTACTS { Id = keygenerator.GetNext(), EventId = x, ContactId = y.Id })); redis.MergeAll(rcontacts, orcontacts, transaction); } else redis.RemoveAll(orcontacts, transaction); } if (selection.Contains(commentsexpr.GetMemberName())) { var comments = source.Contacts; if (!comments.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(comments.Distinct())); var rcomments = okeys.SelectMany(x => comments.Select(y => new REL_EVENTS_COMMENTS { Id = keygenerator.GetNext(), EventId = x, CommentId = y.Id })); redis.MergeAll(rcomments, orcomments, transaction); } else redis.RemoveAll(orcomments, transaction); } if (selection.Contains(rdatesexpr.GetMemberName())) { var rdates = source.Contacts; if (!rdates.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(rdates.Distinct())); var rrdates = okeys.SelectMany(x => rdates.Select(y => new REL_EVENTS_RDATES { Id = keygenerator.GetNext(), EventId = x, RecurrenceDateId = y.Id })); redis.MergeAll(rrdates, orrdates, transaction); } else redis.RemoveAll(orrdates, transaction); } if (selection.Contains(exdatesexpr.GetMemberName())) { var exdates = source.ExceptionDates; if (!exdates.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(exdates.Distinct())); var rexdates = okeys.SelectMany(x => exdates.Select(y => new REL_EVENTS_EXDATES { Id = keygenerator.GetNext(), EventId = x, ExceptionDateId = y.Id })); redis.MergeAll(rexdates, orexdates, transaction); } else redis.RemoveAll(orexdates, transaction); } if (selection.Contains(relatedtosexpr.GetMemberName())) { var relatedtos = source.RelatedTos; if (!relatedtos.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(relatedtos.Distinct())); var rrelatedtos = okeys.SelectMany(x => relatedtos.Select(y => new REL_EVENTS_RELATEDTOS { Id = keygenerator.GetNext(), EventId = x, RelatedToId = y.Id })); redis.MergeAll(rrelatedtos, orrelatedtos, transaction); } else redis.RemoveAll(orrelatedtos, transaction); } if (selection.Contains(resourcesexpr.GetMemberName())) { var resources = source.Resources; if (!resources.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(resources.Distinct())); var rresources = okeys.SelectMany(x => resources.Select(y => new REL_EVENTS_RESOURCES { Id = keygenerator.GetNext(), EventId = x, ResourcesId = y.Id })); redis.MergeAll(rresources, orresources, transaction); } else redis.RemoveAll(orresources, transaction); } if (selection.Contains(reqstatsexpr.GetMemberName())) { var reqstats = source.RequestStatuses; if (!reqstats.NullOrEmpty()) { transaction.QueueCommand(x => x.StoreAll(reqstats.Distinct())); var rreqstats = okeys.SelectMany(x => reqstats.Select(y => new REL_EVENTS_REQSTATS { Id = keygenerator.GetNext(), EventId = x, ReqStatsId = y.Id })); redis.MergeAll(rreqstats, orreqstats, transaction); } else redis.RemoveAll(orreqstats, transaction); } if (selection.Contains(alarmexpr.GetMemberName())) { var aalarms = source.Alarms.OfType<AUDIO_ALARM>(); if (aalarms.Any()) { aalarmrepository.SaveAll(aalarms); var raalarms = okeys.SelectMany(x => aalarms.Select(y => new REL_EVENTS_AUDIO_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); redis.MergeAll(raalarms, oraalarms, transaction); } else redis.RemoveAll(orealarms, transaction); var dalarms = source.Alarms.OfType<DISPLAY_ALARM>(); if (dalarms.Any()) { dalarmrepository.SaveAll(dalarms); var rdalarms = okeys.SelectMany(x => dalarms.Select(y => new REL_EVENTS_DISPLAY_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); redis.MergeAll(rdalarms, ordalarms, transaction); } else redis.RemoveAll(ordalarms, transaction); var ealarms = source.Alarms.OfType<EMAIL_ALARM>(); if (ealarms.Any()) { ealarmrepository.SaveAll(ealarms); var realarms = okeys.SelectMany(x => ealarms.Select(y => new REL_EVENTS_EMAIL_ALARMS { Id = keygenerator.GetNext(), EventId = x, AlarmId = y.Id })); redis.MergeAll(realarms, orealarms, transaction); } else redis.RemoveAll(orealarms, transaction); } #endregion save relational aggregate attributes of entities }); } #region save (insert or update non-relational attributes if (!sprimitives.NullOrEmpty()) { Expression<Func<VEVENT, object>> startexpr = x => x.Start; Expression<Func<VEVENT, object>> classexpr = x => x.Classification; Expression<Func<VEVENT, object>> descexpr = x => x.Description; Expression<Func<VEVENT, object>> posexpr = x => x.GeoPosition; Expression<Func<VEVENT, object>> locexpr = x => x.Location; Expression<Func<VEVENT, object>> priexpr = x => x.Priority; Expression<Func<VEVENT, object>> seqexpr = x => x.Sequence; Expression<Func<VEVENT, object>> statexpr = x => x.Status; Expression<Func<VEVENT, object>> summexpr = x => x.Summary; Expression<Func<VEVENT, object>> transpexpr = x => x.Transparency; Expression<Func<VEVENT, object>> urlexpr = x => x.Url; Expression<Func<VEVENT, object>> rridexpr = x => x.RecurrenceId; Expression<Func<VEVENT, object>> endexpr = x => x.End; Expression<Func<VEVENT, object>> durexpr = x => x.Duration; Expression<Func<VEVENT, object>> catexpr = x => x.Categories; entities.ForEach(x => { if (selection.Contains(startexpr.GetMemberName())) x.Start = source.Start; if (selection.Contains(classexpr.GetMemberName())) x.Classification = source.Classification; if (selection.Contains(descexpr.GetMemberName())) x.Description = source.Description; if (selection.Contains(posexpr.GetMemberName())) x.GeoPosition = source.GeoPosition; if (selection.Contains(locexpr.GetMemberName())) x.Location = source.Location; if (selection.Contains(priexpr.GetMemberName())) x.Priority = source.Priority; if (selection.Contains(seqexpr.GetMemberName())) x.Sequence = source.Sequence; if (selection.Contains(statexpr.GetMemberName())) x.Status = source.Status; if (selection.Contains(summexpr.GetMemberName())) x.Summary = source.Summary; if (selection.Contains(transpexpr.GetMemberName())) x.Transparency = source.Transparency; if (selection.Contains(urlexpr.GetMemberName())) x.Url = source.Url; if (selection.Contains(rridexpr.GetMemberName())) x.RecurrenceId = source.RecurrenceId; if (selection.Contains(endexpr.GetMemberName())) x.End = source.End; if (selection.Contains(durexpr.GetMemberName())) x.Duration = source.Duration; if (selection.Contains(catexpr.GetMemberName())) x.Categories = source.Categories; }); manager.ExecTrans(transaction => { transaction.QueueCommand(x => x.StoreAll(DehydrateAll(entities))); }); } #endregion save (insert or update non-relational attributes }
public static List<VEVENT> GetNextOccurences(this IList<VEVENT> vevents, IKeyGenerator<Guid> keyGenerator, uint window = 6) { if (vevents.NullOrEmpty()) return vevents.ToList(); var first = vevents.First(); var last = vevents.Last(); var copy = new VEVENT(first) { Start = last.Start, End = last.End }; return copy.GenerateOccurrences(keyGenerator, window); }
public static List<VEVENT> GenerateOccurrences(this VEVENT vevent, IKeyGenerator<Guid> keyGenerator, uint window = 6) { if (keyGenerator == null) throw new ArgumentNullException(nameof(keyGenerator)); var occurrences = new List<VEVENT> { vevent }; var dates = vevent.RecurrenceRule.GenerateRecurrences(vevent.Start, window).ToList(); if (vevent.RecurrenceDates.Any()) { var recurrentDates = vevent .RecurrenceDates .Where(x => x.DateTimes.Any()) .SelectMany(x => x.DateTimes); var recurrentPeriods = vevent .RecurrenceDates .Where(x => x.Periods.Any()) .SelectMany(x => x.Periods); var recurrentDatesList = recurrentDates as IList<DATE_TIME> ?? recurrentDates.ToList(); if (recurrentDatesList.Any()) { dates.AddRange(recurrentDatesList); } var recurrentPeriodsList = recurrentPeriods as IList<PERIOD> ?? recurrentPeriods.ToList(); if (recurrentPeriodsList.Any()) { dates.AddRange(recurrentPeriodsList.Select(x => x.Start)); } } if (vevent.ExceptionDates.Any()) { var exdates = vevent .ExceptionDates .Where(x => x.DateTimes.Any()) .SelectMany(x => x.DateTimes); var exceptionDatesList = exdates as IList<DATE_TIME> ?? exdates.ToList(); if (exceptionDatesList.Any()) dates = dates.Except(exceptionDatesList).ToList(); } foreach (var date in dates.Except(vevent.Start.ToSingleton())) { var now = DateTime.UtcNow.AsDATE_TIME(); var instance = new VEVENT(vevent) { Id = keyGenerator.GetNext(), Created = now, Datestamp = now, LastModified = now, Start = date, End = date + vevent.Duration, RecurrenceRule = null }; instance.RecurrenceId = new RECURRENCE_ID { Id = instance.Id, Range = RANGE.THISANDFUTURE, TimeZoneId = date.TimeZoneId, Value = instance.Start }; occurrences.Add(instance); } return occurrences; }