Remove MemoryEntryList

pull/699/head
Alinson S. Xavier 5 years ago
parent cfeef3651f
commit 7fcad7b5c5

@ -31,19 +31,22 @@ import java.util.*;
import javax.annotation.concurrent.*; import javax.annotation.concurrent.*;
import static org.isoron.uhabits.core.models.Entry.*; import static org.isoron.uhabits.core.models.Entry.*;
import static org.isoron.uhabits.core.utils.StringUtils.defaultToStringStyle; import static org.isoron.uhabits.core.utils.StringUtils.*;
/** /**
* The collection of {@link Entry}s belonging to a habit. * The collection of {@link Entry}s belonging to a habit.
*/ */
@ThreadSafe @ThreadSafe
public abstract class EntryList public class EntryList
{ {
protected final Habit habit; protected final Habit habit;
protected ArrayList<Entry> list;
public EntryList(Habit habit) public EntryList(Habit habit)
{ {
this.habit = habit; this.habit = habit;
this.list = new ArrayList<>();
} }
@NonNull @NonNull
@ -145,13 +148,19 @@ public abstract class EntryList
{ {
int shift = Math.min(gapCenterToEnd, gapNextToCurrent + 1); int shift = Math.min(gapCenterToEnd, gapNextToCurrent + 1);
intervals.set(i, new Interval(curr.begin.minus(shift), intervals.set(i, new Interval(curr.begin.minus(shift),
curr.center, curr.center,
curr.end.minus(shift))); curr.end.minus(shift)));
} }
} }
} }
public abstract void add(List<Entry> entries); public void add(List<Entry> entries)
{
list.addAll(entries);
Collections.sort(list,
(c1, c2) -> c2.getTimestamp().compare(c1.getTimestamp()));
}
/** /**
* Returns the values for all the checkmarks, since the oldest repetition of * Returns the values for all the checkmarks, since the oldest repetition of
@ -185,13 +194,39 @@ public abstract class EntryList
* That is, the first checkmark corresponds to the newest timestamp, and the * That is, the first checkmark corresponds to the newest timestamp, and the
* last checkmark corresponds to the oldest timestamp. * last checkmark corresponds to the oldest timestamp.
* *
* @param fromTimestamp timestamp of the beginning of the interval. * @param from timestamp of the beginning of the interval.
* @param toTimestamp timestamp of the end of the interval. * @param to timestamp of the end of the interval.
* @return the list of checkmarks within the interval. * @return the list of checkmarks within the interval.
*/ */
@NonNull @NonNull
public abstract List<Entry> getByInterval(Timestamp fromTimestamp, public List<Entry> getByInterval(Timestamp from,
Timestamp toTimestamp); Timestamp to)
{
compute();
Timestamp newestComputed = new Timestamp(0);
Timestamp oldestComputed = new Timestamp(0).plus(1000000);
Entry newest = getNewestComputed();
Entry oldest = getOldestComputed();
if (newest != null) newestComputed = newest.getTimestamp();
if (oldest != null) oldestComputed = oldest.getTimestamp();
List<Entry> filtered = new ArrayList<>(
Math.max(0, oldestComputed.daysUntil(newestComputed) + 1));
for (int i = 0; i <= from.daysUntil(to); i++)
{
Timestamp t = to.minus(i);
if (t.isNewerThan(newestComputed) || t.isOlderThan(oldestComputed))
filtered.add(new Entry(t, Entry.UNKNOWN));
else
filtered.add(list.get(t.daysUntil(newestComputed)));
}
return filtered;
}
/** /**
* Returns the checkmark for today. * Returns the checkmark for today.
@ -281,7 +316,10 @@ public abstract class EntryList
* *
* @param timestamp the timestamp * @param timestamp the timestamp
*/ */
public abstract void invalidateNewerThan(Timestamp timestamp); public void invalidateNewerThan(Timestamp timestamp)
{
list.clear();
}
/** /**
* Writes the entire list of checkmarks to the given writer, in CSV format. * Writes the entire list of checkmarks to the given writer, in CSV format.
@ -329,29 +367,27 @@ public abstract class EntryList
if (from.isNewerThan(today)) return; if (from.isNewerThan(today)) return;
Entry reps[] = habit Entry reps[] = habit
.getOriginalEntries() .getOriginalEntries()
.getByInterval(from, today) .getByInterval(from, today)
.toArray(new Entry[0]); .toArray(new Entry[0]);
if (habit.isNumerical()) computeNumerical(reps); if (habit.isNumerical()) computeNumerical(reps);
else computeYesNo(reps); else computeYesNo(reps);
} }
/**
* Returns newest checkmark that has already been computed.
*
* @return newest checkmark already computed
*/
@Nullable @Nullable
protected abstract Entry getNewestComputed(); protected Entry getNewestComputed()
{
if (list.isEmpty()) return null;
return list.get(0);
}
/**
* Returns oldest checkmark that has already been computed.
*
* @return oldest checkmark already computed
*/
@Nullable @Nullable
protected abstract Entry getOldestComputed(); protected Entry getOldestComputed()
{
if (list.isEmpty()) return null;
return list.get(list.size() - 1);
}
private void computeNumerical(Entry[] original) private void computeNumerical(Entry[] original)
{ {
@ -382,9 +418,10 @@ public abstract class EntryList
add(buildEntriesFromInterval(original, intervals)); add(buildEntriesFromInterval(original, intervals));
} }
public List<Entry> getAll() { public List<Entry> getAll()
{
Entry oldest = habit.getOriginalEntries().getOldest(); Entry oldest = habit.getOriginalEntries().getOldest();
if(oldest == null) return new ArrayList<>(); if (oldest == null) return new ArrayList<>();
return getByInterval(oldest.getTimestamp(), DateUtils.getTodayWithOffset()); return getByInterval(oldest.getTimestamp(), DateUtils.getTodayWithOffset());
} }
@ -403,7 +440,8 @@ public abstract class EntryList
this.end = end; this.end = end;
} }
public int length() { public int length()
{
return begin.daysUntil(end) + 1; return begin.daysUntil(end) + 1;
} }
@ -417,30 +455,30 @@ public abstract class EntryList
Interval interval = (Interval) o; Interval interval = (Interval) o;
return new EqualsBuilder() return new EqualsBuilder()
.append(begin, interval.begin) .append(begin, interval.begin)
.append(center, interval.center) .append(center, interval.center)
.append(end, interval.end) .append(end, interval.end)
.isEquals(); .isEquals();
} }
@Override @Override
public int hashCode() public int hashCode()
{ {
return new HashCodeBuilder(17, 37) return new HashCodeBuilder(17, 37)
.append(begin) .append(begin)
.append(center) .append(center)
.append(end) .append(end)
.toHashCode(); .toHashCode();
} }
@Override @Override
public String toString() public String toString()
{ {
return new ToStringBuilder(this, defaultToStringStyle()) return new ToStringBuilder(this, defaultToStringStyle())
.append("begin", begin) .append("begin", begin)
.append("center", center) .append("center", center)
.append("end", end) .append("end", end)
.toString(); .toString();
} }
} }
@ -471,9 +509,9 @@ public abstract class EntryList
truncatedTimestamps[count++] = tt; truncatedTimestamps[count++] = tt;
} }
if(habit.isNumerical()) if (habit.isNumerical())
values[count - 1] += rep.getValue(); values[count - 1] += rep.getValue();
else if(rep.getValue() == Entry.YES_MANUAL) else if (rep.getValue() == Entry.YES_MANUAL)
values[count - 1] += 1000; values[count - 1] += 1000;
} }

@ -1,101 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.models.memory;
import androidx.annotation.*;
import org.isoron.uhabits.core.models.*;
import java.util.*;
/**
* In-memory implementation of {@link EntryList}.
*/
public class MemoryEntryList extends EntryList
{
ArrayList<Entry> list;
public MemoryEntryList(Habit habit)
{
super(habit);
list = new ArrayList<>();
}
@Override
public void add(List<Entry> entries)
{
list.addAll(entries);
Collections.sort(list,
(c1, c2) -> c2.getTimestamp().compare(c1.getTimestamp()));
}
@NonNull
@Override
public synchronized List<Entry> getByInterval(Timestamp from,
Timestamp to)
{
compute();
Timestamp newestComputed = new Timestamp(0);
Timestamp oldestComputed = new Timestamp(0).plus(1000000);
Entry newest = getNewestComputed();
Entry oldest = getOldestComputed();
if(newest != null) newestComputed = newest.getTimestamp();
if(oldest != null) oldestComputed = oldest.getTimestamp();
List<Entry> filtered = new ArrayList<>(
Math.max(0, oldestComputed.daysUntil(newestComputed) + 1));
for(int i = 0; i <= from.daysUntil(to); i++)
{
Timestamp t = to.minus(i);
if(t.isNewerThan(newestComputed) || t.isOlderThan(oldestComputed))
filtered.add(new Entry(t, Entry.UNKNOWN));
else
filtered.add(list.get(t.daysUntil(newestComputed)));
}
return filtered;
}
@Override
public void invalidateNewerThan(Timestamp timestamp)
{
list.clear();
}
@Override
@Nullable
protected Entry getOldestComputed()
{
if(list.isEmpty()) return null;
return list.get(list.size()-1);
}
@Override
@Nullable
protected Entry getNewestComputed()
{
if(list.isEmpty()) return null;
return list.get(0);
}
}

@ -28,7 +28,7 @@ public class MemoryModelFactory implements ModelFactory
@Override @Override
public EntryList buildEntryList(Habit habit) public EntryList buildEntryList(Habit habit)
{ {
return new MemoryEntryList(habit); return new EntryList(habit);
} }
@Override @Override

@ -44,7 +44,7 @@ public class SQLModelFactory implements ModelFactory
@Override @Override
public EntryList buildEntryList(Habit habit) public EntryList buildEntryList(Habit habit)
{ {
return new MemoryEntryList(habit); return new EntryList(habit);
} }
@Override @Override

Loading…
Cancel
Save