Skip to content

Commit b164848

Browse files
committed
refactor: update calculation of next dates to parse date only one time
Performance upgrade. Part of #22.
1 parent 6add9d0 commit b164848

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

src/main/java/com/flowingcode/vaadin/addons/cronexpressionfield/CronExpressionField.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.List;
3232
import java.util.Locale;
3333
import java.util.Map;
34+
import java.util.Objects;
3435
import java.util.Set;
3536
import java.util.stream.Stream;
3637
import com.flowingcode.vaadin.addons.dayofweekselector.DayOfWeekSelector;
@@ -52,17 +53,14 @@
5253
import com.vaadin.flow.component.textfield.IntegerField;
5354
import com.vaadin.flow.component.textfield.TextField;
5455
import com.vaadin.flow.component.timepicker.TimePicker;
55-
import com.vaadin.flow.data.provider.DataProvider;
5656
import com.vaadin.flow.function.SerializableConsumer;
5757
import com.vaadin.flow.internal.JsonSerializer;
58-
5958
import elemental.json.JsonObject;
6059
import org.springframework.scheduling.support.CronExpression;
6160
import it.burning.cron.CronExpressionDescriptor;
6261
import it.burning.cron.CronExpressionParser.CronExpressionParseException;
6362
import it.burning.cron.CronExpressionParser.Options;
6463

65-
6664
/**
6765
* UI component for building cron expressions.
6866
*
@@ -445,13 +443,14 @@ private void showNextDates() {
445443
}
446444
}
447445

448-
private LocalDateTime calculateNextDate(LocalDateTime date) {
449-
return CronExpression.parse(inputExpressionTf.getValue()).next(date);
450-
}
451-
452446
private Stream<LocalDateTime> generateNextDate(LocalDateTime start, int offset, int limit) {
453-
Stream<LocalDateTime> nextDates = Stream.iterate(calculateNextDate(start), this::calculateNextDate);
454-
return nextDates.skip(offset).limit(limit);
447+
CronExpression parsedExpression = CronExpression.parse(inputExpressionTf.getValue());
448+
LocalDateTime firstNext = parsedExpression.next(start);
449+
if (firstNext == null) {
450+
return Stream.empty();
451+
}
452+
return Stream.iterate(firstNext, Objects::nonNull, parsedExpression::next).skip(offset)
453+
.limit(limit);
455454
}
456455

457456
private String formatDate(LocalDateTime date) {

0 commit comments

Comments
 (0)