From 2e19fee83c34b19c18cf321e66e361307c97a945 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 25 Dec 2020 13:28:52 -0600 Subject: [PATCH] Replace invalidateNewerThan by recompute; add newComputedEntries --- .../isoron/uhabits/widgets/TargetWidgetTest.java | 2 +- .../core/commands/CreateRepetitionCommand.java | 2 +- .../uhabits/core/commands/EditHabitCommand.java | 2 +- .../java/org/isoron/uhabits/core/models/Entries.kt | 6 +++--- .../org/isoron/uhabits/core/models/EntryList.java | 5 ++--- .../java/org/isoron/uhabits/core/models/Habit.kt | 14 ++++++++++---- .../org/isoron/uhabits/core/models/HabitList.java | 6 +++--- .../org/isoron/uhabits/core/models/ModelFactory.kt | 4 +++- .../org/isoron/uhabits/core/models/ScoreList.java | 9 +-------- .../org/isoron/uhabits/core/models/StreakList.java | 2 +- .../core/models/memory/MemoryModelFactory.kt | 1 + .../core/models/memory/MemoryScoreList.java | 2 +- .../core/models/memory/MemoryStreakList.java | 2 +- .../uhabits/core/models/sqlite/SQLModelFactory.kt | 1 + .../uhabits/core/models/sqlite/SQLiteEntries.kt | 2 +- .../screens/habits/show/ShowHabitMenuBehavior.kt | 2 +- .../org/isoron/uhabits/core/models/EntriesTest.kt | 6 +++--- .../org/isoron/uhabits/core/models/HabitTest.java | 12 ++++++------ .../isoron/uhabits/core/models/ScoreListTest.java | 8 ++++---- .../isoron/uhabits/core/models/StreakListTest.java | 4 ++-- 20 files changed, 47 insertions(+), 45 deletions(-) diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.java index feac2e4e5..76d07afee 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.java @@ -49,7 +49,7 @@ public class TargetWidgetTest extends BaseViewTest habit = fixtures.createLongNumericalHabit(); habit.setColor(new PaletteColor(11)); habit.setFrequency(Frequency.WEEKLY); - habit.invalidateNewerThan(Timestamp.ZERO); + habit.recompute(); TargetWidget widget = new TargetWidget(targetContext, 0, habit); view = convertToView(widget, 400, 400); } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java index ae1a2d0d2..37aad57eb 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java @@ -54,7 +54,7 @@ public class CreateRepetitionCommand implements Command { Entries checks = habit.getOriginalEntries(); checks.add(new Entry(timestamp, value)); - habit.invalidateNewerThan(Timestamp.ZERO); + habit.recompute(); habitList.resort(); } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java index 78eb4a28d..7bc8c8c75 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java @@ -83,7 +83,7 @@ public class EditHabitCommand implements Command habit.getObservable().notifyListeners(); if (hasFrequencyChanged || hasTargetChanged) - habit.invalidateNewerThan(Timestamp.ZERO); + habit.recompute(); } } \ No newline at end of file diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt index 2482293cd..a7bb2d6df 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Entries.kt @@ -113,13 +113,13 @@ open class Entries { * For boolean habits, this function creates additional entries (with value YES_AUTO) according * to the frequency of the habit. For numerical habits, this function simply copies all entries. */ - open fun computeFrom( - other: Entries, + open fun recomputeFrom( + originalEntries: Entries, frequency: Frequency, isNumerical: Boolean, ) { clear() - val original = other.getKnown() + val original = originalEntries.getKnown() if (isNumerical) { original.forEach { add(it) } } else { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java index 52b87bba6..38088f8a8 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java @@ -320,9 +320,8 @@ public class EntryList * than a given timestamp. These checkmarks will be recomputed at the next * time they are queried. * - * @param timestamp the timestamp */ - public void invalidateNewerThan(Timestamp timestamp) + public void recompute() { list.clear(); } @@ -364,7 +363,7 @@ public class EntryList Entry newest = getNewestComputed(); if (newest != null && newest.getTimestamp().equals(today)) return; - invalidateNewerThan(Timestamp.ZERO); + recompute(); List entries = habit.getOriginalEntries().getKnown(); if(entries.isEmpty()) return; diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt index 6ed11ee93..9abdc29e1 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.kt @@ -34,6 +34,7 @@ data class Habit( var unit: String = "", var uuid: String? = null, val computedEntries: EntryList, + val newComputedEntries: Entries, val originalEntries: Entries, val scores: ScoreList, val streaks: StreakList, @@ -50,10 +51,15 @@ data class Habit( fun isCompletedToday(): Boolean = computedEntries.isCompletedToday - fun invalidateNewerThan(timestamp: Timestamp?) { - scores.invalidateNewerThan(timestamp) - computedEntries.invalidateNewerThan(timestamp) - streaks.invalidateNewerThan(timestamp) + fun recompute() { + scores.recompute() + computedEntries.recompute() + streaks.recompute() + newComputedEntries.recomputeFrom( + originalEntries = originalEntries, + frequency = frequency, + isNumerical = isNumerical, + ) } fun copyFrom(other: Habit) { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java index 6f40657f1..008d454af 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java @@ -178,9 +178,9 @@ public abstract class HabitList implements Iterable { for (Habit h : this) { - h.getComputedEntries().invalidateNewerThan(Timestamp.ZERO); - h.getStreaks().invalidateNewerThan(Timestamp.ZERO); - h.getScores().invalidateNewerThan(Timestamp.ZERO); + h.getComputedEntries().recompute(); + h.getStreaks().recompute(); + h.getScores().recompute(); } } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt index 4c52dd8c6..aff942d46 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.kt @@ -36,13 +36,15 @@ interface ModelFactory { scores = scores, streaks = streaks, originalEntries = buildOriginalEntries(), + newComputedEntries = buildNewComputedEntries(), ) computedEntries.setHabit(habit) scores.setHabit(habit) streaks.setHabit(habit) + habit.recompute() return habit } - + fun buildNewComputedEntries(): Entries fun buildOriginalEntries(): Entries fun buildEntryList(): EntryList fun buildHabitList(): HabitList diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java index c187a81e7..02e32a813 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java @@ -131,14 +131,7 @@ public abstract class ScoreList implements Iterable return scores; } - /** - * Marks all scores that have timestamp equal to or newer than the given - * timestamp as invalid. Any following getValue calls will trigger the - * scores to be recomputed. - * - * @param timestamp the oldest timestamp that should be invalidated - */ - public abstract void invalidateNewerThan(Timestamp timestamp); + public abstract void recompute(); @Override public Iterator iterator() diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java index c614148de..fa8c4b741 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java @@ -62,7 +62,7 @@ public abstract class StreakList return observable; } - public abstract void invalidateNewerThan(Timestamp timestamp); + public abstract void recompute(); public synchronized void rebuild() { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt index 9940bfc69..bc6ca55f2 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.core.models.memory import org.isoron.uhabits.core.models.* class MemoryModelFactory : ModelFactory { + override fun buildNewComputedEntries() = Entries() override fun buildOriginalEntries() = Entries() override fun buildEntryList() = EntryList() override fun buildHabitList() = MemoryHabitList() diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java index d15c5792c..688c6399e 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java @@ -68,7 +68,7 @@ public class MemoryScoreList extends ScoreList } @Override - public void invalidateNewerThan(Timestamp timestamp) + public void recompute() { list.clear(); getObservable().notifyListeners(); diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java index e3a1fbe41..fc3dede25 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java @@ -42,7 +42,7 @@ public class MemoryStreakList extends StreakList } @Override - public void invalidateNewerThan(Timestamp timestamp) + public void recompute() { list.clear(); observable.notifyListeners(); diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt index bf6d817ce..7fc452083 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt @@ -34,6 +34,7 @@ class SQLModelFactory val database: Database, ) : ModelFactory { override fun buildOriginalEntries() = SQLiteEntries(database) + override fun buildNewComputedEntries() = Entries() override fun buildEntryList() = EntryList() override fun buildHabitList() = SQLiteHabitList(this) override fun buildScoreList() = MemoryScoreList() diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntries.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntries.kt index 91d510798..e1d8623b0 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntries.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteEntries.kt @@ -76,7 +76,7 @@ class SQLiteEntries(database: Database) : Entries() { return super.groupBy(field, firstWeekday, isNumerical) } - override fun computeFrom(other: Entries, frequency: Frequency, isNumerical: Boolean) { + override fun recomputeFrom(originalEntries: Entries, frequency: Frequency, isNumerical: Boolean) { throw UnsupportedOperationException() } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.kt b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.kt index 61eb92997..c6669cbae 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.kt +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.kt @@ -67,7 +67,7 @@ class ShowHabitMenuBehavior( if (habit.isNumerical) value = (1000 + 250 * random.nextGaussian() * strength / 100).toInt() * 1000 habit.originalEntries.add(Entry(DateUtils.getToday().minus(i), value)) } - habit.invalidateNewerThan(Timestamp.ZERO) + habit.recompute() screen.refresh() } diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt index ad78abeb1..aa17a8f89 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/EntriesTest.kt @@ -95,7 +95,7 @@ class EntriesTest { original.add(Entry(today.minus(10), YES_MANUAL)) val computed = Entries() - computed.computeFrom(original, Frequency(1, 3), isNumerical = false) + computed.recomputeFrom(original, Frequency(1, 3), isNumerical = false) val expected = listOf( Entry(today.minus(2), YES_AUTO), @@ -111,7 +111,7 @@ class EntriesTest { assertEquals(expected, computed.getKnown()) // Second call should replace all previously added entries - computed.computeFrom(Entries(), Frequency(1, 3), isNumerical = false) + computed.recomputeFrom(Entries(), Frequency(1, 3), isNumerical = false) assertEquals(listOf(), computed.getKnown()) } @@ -126,7 +126,7 @@ class EntriesTest { original.add(Entry(today.minus(10), 300)) val computed = Entries() - computed.computeFrom(original, Frequency.DAILY, isNumerical = true) + computed.recomputeFrom(original, Frequency.DAILY, isNumerical = true) val expected = listOf( Entry(today.minus(4), 100), diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java index d23d3271e..dae05ea76 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java @@ -87,28 +87,28 @@ public class HabitTest extends BaseUnitTest assertFalse(h.isCompletedToday()); h.getOriginalEntries().add(new Entry(getToday(), 200_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertTrue(h.isCompletedToday()); h.getOriginalEntries().add(new Entry(getToday(), 100_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertTrue(h.isCompletedToday()); h.getOriginalEntries().add(new Entry(getToday(), 50_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertFalse(h.isCompletedToday()); h.setTargetType(Habit.AT_MOST); h.getOriginalEntries().add(new Entry(getToday(), 200_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertFalse(h.isCompletedToday()); h.getOriginalEntries().add(new Entry(getToday(), 100_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertTrue(h.isCompletedToday()); h.getOriginalEntries().add(new Entry(getToday(), 50_000)); - h.invalidateNewerThan(Timestamp.ZERO); + h.recompute(); assertTrue(h.isCompletedToday()); } diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java index 95ea99fbe..6fe259b7c 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java @@ -219,7 +219,7 @@ public class ScoreListTest extends BaseUnitTest // Missing 2 repetitions out of 4 per week, the score should converge to 50% habit.setFrequency(new Frequency(4, 7)); - habit.invalidateNewerThan(Timestamp.ZERO); + habit.recompute(); assertThat(habit.getScores().getTodayValue(), closeTo(0.5, E)); } @@ -289,7 +289,7 @@ public class ScoreListTest extends BaseUnitTest } @Test - public void test_invalidateNewerThan() + public void test_recompute() { assertThat(habit.getScores().getTodayValue(), closeTo(0.0, E)); @@ -297,7 +297,7 @@ public class ScoreListTest extends BaseUnitTest assertThat(habit.getScores().getTodayValue(), closeTo(0.101149, E)); habit.setFrequency(new Frequency(1, 2)); - habit.getScores().invalidateNewerThan(new Timestamp(0)); + habit.getScores().recompute(); assertThat(habit.getScores().getTodayValue(), closeTo(0.054816, E)); } @@ -339,7 +339,7 @@ public class ScoreListTest extends BaseUnitTest for (int i = from; i < to; i++) entries.add(new Entry(today.minus(i), YES_MANUAL)); - habit.invalidateNewerThan(Timestamp.ZERO); + habit.recompute(); } private void check(ArrayList values) diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java index d970419c6..5ffb8afd2 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java @@ -69,7 +69,7 @@ public class StreakListTest extends BaseUnitTest public void testFindBeginning_withLongHistory() { streaks.rebuild(); - streaks.invalidateNewerThan(new Timestamp(0)); + streaks.recompute(); assertThat(streaks.findBeginning(), equalTo(today.minus(120))); } @@ -111,7 +111,7 @@ public class StreakListTest extends BaseUnitTest Streak s = streaks.getNewestComputed(); assertThat(s.getEnd(), equalTo(today)); - streaks.invalidateNewerThan(today.minus(8)); + streaks.recompute(); verify(listener).onModelChange(); s = streaks.getNewestComputed();