Filters(Configuration config) { Date dateToStartKeepingOneSnapshotByDay = getDateFromHours(config, PurgeConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY); Date dateToStartKeepingOneSnapshotByWeek = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK); Date dateToStartKeepingOneSnapshotByMonth = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH); Date dateToStartKeepingOnlyAnalysisWithVersion = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ANALYSES_WITH_VERSION); Date dateToStartDeletingAllSnapshots = getDateFromWeeks(config, PurgeConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS); all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByWeek, dateToStartKeepingOneSnapshotByDay, Calendar.DAY_OF_YEAR, "day")); all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByMonth, dateToStartKeepingOneSnapshotByWeek, Calendar.WEEK_OF_YEAR, "week")); all.add(new KeepOneFilter(dateToStartDeletingAllSnapshots, dateToStartKeepingOneSnapshotByMonth, Calendar.MONTH, "month")); all.add(new KeepWithVersionFilter(dateToStartKeepingOnlyAnalysisWithVersion)); all.add(new DeleteAllFilter(dateToStartDeletingAllSnapshots)); }
private static void appendSnapshotsToDelete(Interval interval, List<PurgeableAnalysisDto> toDelete) { if (interval.count() > 1) { List<PurgeableAnalysisDto> deletables = Lists.newArrayList(); List<PurgeableAnalysisDto> toKeep = Lists.newArrayList(); for (PurgeableAnalysisDto snapshot : interval.get()) { if (isDeletable(snapshot)) { deletables.add(snapshot); } else { toKeep.add(snapshot); } } if (!toKeep.isEmpty()) { toDelete.addAll(deletables); } else if (deletables.size() > 1) { // keep last snapshot toDelete.addAll(deletables.subList(0, deletables.size() - 1)); } } }
@Override public List<PurgeableAnalysisDto> filter(List<PurgeableAnalysisDto> history) { List<Interval> intervals = Interval.group(history, start, end, dateField); List<PurgeableAnalysisDto> result = Lists.newArrayList(); for (Interval interval : intervals) { appendSnapshotsToDelete(interval, result); } return result; }
@Test public void shouldKeepNonDeletableSnapshots() { Filter filter = new KeepOneFilter(DateUtils.parseDate("2011-03-25"), DateUtils.parseDate("2011-08-25"), Calendar.MONTH, "month"); List<PurgeableAnalysisDto> toDelete = filter.filter(Arrays.asList( DbCleanerTestUtils.createAnalysisWithDate("u1", "2011-05-01"), // to be deleted DbCleanerTestUtils.createAnalysisWithDate("u2", "2011-05-02").setLast(true), DbCleanerTestUtils.createAnalysisWithDate("u3", "2011-05-19").setHasEvents(true).setLast(false), DbCleanerTestUtils.createAnalysisWithDate("u4", "2011-05-23") // to be deleted )); assertThat(toDelete).hasSize(2); assertThat(analysisUuids(toDelete)).contains("u1", "u4"); }
@Test public void test_isDeletable() { assertThat(KeepOneFilter.isDeletable(DbCleanerTestUtils.createAnalysisWithDate("u1", "2011-05-01"))).isTrue(); assertThat(KeepOneFilter.isDeletable(DbCleanerTestUtils.createAnalysisWithDate("u1", "2011-05-01").setLast(true))).isFalse(); assertThat(KeepOneFilter.isDeletable(DbCleanerTestUtils.createAnalysisWithDate("u1", "2011-05-01").setHasEvents(true))).isFalse(); }
@Override public List<PurgeableAnalysisDto> filter(List<PurgeableAnalysisDto> history) { List<Interval> intervals = Interval.group(history, start, end, dateField); List<PurgeableAnalysisDto> result = Lists.newArrayList(); for (Interval interval : intervals) { appendSnapshotsToDelete(interval, result); } return result; }
@Test public void shouldOnlyOneSnapshotPerInterval() { Filter filter = new KeepOneFilter(DateUtils.parseDate("2011-03-25"), DateUtils.parseDate("2011-08-25"), Calendar.MONTH, "month"); List<PurgeableAnalysisDto> toDelete = filter.filter(Arrays.asList( DbCleanerTestUtils.createAnalysisWithDate("u1", "2010-01-01"), // out of scope -> keep DbCleanerTestUtils.createAnalysisWithDate("u2", "2011-05-01"), // may -> keep DbCleanerTestUtils.createAnalysisWithDate("u3", "2011-05-02"), // may -> to be deleted DbCleanerTestUtils.createAnalysisWithDate("u4", "2011-05-19"), // may -> to be deleted DbCleanerTestUtils.createAnalysisWithDate("u5", "2011-06-01"), // june -> keep DbCleanerTestUtils.createAnalysisWithDate("u6", "2012-01-01") // out of scope -> keep )); assertThat(toDelete).hasSize(2); assertThat(analysisUuids(toDelete)).containsOnly("u2", "u3"); }
private void appendSnapshotsToDelete(Interval interval, List<PurgeableAnalysisDto> toDelete) { if (interval.count() > 1) { List<PurgeableAnalysisDto> deletables = Lists.newArrayList(); List<PurgeableAnalysisDto> toKeep = Lists.newArrayList(); for (PurgeableAnalysisDto snapshot : interval.get()) { if (isDeletable(snapshot)) { deletables.add(snapshot); } else { toKeep.add(snapshot); } } if (!toKeep.isEmpty()) { toDelete.addAll(deletables); } else if (deletables.size() > 1) { // keep last snapshot toDelete.addAll(deletables.subList(0, deletables.size() - 1)); } } }
Filters(Settings settings) { Date dateToStartKeepingOneSnapshotByDay = getDateFromHours(settings, PurgeConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY); Date dateToStartKeepingOneSnapshotByWeek = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK); Date dateToStartKeepingOneSnapshotByMonth = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH); Date dateToStartDeletingAllSnapshots = getDateFromWeeks(settings, PurgeConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS); all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByWeek, dateToStartKeepingOneSnapshotByDay, Calendar.DAY_OF_YEAR, "day")); all.add(new KeepOneFilter(dateToStartKeepingOneSnapshotByMonth, dateToStartKeepingOneSnapshotByWeek, Calendar.WEEK_OF_YEAR, "week")); all.add(new KeepOneFilter(dateToStartDeletingAllSnapshots, dateToStartKeepingOneSnapshotByMonth, Calendar.MONTH, "month")); all.add(new DeleteAllFilter(dateToStartDeletingAllSnapshots)); }