From b29623d751b5bf83191ab405d8a704a0dc8c5237 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Wed, 22 Jul 2020 17:14:34 -0700 Subject: [PATCH 1/7] Beginning of function to handle optional attendees --- .../java/com/google/sps/FindMeetingQuery.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index d8fcc66..cdd6afd 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -30,7 +30,9 @@ public Collection query(Collection events, MeetingRequest requ clearUnattendedEvents(eventsSortedByEnd, request.getAttendees()); - return findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); + Collection options = findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); + + return accommodateOptionalAttendees(options, events, request.getOptionalAttendees()); } private static Collection findAvailableTimeSlots( @@ -86,4 +88,15 @@ private static void clearUnattendedEvents( Collection events, Collection meetingAttendees) { events.removeIf(e -> Collections.disjoint(e.getAttendees(), meetingAttendees)); } + + private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, Collection optionalAttendees) { + if (optionalAttendees.isEmpty()) { + return currentOptions; + } + Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); + clearUnattendedEvents(eventsSortedByEnd, optionalAttendees); + Collection trimmedOptions = new ArrayList<>(); + // iteration goes here + return trimmedOptions; + } } From 681cb616823ea93ca5fa4d473f30720e96419978 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Thu, 23 Jul 2020 10:24:45 -0700 Subject: [PATCH 2/7] Added functionality to handle no mandatory attendees --- .../src/main/java/com/google/sps/FindMeetingQuery.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index cdd6afd..e134e56 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -32,7 +32,7 @@ public Collection query(Collection events, MeetingRequest requ Collection options = findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); - return accommodateOptionalAttendees(options, events, request.getOptionalAttendees()); + return accommodateOptionalAttendees(options, events, request); } private static Collection findAvailableTimeSlots( @@ -89,12 +89,18 @@ private static void clearUnattendedEvents( events.removeIf(e -> Collections.disjoint(e.getAttendees(), meetingAttendees)); } - private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, Collection optionalAttendees) { + private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, MeetingRequest request) { + Collection optionalAttendees = request.getOptionalAttendees(); if (optionalAttendees.isEmpty()) { return currentOptions; } + Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); clearUnattendedEvents(eventsSortedByEnd, optionalAttendees); + if (currentOptions.isEmpty()) { + return findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); + } + Collection trimmedOptions = new ArrayList<>(); // iteration goes here return trimmedOptions; From 4a3284ed96ae9b3f3185f7aa1b1bfee93eb7d887 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Thu, 23 Jul 2020 14:38:42 -0700 Subject: [PATCH 3/7] Accounted for when optional attendees are not attending any events --- .../main/java/com/google/sps/FindMeetingQuery.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index e134e56..87c2727 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -91,18 +91,21 @@ private static void clearUnattendedEvents( private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, MeetingRequest request) { Collection optionalAttendees = request.getOptionalAttendees(); - if (optionalAttendees.isEmpty()) { + Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); + clearUnattendedEvents(eventsSortedByEnd, optionalAttendees); + if (optionalAttendees.isEmpty() || eventsSortedByEnd.isEmpty()) { return currentOptions; } - Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); - clearUnattendedEvents(eventsSortedByEnd, optionalAttendees); if (currentOptions.isEmpty()) { return findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); } Collection trimmedOptions = new ArrayList<>(); - // iteration goes here + for (Iterator eventIter = eventsSortedByEnd.iterator(); eventIter.hasNext();) { + // iteration goes here + } + return trimmedOptions; } } From ff64e3c3bd05d297d5c572361ddc547afac00cb6 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Fri, 24 Jul 2020 10:09:03 -0700 Subject: [PATCH 4/7] Adjusted termination condition of for loop --- .../project/src/main/java/com/google/sps/FindMeetingQuery.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index 87c2727..fdd8357 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -102,8 +102,9 @@ private static Collection accommodateOptionalAttendees(Collection trimmedOptions = new ArrayList<>(); - for (Iterator eventIter = eventsSortedByEnd.iterator(); eventIter.hasNext();) { + for (Iterator eventIter = eventsSortedByEnd.iterator(), Iterator timeSlotIter = currentOptions.iterator(); eventIter.hasNext();) { // iteration goes here + Event event = eventIter.next(); } return trimmedOptions; From fea436f208b21ee6a1e39e2f213b6df26d461db5 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Fri, 24 Jul 2020 14:56:04 -0700 Subject: [PATCH 5/7] Iterated over events looking for time slots to trim --- .../java/com/google/sps/FindMeetingQuery.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index fdd8357..5e7b23d 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -91,6 +92,7 @@ private static void clearUnattendedEvents( private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, MeetingRequest request) { Collection optionalAttendees = request.getOptionalAttendees(); + long minDuration = request.getDuration(); Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); clearUnattendedEvents(eventsSortedByEnd, optionalAttendees); if (optionalAttendees.isEmpty() || eventsSortedByEnd.isEmpty()) { @@ -101,10 +103,29 @@ private static Collection accommodateOptionalAttendees(Collection trimmedOptions = new ArrayList<>(); - for (Iterator eventIter = eventsSortedByEnd.iterator(), Iterator timeSlotIter = currentOptions.iterator(); eventIter.hasNext();) { - // iteration goes here + Collection trimmedOptions = new HashSet<>(); + Iterator slotsIter = currentOptions.iterator(); + TimeRange currentSlot = slotsIter.next(); + Iterator eventIter = eventsSortedByEnd.iterator(); + while (eventIter.hasNext()) { Event event = eventIter.next(); + boolean useNextSlot = false; + if (currentSlot.overlaps(event.getWhen())) { + useNextSlot = slotsIter.hasNext(); + int newStartTime = currentSlot.start() < event.getWhen().start() ? currentSlot.start() : event.getWhen().end(); + int newEndTime = currentSlot.end() < event.getWhen().end() ? event.getWhen().start() : currentSlot.end(); + TimeRange possibleSlot = TimeRange.fromStartEnd(newStartTime, newEndTime, TimeRange.END_OF_DAY == newEndTime); + if (possibleSlot.duration() >= minDuration) { + trimmedOptions.add(possibleSlot); + } + } else if (currentSlot.end() < event.getWhen().start()) { + useNextSlot = slotsIter.hasNext(); + trimmedOptions.add(currentSlot); + } + + if (useNextSlot) { + currentSlot = slotsIter.next(); + } } return trimmedOptions; From d4777866e28c1b16a030445e1569de62909af451 Mon Sep 17 00:00:00 2001 From: Ihsan Olawale Date: Fri, 24 Jul 2020 15:13:28 -0700 Subject: [PATCH 6/7] Accounted for optional attendees not being available when mandatory attendees are --- .../main/java/com/google/sps/FindMeetingQuery.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index 5e7b23d..2c5f80d 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -112,11 +112,13 @@ private static Collection accommodateOptionalAttendees(Collection= minDuration) { - trimmedOptions.add(possibleSlot); + if (!event.getWhen().contains(currentSlot)) { + int newStartTime = currentSlot.start() < event.getWhen().start() ? currentSlot.start() : event.getWhen().end(); + int newEndTime = currentSlot.end() < event.getWhen().end() ? event.getWhen().start() : currentSlot.end(); + TimeRange possibleSlot = TimeRange.fromStartEnd(newStartTime, newEndTime, TimeRange.END_OF_DAY == newEndTime); + if (possibleSlot.duration() >= minDuration) { + trimmedOptions.add(possibleSlot); + } } } else if (currentSlot.end() < event.getWhen().start()) { useNextSlot = slotsIter.hasNext(); @@ -128,6 +130,6 @@ private static Collection accommodateOptionalAttendees(Collection Date: Fri, 24 Jul 2020 15:27:31 -0700 Subject: [PATCH 7/7] Formatted file with fix_java.sh --- .../java/com/google/sps/FindMeetingQuery.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index 2c5f80d..fee8ab9 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -31,7 +31,8 @@ public Collection query(Collection events, MeetingRequest requ clearUnattendedEvents(eventsSortedByEnd, request.getAttendees()); - Collection options = findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); + Collection options = + findAvailableTimeSlots(eventsSortedByEnd, request.getDuration()); return accommodateOptionalAttendees(options, events, request); } @@ -90,7 +91,8 @@ private static void clearUnattendedEvents( events.removeIf(e -> Collections.disjoint(e.getAttendees(), meetingAttendees)); } - private static Collection accommodateOptionalAttendees(Collection currentOptions, Collection events, MeetingRequest request) { + private static Collection accommodateOptionalAttendees( + Collection currentOptions, Collection events, MeetingRequest request) { Collection optionalAttendees = request.getOptionalAttendees(); long minDuration = request.getDuration(); Collection eventsSortedByEnd = sortEvents(events, TimeRange.ORDER_BY_END); @@ -111,22 +113,29 @@ private static Collection accommodateOptionalAttendees(Collection= minDuration) { - trimmedOptions.add(possibleSlot); - } - } + useNextSlot = slotsIter.hasNext(); + if (!event.getWhen().contains(currentSlot)) { + int newStartTime = + currentSlot.start() < event.getWhen().start() + ? currentSlot.start() + : event.getWhen().end(); + int newEndTime = + currentSlot.end() < event.getWhen().end() + ? event.getWhen().start() + : currentSlot.end(); + TimeRange possibleSlot = + TimeRange.fromStartEnd(newStartTime, newEndTime, TimeRange.END_OF_DAY == newEndTime); + if (possibleSlot.duration() >= minDuration) { + trimmedOptions.add(possibleSlot); + } + } } else if (currentSlot.end() < event.getWhen().start()) { - useNextSlot = slotsIter.hasNext(); - trimmedOptions.add(currentSlot); + useNextSlot = slotsIter.hasNext(); + trimmedOptions.add(currentSlot); } if (useNextSlot) { - currentSlot = slotsIter.next(); + currentSlot = slotsIter.next(); } }